Hierodule 1.6.2
Utility module set for STM32 MCUs
Loading...
Searching...
No Matches

Elements of the module that are not confined to the scope of the compilation unit. Perfectly corresponds to the module's header file, except the IRQ handlers. More...

Data Structures

struct  HIERODULE_I2C_Wrapper
 Struct that keeps variables for the data buffers, a pointer to the I2C peripheral, the slave address and pointers to the transmission end callback routines. More...
 

Enumerations

enum  HIERODULE_I2C_Status {
  HIERODULE_I2C_Status_IDLE , HIERODULE_I2C_Status_MTX_SB , HIERODULE_I2C_Status_MTX_ADR , HIERODULE_I2C_Status_MTX ,
  HIERODULE_I2C_Status_SRX , HIERODULE_I2C_Status_MRX_SB , HIERODULE_I2C_Status_MRX_ADR , HIERODULE_I2C_Status_MRX ,
  HIERODULE_I2C_Status_STX
}
 I2C wrapper status enumeration. More...
 

Functions

uint8_t HIERODULE_I2C_GetNextByte (HIERODULE_I2C_Wrapper *Wrapper)
 Fetches the next byte in the SRX ring buffer.
 
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 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.
 
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.
 
void I2C1_EV_IRQHandler (void)
 I2C1 IRQ implementation.
Requires the device specific macro __STM32F103xB_H or __STM32F401xC_H to be defined.
 
void I2C2_EV_IRQHandler (void)
 I2C2 IRQ implementation.
Requires the device specific macro __STM32F103xB_H or __STM32F401xC_H to be defined.
 
void I2C1_IRQHandler (void)
 I2C1 IRQ implementation.
Requires the device specific macro __STM32F030x6_H to be defined.
 
void I2C3_EV_IRQHandler (void)
 I2C3 IRQ implementation.
Requires the device specific macro __STM32F401xC_H to be defined.
 

Detailed Description

Consists of general I2C comm routines, a I2C wrapper initalizer and typedefs for module routines.
Device-specific macro constants and type definitions are imported with an include directive to main.h, where the device driver headers are assumed to be included.
stddef.h and stdlib.h also included for NULL and malloc/free, respectively.

Enumeration Type Documentation

◆ HIERODULE_I2C_Status

Notice that different devices may not follow the same status succession.

Enumerator
HIERODULE_I2C_Status_IDLE 

Peripheral is expecting a start condition.

HIERODULE_I2C_Status_MTX_SB 

Master transmitter, waiting for the start condition to commence.

HIERODULE_I2C_Status_MTX_ADR 

Master transmitter, waiting for a slave to acknowledge the address.

HIERODULE_I2C_Status_MTX 

Master transmitter, transmitting bytes.

HIERODULE_I2C_Status_SRX 

Slave receiver, receiving bytes.

HIERODULE_I2C_Status_MRX_SB 

Master receiver, waiting for the start condition to commence.

HIERODULE_I2C_Status_MRX_ADR 

Master receiver, waiting for a slave to acknowledge the address.

HIERODULE_I2C_Status_MRX 

Master receiver, receiving bytes.

HIERODULE_I2C_Status_STX 

Slave transmitter, transmitting bytes.

Definition at line 42 of file hierodule_i2c.h.

43{
47
60
73
HIERODULE_I2C_Status
I2C wrapper status enumeration.
@ 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.

Function Documentation

◆ HIERODULE_I2C_GetNextByte()

uint8_t HIERODULE_I2C_GetNextByte ( HIERODULE_I2C_Wrapper * Wrapper)
Parameters
WrapperPointer to the I2C wrapper.
Returns
The next byte in the ring buffer, 0 if there's none.

SRX_New and SRX_Index are also updated on call, to revolve the ring buffer, so as to say.

Definition at line 397 of file hierodule_i2c.c.

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}
HIERODULE_USB_Wrapper Wrapper
Extern declaration for the wrapper instance in the source file.

References Wrapper.

◆ HIERODULE_I2C_InitWrapper()

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) )
Parameters
_I2CI2C peripheral of the wrapper.
SRX_BufferSizeLength of the SRX ring buffer array.
SRX_HandlerPointer to the callback routine for slave receiver mode.
MTX_HandlerPointer to the callback routine for master transmitter mode.
STX_HandlerPointer to the callback routine for slave transmitter mode.
MRX_HandlerPointer to the callback routine for master receiver mode.
Returns
Double pointer to the initialized wrapper.

The buffers get a new addresses allocated to them.
The SRX ring buffer is filled with null characters.
Also configures the peripheral's control register and calculates the I2C clock period.
The wrapper pointer gets a new address allocated, to be freed at some future point via HIERODULE_I2C_ReleaseWrapper, hence the reason a pointer is used for the wrapper; likewise, a double pointer is used to return it by reference.
Device specific checks are performed for the I2C peripheral specified.

Definition at line 421 of file hierodule_i2c.c.

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}
static HIERODULE_I2C_Wrapper * I2C1_Wrapper
I2C wrapper pointer meant for I2C1.
static HIERODULE_I2C_Wrapper * I2C3_Wrapper
I2C wrapper pointer meant for I2C3. Requires the device specific macro __STM32F401xC_H to be defined.
void EnableClockStretching(HIERODULE_I2C_Wrapper *Wrapper)
Enables clock stretching for the I2C peripheral of a wrapper.
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.
Struct that keeps variables for the data buffers, a pointer to the I2C peripheral,...

References ACK_Next(), EnableClockStretching(), HIERODULE_I2C_Status_IDLE, I2C1_Wrapper, I2C2_Wrapper, I2C3_Wrapper, and Wrapper.

◆ HIERODULE_I2C_MasterReceive()

void HIERODULE_I2C_MasterReceive ( HIERODULE_I2C_Wrapper * Wrapper,
uint8_t SlaveAddress,
uint8_t * MRX_Buffer,
uint32_t Size )
Parameters
WrapperPointer to the I2C wrapper.
SlaveAddressTarget device address.
MRX_BufferByte array where the received data will be saved.
SizeNumber of bytes to be received.
Returns
None

Transmission won't commence if Size is zero.

Definition at line 583 of file hierodule_i2c.c.

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}
void DisableClockStretching(HIERODULE_I2C_Wrapper *Wrapper)
Disables clock stretching for the I2C peripheral of a wrapper.
void Start(HIERODULE_I2C_Wrapper *Wrapper)
Makes the I2C peripheral generate a start condition.
void NACK_Next(HIERODULE_I2C_Wrapper *Wrapper)
Configure the I2C peripheral to "NACK" the next byte received.

References DisableClockStretching(), HIERODULE_I2C_Status_MRX, HIERODULE_I2C_Status_MRX_SB, NACK_Next(), Start(), and Wrapper.

◆ HIERODULE_I2C_MasterTransmit()

void HIERODULE_I2C_MasterTransmit ( HIERODULE_I2C_Wrapper * Wrapper,
uint8_t SlaveAddress,
uint8_t * MTX_Buffer,
uint32_t Size )
Parameters
WrapperPointer to the I2C wrapper.
SlaveAddressTarget device address.
MTX_BufferByte array to be transmitted.
SizeNumber of bytes to be transmitted.
Returns
None

Transmission won't commence if Size is zero.

Definition at line 554 of file hierodule_i2c.c.

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}

References DisableClockStretching(), HIERODULE_I2C_Status_MTX, HIERODULE_I2C_Status_MTX_SB, Start(), and Wrapper.

◆ HIERODULE_I2C_ReleaseWrapper()

void HIERODULE_I2C_ReleaseWrapper ( HIERODULE_I2C_Wrapper * Wrapper)
Parameters
WrapperPointer to the I2C wrapper.
Returns
None

Buffer addresses are also freed.
Using a released I2C wrapper or its fields may result in unexpected behavior.
Keep in mind this clears up the I2C wrapper pointer in this file scope; it is recommended to free your double pointer to the wrapper, likewise.

Definition at line 534 of file hierodule_i2c.c.

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}

References Wrapper.

◆ I2C1_EV_IRQHandler()

void I2C1_EV_IRQHandler ( void )
extern
Returns
None

Self-explanatory code, nothing to elaborate.

Definition at line 806 of file hierodule_i2c.c.

807{
808 if( I2C1_Wrapper != NULL )
810}
void I2C_IRQ_Handler(HIERODULE_I2C_Wrapper *Wrapper)
The base IRQ body to be used for all I2C IRQs.

References I2C1_Wrapper, and I2C_IRQ_Handler().

◆ I2C1_IRQHandler()

void I2C1_IRQHandler ( void )
extern
Returns
None

Self-explanatory code, nothing to elaborate.

Definition at line 830 of file hierodule_i2c.c.

831{
832 if( I2C1_Wrapper != NULL )
834}

References I2C1_Wrapper, and I2C_IRQ_Handler().

◆ I2C2_EV_IRQHandler()

void I2C2_EV_IRQHandler ( void )
extern
Returns
None

Self-explanatory code, nothing to elaborate.

Definition at line 817 of file hierodule_i2c.c.

818{
819 if( I2C2_Wrapper != NULL )
821}

References I2C2_Wrapper, and I2C_IRQ_Handler().

◆ I2C3_EV_IRQHandler()

void I2C3_EV_IRQHandler ( void )
extern
Returns
None

Self-explanatory code, nothing to elaborate.

Definition at line 845 of file hierodule_i2c.c.

846{
847 if( I2C3_Wrapper != NULL )
849}

References I2C3_Wrapper, and I2C_IRQ_Handler().