Hierodule 1.6.2
Utility module set for STM32 MCUs
Loading...
Searching...
No Matches
hierodule_i2c.c
Go to the documentation of this file.
1
12#include <hierodule_i2c.h>
13
28
33#if ( (defined __STM32F103xB_H) || (defined __STM32F401xC_H) )
35
37#endif
43#ifdef __STM32F401xC_H
46#endif
55void Idle(HIERODULE_I2C_Wrapper *Wrapper, uint32_t NumberOfPeriods)
56{
57 for(uint32_t i = 0 ; i < Wrapper->I2C_Period_Length*NumberOfPeriods ; i++)
58 {
59 __NOP();
60 }
61}
62
69{
71 #ifdef __STM32F030x6_H
72 CLEAR_BIT(Wrapper->_I2C->CR1, I2C_CR1_PE);
73 while( 1 == (READ_BIT(Wrapper->_I2C->CR1, I2C_CR1_PE) == (I2C_CR1_PE)) );
75 #endif
77 CLEAR_BIT(Wrapper->_I2C->CR1, I2C_CR1_NOSTRETCH);
78
79 while( 0 == (READ_BIT(Wrapper->_I2C->CR1, I2C_CR1_NOSTRETCH) != (I2C_CR1_NOSTRETCH)) );
80
82 #ifdef __STM32F030x6_H
83 SET_BIT(Wrapper->_I2C->CR1, I2C_CR1_PE);
84 while( 0 == (READ_BIT(Wrapper->_I2C->CR1, I2C_CR1_PE) == (I2C_CR1_PE)) );
86 #endif
87}
88
95{
97 #ifdef __STM32F030x6_H
98 CLEAR_BIT(Wrapper->_I2C->CR1, I2C_CR1_PE);
99 while( 1 == (READ_BIT(Wrapper->_I2C->CR1, I2C_CR1_PE) == (I2C_CR1_PE)) );
101 #endif
103 SET_BIT(Wrapper->_I2C->CR1, I2C_CR1_NOSTRETCH);
104
105 while( 1 == (READ_BIT(Wrapper->_I2C->CR1, I2C_CR1_NOSTRETCH) != (I2C_CR1_NOSTRETCH)) );
106
108 #ifdef __STM32F030x6_H
109 SET_BIT(Wrapper->_I2C->CR1, I2C_CR1_PE);
110 while( 0 == (READ_BIT(Wrapper->_I2C->CR1, I2C_CR1_PE) == (I2C_CR1_PE)) );
112 #endif
113}
114
123{
125 #ifdef __STM32F030x6_H
126 return (uint8_t)(READ_BIT(Wrapper->_I2C->RXDR, I2C_RXDR_RXDATA));
128 #else
129 return (uint8_t)(READ_BIT(Wrapper->_I2C->DR, I2C_DR_DR));
131 #endif
132}
133
141{
143 #ifdef __STM32F030x6_H
144 WRITE_REG(Wrapper->_I2C->TXDR, Byte);
146 #else
147 MODIFY_REG(Wrapper->_I2C->DR, I2C_DR_DR, Byte);
149 #endif
150}
151
158{
160 #ifndef __STM32F030x6_H
161 MODIFY_REG(Wrapper->_I2C->CR1, I2C_CR1_ACK, I2C_CR1_ACK);
163 #else
164 MODIFY_REG(Wrapper->_I2C->CR2, I2C_CR2_NACK, 0);
166 #endif
167}
168
175{
177 #ifndef __STM32F030x6_H
178 MODIFY_REG(Wrapper->_I2C->CR1, I2C_CR1_ACK, 0);
180 #else
181 MODIFY_REG(Wrapper->_I2C->CR2, I2C_CR2_NACK, I2C_CR2_NACK);
183 #endif
184}
185
192{
194 #ifndef __STM32F030x6_H
195 SET_BIT(Wrapper->_I2C->CR1, I2C_CR1_START);
197 #else
198 SET_BIT(Wrapper->_I2C->CR2, I2C_CR2_START);
200 #endif
201}
202
209{
211 #ifndef __STM32F030x6_H
212 SET_BIT(Wrapper->_I2C->CR1, I2C_CR1_STOP);
214 #else
215 SET_BIT(Wrapper->_I2C->CR2, I2C_CR2_STOP);
217 #endif
218}
219
230{
231 (Wrapper->MRX_Buffer)[Wrapper->MRX_Counter] =
233
234 Wrapper->MRX_Counter++;
235 if(Wrapper->MRX_Counter == Wrapper->MRX_BufferSize)
236 {
238 Wrapper->SlaveAddress = 0;
239
240 Stop(Wrapper);
241
243 #ifndef __STM32F030x6_H
246 #endif
249
250 if( Wrapper->MRX_Handler != NULL)
251 Wrapper->MRX_Handler();
252 }
253 else if(Wrapper->MRX_Counter == Wrapper->MRX_BufferSize-1)
254 {
256 __NOP();
257 }
258}
259
267{
268 Wrapper->SRX_Buffer[Wrapper->SRX_Index] =
270
271 Wrapper->SRX_Index++;
272 Wrapper->SRX_Index %= Wrapper->SRX_BufferSize;
273
274 if( Wrapper->SRX_New < Wrapper->SRX_BufferSize )
275 Wrapper->SRX_New++;
276}
277
285{
286 TransmitData(Wrapper, (Wrapper->MTX_Buffer)[Wrapper->MTX_Counter]);
287 Wrapper->MTX_Counter++;
288 if( Wrapper->MTX_Counter == Wrapper->MTX_BufferSize )
289 {
291 #ifndef __STM32F030x6_H
292 while(READ_BIT(Wrapper->_I2C->SR1, I2C_SR1_TXE) != (I2C_SR1_TXE))
294 #else
295 while(READ_BIT(Wrapper->_I2C->ISR, I2C_ISR_TC) != (I2C_ISR_TC));
297 #endif
299 Wrapper->SlaveAddress = 0;
300 Stop(Wrapper);
302 #ifdef __STM32F030x6_H
303 while( 0 == READ_BIT(Wrapper->_I2C->ISR, I2C_ISR_STOPF) );
305 #endif
307 if( Wrapper->MTX_Handler != NULL)
308 Wrapper->MTX_Handler();
309 }
310}
311
319{
320 if( Wrapper->STX_Buffer != NULL )
321 TransmitData(Wrapper, (Wrapper->STX_Buffer)[(Wrapper->STX_Counter)++]);
322 else
324
325 Idle(Wrapper, 1);
326}
327
335{
337 #ifdef __STM32F030x6_H
338 SET_BIT(Wrapper->_I2C->ICR, I2C_ICR_STOPCF);
340 #else
341 SET_BIT(Wrapper->_I2C->CR1, I2C_CR1_PE);
343 #endif
344 if( Wrapper->SRX_Handler != NULL)
345 Wrapper->SRX_Handler();
347}
348
356{
357 if(Wrapper->Status == HIERODULE_I2C_Status_STX )
358 {
360 #ifdef __STM32F030x6_H
361 SET_BIT(Wrapper->_I2C->ICR, I2C_ICR_NACKCF);
362 while( 1 == READ_BIT(Wrapper->_I2C->ISR, I2C_ISR_NACKF) );
364 #else
365 CLEAR_BIT(Wrapper->_I2C->SR1, I2C_SR1_AF);
367 #endif
370 #ifdef __STM32F030x6_H
372 while( 0 == READ_BIT(Wrapper->_I2C->ISR, I2C_ISR_STOPF) );
373 SET_BIT(Wrapper->_I2C->ICR, I2C_ICR_STOPCF);
374 while( 1 == READ_BIT(Wrapper->_I2C->ISR, I2C_ISR_STOPF) );
376 #endif
378 if( Wrapper->STX_Handler != NULL)
379 Wrapper->STX_Handler();
381
382 }
383}
384
398{
399 if(Wrapper->SRX_New > 0)
400 {
401 Wrapper->SRX_New--;
402
403 return Wrapper->SRX_Buffer
404 [
405 (Wrapper->SRX_Index + Wrapper->SRX_BufferSize - (Wrapper->SRX_New+1) )
406 % Wrapper->SRX_BufferSize
407 ];
408 }
409 else
410 {
411 return 0;
412 }
413}
414
421HIERODULE_I2C_Wrapper **HIERODULE_I2C_InitWrapper(I2C_TypeDef *_I2C, uint16_t SRX_BufferSize, void (*SRX_Handler)(void), void (*MTX_Handler)(void), void (*STX_Handler)(void), void (*MRX_Handler)(void))
422{
423 if( _I2C == NULL )
424 {
425 return NULL;
426 }
427
429
430 uint32_t I2C_Address = (uint32_t)_I2C;
431
432 switch(I2C_Address)
433 {
434 case ( (uint32_t)I2C1 ):
436 break;
438 #if ( (defined __STM32F103xB_H) || (defined __STM32F401xC_H) )
439 case ( (uint32_t)I2C2 ):
441 break;
443 #endif
444 #ifdef __STM32F401xC_H
445 case ( (uint32_t)I2C3 ):
447 break;
449 #endif
450 default:
451 return NULL;
452 break;
453 }
454
455 (*Wrapper) = (HIERODULE_I2C_Wrapper*)malloc(sizeof(HIERODULE_I2C_Wrapper));
456
457 (*Wrapper)->_I2C = _I2C;
458
459 (*Wrapper)->SRX_Index = 0;
460 (*Wrapper)->SRX_New = 0;
461
462 (*Wrapper)->SRX_BufferSize = SRX_BufferSize;
463 (*Wrapper)->SRX_Buffer = (uint8_t*)malloc( ((*Wrapper)->SRX_BufferSize) * sizeof(uint8_t));
464 for( uint16_t _rxb_init = 0 ; _rxb_init < (*Wrapper)->SRX_BufferSize ; _rxb_init++ )
465 {
466 ((*Wrapper)->SRX_Buffer)[_rxb_init] = '\0';
467 }
468
469 (*Wrapper)->SRX_Handler = SRX_Handler;
470 (*Wrapper)->MTX_Handler = MTX_Handler;
471 (*Wrapper)->STX_Handler = STX_Handler;
472 (*Wrapper)->MRX_Handler = MRX_Handler;
473
474 (*Wrapper)->STX_Buffer = NULL;
475 (*Wrapper)->STX_Counter = 0;
476
477 (*Wrapper)->Status = HIERODULE_I2C_Status_IDLE;
478 (*Wrapper)->SlaveAddress = 0;
479
480
482 #ifdef __STM32F030x6_H
483 SET_BIT((*Wrapper)->_I2C->CR1, I2C_CR1_ADDRIE);
484 SET_BIT((*Wrapper)->_I2C->CR1, I2C_CR1_NACKIE);
485 SET_BIT((*Wrapper)->_I2C->CR1, I2C_CR1_STOPIE);
486 CLEAR_BIT((*Wrapper)->_I2C->CR2, I2C_CR2_AUTOEND);
487 SET_BIT((*Wrapper)->_I2C->CR1, I2C_CR1_TXIE);
488 SET_BIT((*Wrapper)->_I2C->CR1, I2C_CR1_RXIE);
490 #else
491 SET_BIT((*Wrapper)->_I2C->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN);
492 SET_BIT((*Wrapper)->_I2C->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN);
494 #endif
498
500 #ifdef __STM32F030x6_H
502 uint32_t bus_clock;
503 if( ((uint32_t)READ_BIT(RCC->CFGR3, RCC_CFGR3_I2C1SW) ) == RCC_CFGR3_I2C1SW_SYSCLK)
504 bus_clock = SystemCoreClock;
505 else
506 bus_clock = HSI_VALUE;
507
508 double core_clock_rate = ((double)SystemCoreClock)/(bus_clock);
509
510 (*Wrapper)->I2C_Period_Length = core_clock_rate *
511 ((((uint32_t)(READ_BIT((*Wrapper)->_I2C->TIMINGR, I2C_TIMINGR_PRESC) >> I2C_TIMINGR_PRESC_Pos))+1) *
512 (
513 ((uint32_t)(READ_BIT((*Wrapper)->_I2C->TIMINGR, I2C_TIMINGR_SCLL) >> I2C_TIMINGR_SCLL_Pos))+1
514 +((uint32_t)(READ_BIT((*Wrapper)->_I2C->TIMINGR, I2C_TIMINGR_SCLH) >> I2C_TIMINGR_SCLH_Pos))+1
515 +((uint32_t)(READ_BIT((*Wrapper)->_I2C->TIMINGR, I2C_TIMINGR_SDADEL) >> I2C_TIMINGR_SDADEL_Pos))
516 +((uint32_t)(READ_BIT((*Wrapper)->_I2C->TIMINGR, I2C_TIMINGR_SCLDEL) >> I2C_TIMINGR_SCLDEL_Pos))+1
517 )
518 );
519
521 #else
522 (*Wrapper)->I2C_Period_Length = SystemCoreClock /
523 (( ((uint32_t)(READ_BIT((*Wrapper)->_I2C->CCR, I2C_CCR_FS))) == 0)
524 ? 100000 : 400000);
526 #endif
528 return Wrapper;
529}
530
535{
536 free(Wrapper->SRX_Buffer);
537 Wrapper->SRX_Buffer = NULL;
538
539 free(Wrapper->MTX_Buffer);
540 Wrapper->MTX_Buffer = NULL;
541
542 free(Wrapper->MRX_Buffer);
543 Wrapper->MRX_Buffer = NULL;
544
545 free(Wrapper->STX_Buffer);
546 Wrapper->STX_Buffer = NULL;
547
548 free(Wrapper);
549 Wrapper = NULL;
550}
551
554void HIERODULE_I2C_MasterTransmit(HIERODULE_I2C_Wrapper *Wrapper, uint8_t SlaveAddress, uint8_t *MTX_Buffer, uint32_t Size)
555{
556 if(Size == 0)
557 return;
558
560
562 #ifdef __STM32F030x6_H
563 MODIFY_REG(Wrapper->_I2C->CR2, I2C_CR2_SADD, SlaveAddress<<1);
564 MODIFY_REG(Wrapper->_I2C->CR2, I2C_CR2_NBYTES, Size << I2C_CR2_NBYTES_Pos);
565 MODIFY_REG(Wrapper->_I2C->CR2, I2C_CR2_RD_WRN, 0);
568 #else
569 Wrapper->SlaveAddress = SlaveAddress<<1;
572 #endif
574 Wrapper->MTX_Buffer = MTX_Buffer;
575 Wrapper->MTX_BufferSize = Size;
576 Wrapper->MTX_Counter = 0;
577
578 Start(Wrapper);
579}
580
583void HIERODULE_I2C_MasterReceive(HIERODULE_I2C_Wrapper *Wrapper, uint8_t SlaveAddress, uint8_t *MRX_Buffer, uint32_t Size)
584{
585 if(Size == 0)
586 return;
587
589
591 #ifdef __STM32F030x6_H
592 MODIFY_REG(Wrapper->_I2C->CR2, I2C_CR2_SADD, (SlaveAddress<<1)+1);
593 MODIFY_REG(Wrapper->_I2C->CR2, I2C_CR2_NBYTES, Size << I2C_CR2_NBYTES_Pos);
594 MODIFY_REG(Wrapper->_I2C->CR2, I2C_CR2_RD_WRN, I2C_CR2_RD_WRN);
597 #else
598 Wrapper->SlaveAddress = (SlaveAddress<<1)+1;
601 #endif
603 Wrapper->MRX_Buffer = MRX_Buffer;
604 Wrapper->MRX_BufferSize = Size;
605 Wrapper->MRX_Counter = 0;
606
607 if(Wrapper->MRX_BufferSize == 1)
608 {
610 __NOP();
611 }
612
613 Start(Wrapper);
614}
630{
631
633 #ifndef __STM32F030x6_H
634 uint8_t _ADDR_Active = (READ_BIT(Wrapper->_I2C->SR1, I2C_SR1_ADDR) == (I2C_SR1_ADDR));
636 #else
637 uint8_t _ADDR_Active = (READ_BIT(Wrapper->_I2C->ISR, I2C_ISR_ADDR) == (I2C_ISR_ADDR));
639 #endif
640
641 #ifdef __STM32F030x6_H
642 if ( READ_BIT(Wrapper->_I2C->ISR, I2C_ISR_NACKF) == (I2C_ISR_NACKF) )
643 {
645 }
647 #else
648 if ( READ_BIT(Wrapper->_I2C->SR1, I2C_SR1_AF) == (I2C_SR1_AF) )
649 {
651 }
653 #endif
654
655 #ifdef __STM32F030x6_H
656 else if( READ_BIT(Wrapper->_I2C->ISR, I2C_ISR_RXNE) == (I2C_ISR_RXNE) )
657 {
658 if( Wrapper->Status == HIERODULE_I2C_Status_MRX )
660 else
661 {
662 if( Wrapper->Status == HIERODULE_I2C_Status_SRX )
664 else
666 }
667 }
669 #else
670 else if( READ_BIT(Wrapper->_I2C->SR1, I2C_SR1_RXNE) == (I2C_SR1_RXNE) )
671 {
672 if( Wrapper->Status == HIERODULE_I2C_Status_MRX )
674 else
675 {
676 if( Wrapper->Status == HIERODULE_I2C_Status_SRX )
678 else
680 }
681 }
683 #endif
684
685 #ifndef __STM32F030x6_H
686 else if ( READ_BIT(Wrapper->_I2C->SR1, I2C_SR1_SB) == (I2C_SR1_SB) )
687 {
688 if( Wrapper->Status == HIERODULE_I2C_Status_MTX_SB )
690 else if( Wrapper->Status == HIERODULE_I2C_Status_MRX_SB )
692 TransmitData(Wrapper, Wrapper->SlaveAddress);
693 }
695 #endif
696 else if ( _ADDR_Active )
697 {
699 {
701 #ifndef __STM32F030x6_H
702 uint32_t _t_dir = (uint32_t)(READ_BIT(Wrapper->_I2C->SR2, I2C_SR2_TRA));
704 #else
705 uint32_t _t_dir = (uint32_t)(READ_BIT(Wrapper->_I2C->ISR, I2C_ISR_DIR));
707 #endif
708 if( 0 == _t_dir )
710 else
712 }
714 #ifndef __STM32F030x6_H
715 else if(Wrapper->Status == HIERODULE_I2C_Status_MTX_ADR)
716 {
718 }
719 else if(Wrapper->Status == HIERODULE_I2C_Status_MRX_ADR)
720 {
722 }
723 READ_REG(Wrapper->_I2C->SR1);
724 READ_REG(Wrapper->_I2C->SR2);
726 #else
727 SET_BIT(Wrapper->_I2C->ICR, I2C_ICR_ADDRCF);
729 #endif
730 }
732 #ifndef __STM32F030x6_H
733 else if ( (READ_BIT(Wrapper->_I2C->SR1, I2C_SR1_TXE) == (I2C_SR1_TXE)) )
734 {
735 if(Wrapper->Status == HIERODULE_I2C_Status_MTX )
736 {
738 }
739 else if(Wrapper->Status == HIERODULE_I2C_Status_STX )
740 {
742 while(READ_BIT(Wrapper->_I2C->SR1, I2C_SR1_TXE) != (I2C_SR1_TXE))
743 {
744 if ( READ_BIT(Wrapper->_I2C->SR1, I2C_SR1_AF) == (I2C_SR1_AF) )
745 {
747 break;
748 }
749 }
750 }
751 }
753 #else
754 else if ( READ_BIT(Wrapper->_I2C->ISR, I2C_ISR_TXIS) == (I2C_ISR_TXIS) )
755 {
756 if(Wrapper->Status == HIERODULE_I2C_Status_MTX )
757 {
759 }
760 else if(Wrapper->Status == HIERODULE_I2C_Status_STX )
761 {
763 while( READ_BIT(Wrapper->_I2C->ISR, I2C_ISR_TXIS) != (I2C_ISR_TXIS) )
764 {
765 if ( READ_BIT(Wrapper->_I2C->ISR, I2C_ISR_NACKF) == (I2C_ISR_NACKF) )
766 {
768 break;
769 }
770 }
771 }
772 }
774 #endif
775
776 #ifdef __STM32F030x6_H
777 else if ( READ_BIT(Wrapper->_I2C->ISR, I2C_ISR_STOPF) == (I2C_ISR_STOPF) )
778 {
780 }
782 #else
783 else if ( READ_BIT(Wrapper->_I2C->SR1, I2C_SR1_STOPF) == (I2C_SR1_STOPF) )
784 {
786 }
788 #endif
789}
790
805#if ( (defined __STM32F103xB_H) || (defined __STM32F401xC_H) )
806extern void I2C1_EV_IRQHandler(void)
807{
808 if( I2C1_Wrapper != NULL )
810}
811
817extern void I2C2_EV_IRQHandler(void)
818{
819 if( I2C2_Wrapper != NULL )
821}
822
829#elif defined __STM32F030x6_H
830extern void I2C1_IRQHandler(void)
831{
832 if( I2C1_Wrapper != NULL )
834}
836#endif
844#ifdef __STM32F401xC_H
845extern void I2C3_EV_IRQHandler(void)
846{
847 if( I2C3_Wrapper != NULL )
849}
851#endif
void TransmitByteAsMaster(HIERODULE_I2C_Wrapper *Wrapper)
Transmits the next data in the buffer for an I2C peripheral in master transmitter mode.
void ReceiveByteAsMaster(HIERODULE_I2C_Wrapper *Wrapper)
Handles incoming data for an I2C peripheral in master receiver mode.
void TransmitData(HIERODULE_I2C_Wrapper *Wrapper, uint8_t Byte)
Writes a byte into the data register of the I2C peripheral.
static HIERODULE_I2C_Wrapper * I2C1_Wrapper
I2C wrapper pointer meant for I2C1.
void DisableClockStretching(HIERODULE_I2C_Wrapper *Wrapper)
Disables clock stretching for the I2C peripheral of a wrapper.
void TransmitByteAsSlave(HIERODULE_I2C_Wrapper *Wrapper)
Transmits the next data in the buffer for an I2C peripheral in slave transmitter mode.
void ReceiveByteAsSlave(HIERODULE_I2C_Wrapper *Wrapper)
Handles incoming data for an I2C peripheral in slave receiver mode.
void Idle(HIERODULE_I2C_Wrapper *Wrapper, uint32_t NumberOfPeriods)
Blocks for given number of I2C clock periods.
void ReturnToIdleState(HIERODULE_I2C_Wrapper *Wrapper)
Invokes the on-SRX-finished routine if assigned and sets the I2C wrapper status back to idle.
void Start(HIERODULE_I2C_Wrapper *Wrapper)
Makes the I2C peripheral generate a start condition.
static HIERODULE_I2C_Wrapper * I2C3_Wrapper
I2C wrapper pointer meant for I2C3. Requires the device specific macro __STM32F401xC_H to be defined.
void Stop(HIERODULE_I2C_Wrapper *Wrapper)
Makes the I2C peripheral generate a stop condition.
void EnableClockStretching(HIERODULE_I2C_Wrapper *Wrapper)
Enables clock stretching for the I2C peripheral of a wrapper.
void I2C_IRQ_Handler(HIERODULE_I2C_Wrapper *Wrapper)
The base IRQ body to be used for all I2C IRQs.
void NACK_Next(HIERODULE_I2C_Wrapper *Wrapper)
Configure the I2C peripheral to "NACK" the next byte received.
static HIERODULE_I2C_Wrapper * I2C2_Wrapper
I2C wrapper pointer meant for I2C2. Requires the device specific macro __STM32F103xB_H or __STM32F401...
void ACK_Next(HIERODULE_I2C_Wrapper *Wrapper)
Configure the I2C peripheral to "ACK" the next byte received.
void Receive_NACK(HIERODULE_I2C_Wrapper *Wrapper)
Receives the NACK response, invokes the on-SRX-finished routine and sets the wrapper status back to i...
static uint8_t ReceiveData(HIERODULE_I2C_Wrapper *Wrapper)
Read and returns the data register content of the I2C peripheral.
uint8_t HIERODULE_I2C_GetNextByte(HIERODULE_I2C_Wrapper *Wrapper)
Fetches the next byte in the SRX ring buffer.
void I2C1_EV_IRQHandler(void)
I2C1 IRQ implementation. Requires the device specific macro __STM32F103xB_H or __STM32F401xC_H to be ...
void I2C3_EV_IRQHandler(void)
I2C3 IRQ implementation. Requires the device specific macro __STM32F401xC_H to be defined.
void HIERODULE_I2C_MasterReceive(HIERODULE_I2C_Wrapper *Wrapper, uint8_t SlaveAddress, uint8_t *MRX_Buffer, uint32_t Size)
Puts the peripheral in master receiver mode and handles the transmission.
HIERODULE_I2C_Wrapper ** HIERODULE_I2C_InitWrapper(I2C_TypeDef *_I2C, uint16_t SRX_BufferSize, void(*SRX_Handler)(void), void(*MTX_Handler)(void), void(*STX_Handler)(void), void(*MRX_Handler)(void))
Initializes a wrapper for the specified I2C peripheral.
void I2C2_EV_IRQHandler(void)
I2C2 IRQ implementation. Requires the device specific macro __STM32F103xB_H or __STM32F401xC_H to be ...
void I2C1_IRQHandler(void)
I2C1 IRQ implementation. Requires the device specific macro __STM32F030x6_H to be defined.
void HIERODULE_I2C_ReleaseWrapper(HIERODULE_I2C_Wrapper *Wrapper)
Frees the memory allocated to an I2C wrapper.
void HIERODULE_I2C_MasterTransmit(HIERODULE_I2C_Wrapper *Wrapper, uint8_t SlaveAddress, uint8_t *MTX_Buffer, uint32_t Size)
Puts the peripheral in master transmitter mode and handles the transmission.
@ HIERODULE_I2C_Status_MTX
Master transmitter, transmitting bytes.
@ HIERODULE_I2C_Status_MTX_ADR
Master transmitter, waiting for a slave to acknowledge the address.
@ HIERODULE_I2C_Status_MRX_ADR
Master receiver, waiting for a slave to acknowledge the address.
@ HIERODULE_I2C_Status_IDLE
Peripheral is expecting a start condition.
@ HIERODULE_I2C_Status_MRX_SB
Master receiver, waiting for the start condition to commence.
@ HIERODULE_I2C_Status_STX
Slave transmitter, transmitting bytes.
@ HIERODULE_I2C_Status_MTX_SB
Master transmitter, waiting for the start condition to commence.
@ HIERODULE_I2C_Status_SRX
Slave receiver, receiving bytes.
@ HIERODULE_I2C_Status_MRX
Master receiver, receiving bytes.
HIERODULE_USB_Wrapper Wrapper
Extern declaration for the wrapper instance in the source file.
: Header file for the I2C module.
Struct that keeps variables for the data buffers, a pointer to the I2C peripheral,...