33#if ( (defined __STM32F103xB_H) || (defined __STM32F401xC_H) )
57 for(uint32_t i = 0 ; i <
Wrapper->I2C_Period_Length*NumberOfPeriods ; i++)
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)) );
77 CLEAR_BIT(
Wrapper->_I2C->CR1, I2C_CR1_NOSTRETCH);
79 while( 0 == (READ_BIT(
Wrapper->_I2C->CR1, I2C_CR1_NOSTRETCH) != (I2C_CR1_NOSTRETCH)) );
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)) );
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)) );
103 SET_BIT(
Wrapper->_I2C->CR1, I2C_CR1_NOSTRETCH);
105 while( 1 == (READ_BIT(
Wrapper->_I2C->CR1, I2C_CR1_NOSTRETCH) != (I2C_CR1_NOSTRETCH)) );
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)) );
125 #ifdef __STM32F030x6_H
126 return (uint8_t)(READ_BIT(
Wrapper->_I2C->RXDR, I2C_RXDR_RXDATA));
129 return (uint8_t)(READ_BIT(
Wrapper->_I2C->DR, I2C_DR_DR));
143 #ifdef __STM32F030x6_H
144 WRITE_REG(
Wrapper->_I2C->TXDR, Byte);
147 MODIFY_REG(
Wrapper->_I2C->DR, I2C_DR_DR, Byte);
160 #ifndef __STM32F030x6_H
161 MODIFY_REG(
Wrapper->_I2C->CR1, I2C_CR1_ACK, I2C_CR1_ACK);
164 MODIFY_REG(
Wrapper->_I2C->CR2, I2C_CR2_NACK, 0);
177 #ifndef __STM32F030x6_H
178 MODIFY_REG(
Wrapper->_I2C->CR1, I2C_CR1_ACK, 0);
181 MODIFY_REG(
Wrapper->_I2C->CR2, I2C_CR2_NACK, I2C_CR2_NACK);
194 #ifndef __STM32F030x6_H
195 SET_BIT(
Wrapper->_I2C->CR1, I2C_CR1_START);
198 SET_BIT(
Wrapper->_I2C->CR2, I2C_CR2_START);
211 #ifndef __STM32F030x6_H
212 SET_BIT(
Wrapper->_I2C->CR1, I2C_CR1_STOP);
215 SET_BIT(
Wrapper->_I2C->CR2, I2C_CR2_STOP);
243 #ifndef __STM32F030x6_H
250 if(
Wrapper->MRX_Handler != NULL)
291 #ifndef __STM32F030x6_H
292 while(READ_BIT(
Wrapper->_I2C->SR1, I2C_SR1_TXE) != (I2C_SR1_TXE))
295 while(READ_BIT(
Wrapper->_I2C->ISR, I2C_ISR_TC) != (I2C_ISR_TC));
302 #ifdef __STM32F030x6_H
303 while( 0 == READ_BIT(
Wrapper->_I2C->ISR, I2C_ISR_STOPF) );
307 if(
Wrapper->MTX_Handler != NULL)
320 if(
Wrapper->STX_Buffer != NULL )
337 #ifdef __STM32F030x6_H
338 SET_BIT(
Wrapper->_I2C->ICR, I2C_ICR_STOPCF);
341 SET_BIT(
Wrapper->_I2C->CR1, I2C_CR1_PE);
344 if(
Wrapper->SRX_Handler != NULL)
360 #ifdef __STM32F030x6_H
361 SET_BIT(
Wrapper->_I2C->ICR, I2C_ICR_NACKCF);
362 while( 1 == READ_BIT(
Wrapper->_I2C->ISR, I2C_ISR_NACKF) );
365 CLEAR_BIT(
Wrapper->_I2C->SR1, I2C_SR1_AF);
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) );
378 if(
Wrapper->STX_Handler != NULL)
430 uint32_t I2C_Address = (uint32_t)_I2C;
434 case ( (uint32_t)I2C1 ):
438 #if ( (defined __STM32F103xB_H) || (defined __STM32F401xC_H) )
439 case ( (uint32_t)I2C2 ):
444 #ifdef __STM32F401xC_H
445 case ( (uint32_t)I2C3 ):
457 (*Wrapper)->_I2C = _I2C;
459 (*Wrapper)->SRX_Index = 0;
460 (*Wrapper)->SRX_New = 0;
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++ )
466 ((*Wrapper)->SRX_Buffer)[_rxb_init] =
'\0';
469 (*Wrapper)->SRX_Handler = SRX_Handler;
470 (*Wrapper)->MTX_Handler = MTX_Handler;
471 (*Wrapper)->STX_Handler = STX_Handler;
472 (*Wrapper)->MRX_Handler = MRX_Handler;
474 (*Wrapper)->STX_Buffer = NULL;
475 (*Wrapper)->STX_Counter = 0;
478 (*Wrapper)->SlaveAddress = 0;
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);
491 SET_BIT((*Wrapper)->_I2C->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN);
492 SET_BIT((*Wrapper)->_I2C->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN);
500 #ifdef __STM32F030x6_H
503 if( ((uint32_t)READ_BIT(RCC->CFGR3, RCC_CFGR3_I2C1SW) ) == RCC_CFGR3_I2C1SW_SYSCLK)
504 bus_clock = SystemCoreClock;
506 bus_clock = HSI_VALUE;
508 double core_clock_rate = ((double)SystemCoreClock)/(bus_clock);
510 (*Wrapper)->I2C_Period_Length = core_clock_rate *
511 ((((uint32_t)(READ_BIT((*Wrapper)->_I2C->TIMINGR, I2C_TIMINGR_PRESC) >> I2C_TIMINGR_PRESC_Pos))+1) *
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
522 (*Wrapper)->I2C_Period_Length = SystemCoreClock /
523 (( ((uint32_t)(READ_BIT((*Wrapper)->_I2C->CCR, I2C_CCR_FS))) == 0)
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);
569 Wrapper->SlaveAddress = SlaveAddress<<1;
574 Wrapper->MTX_Buffer = MTX_Buffer;
575 Wrapper->MTX_BufferSize = Size;
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);
598 Wrapper->SlaveAddress = (SlaveAddress<<1)+1;
603 Wrapper->MRX_Buffer = MRX_Buffer;
604 Wrapper->MRX_BufferSize = Size;
607 if(
Wrapper->MRX_BufferSize == 1)
633 #ifndef __STM32F030x6_H
634 uint8_t _ADDR_Active = (READ_BIT(
Wrapper->_I2C->SR1, I2C_SR1_ADDR) == (I2C_SR1_ADDR));
637 uint8_t _ADDR_Active = (READ_BIT(
Wrapper->_I2C->ISR, I2C_ISR_ADDR) == (I2C_ISR_ADDR));
641 #ifdef __STM32F030x6_H
642 if ( READ_BIT(
Wrapper->_I2C->ISR, I2C_ISR_NACKF) == (I2C_ISR_NACKF) )
648 if ( READ_BIT(
Wrapper->_I2C->SR1, I2C_SR1_AF) == (I2C_SR1_AF) )
655 #ifdef __STM32F030x6_H
656 else if( READ_BIT(
Wrapper->_I2C->ISR, I2C_ISR_RXNE) == (I2C_ISR_RXNE) )
670 else if( READ_BIT(
Wrapper->_I2C->SR1, I2C_SR1_RXNE) == (I2C_SR1_RXNE) )
685 #ifndef __STM32F030x6_H
686 else if ( READ_BIT(
Wrapper->_I2C->SR1, I2C_SR1_SB) == (I2C_SR1_SB) )
696 else if ( _ADDR_Active )
701 #ifndef __STM32F030x6_H
702 uint32_t _t_dir = (uint32_t)(READ_BIT(
Wrapper->_I2C->SR2, I2C_SR2_TRA));
705 uint32_t _t_dir = (uint32_t)(READ_BIT(
Wrapper->_I2C->ISR, I2C_ISR_DIR));
714 #ifndef __STM32F030x6_H
727 SET_BIT(
Wrapper->_I2C->ICR, I2C_ICR_ADDRCF);
732 #ifndef __STM32F030x6_H
733 else if ( (READ_BIT(
Wrapper->_I2C->SR1, I2C_SR1_TXE) == (I2C_SR1_TXE)) )
742 while(READ_BIT(
Wrapper->_I2C->SR1, I2C_SR1_TXE) != (I2C_SR1_TXE))
744 if ( READ_BIT(
Wrapper->_I2C->SR1, I2C_SR1_AF) == (I2C_SR1_AF) )
754 else if ( READ_BIT(
Wrapper->_I2C->ISR, I2C_ISR_TXIS) == (I2C_ISR_TXIS) )
763 while( READ_BIT(
Wrapper->_I2C->ISR, I2C_ISR_TXIS) != (I2C_ISR_TXIS) )
765 if ( READ_BIT(
Wrapper->_I2C->ISR, I2C_ISR_NACKF) == (I2C_ISR_NACKF) )
776 #ifdef __STM32F030x6_H
777 else if ( READ_BIT(
Wrapper->_I2C->ISR, I2C_ISR_STOPF) == (I2C_ISR_STOPF) )
783 else if ( READ_BIT(
Wrapper->_I2C->SR1, I2C_SR1_STOPF) == (I2C_SR1_STOPF) )
805#if ( (defined __STM32F103xB_H) || (defined __STM32F401xC_H) )
829#elif defined __STM32F030x6_H
844#ifdef __STM32F401xC_H
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,...