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_SPI_Wrapper
 Struct that keeps variables for the data buffers, a pointer to the SPI peripheral, the and a pointer to the transmission end callback routine. More...
 

Functions

uint8_t HIERODULE_SPI_GetNextByte (HIERODULE_SPI_Wrapper *Wrapper)
 Fetches the next byte in the RX ring buffer.
 
void HIERODULE_SPI_TransmitByte (HIERODULE_SPI_Wrapper *Wrapper, uint8_t Byte)
 Writes a byte into the data register of the SPI peripheral.
 
HIERODULE_SPI_Wrapper ** HIERODULE_SPI_InitWrapper (SPI_TypeDef *_SPI, uint8_t Mode, uint16_t RX_BufferSize, void(*TC_Handler)(void))
 Initializes a wrapper for the specified SPI peripheral.
 
void HIERODULE_SPI_ReleaseWrapper (HIERODULE_SPI_Wrapper *Wrapper)
 Frees the memory allocated to an SPI wrapper.
 
void HIERODULE_SPI_TransmitPackage (HIERODULE_SPI_Wrapper *Wrapper, uint8_t *TX_Buffer, uint32_t Size)
 Starts a transmission as the master.
 
void SPI1_IRQHandler (void)
 SPI1 IRQ implementation.
 
void SPI2_IRQHandler (void)
 SPI2 IRQ implementation.
Requires the device specific macro __STM32F103xB_H or __STM32F401xC_H to be defined.
 
void SPI3_IRQHandler (void)
 SPI3 IRQ implementation.
Requires the device specific macro __STM32F401xC_H to be defined.
 

Detailed Description

Consists of general SPI comm routines, a SPI 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.

Function Documentation

◆ HIERODULE_SPI_GetNextByte()

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

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

Definition at line 94 of file hierodule_spi.c.

95{
96 if(Wrapper->RX_New > 0)
97 {
98 Wrapper->RX_New--;
99
100 return Wrapper->RX_Buffer
101 [
104 ];
105 }
106 else
107 {
108 return 0;
109 }
110}
HIERODULE_USB_Wrapper Wrapper
Extern declaration for the wrapper instance in the source file.
uint8_t * RX_Buffer
The ring buffer where the data received is appended.
uint32_t RX_New
Number of new bytes in the ring buffer.
uint16_t RX_BufferSize
Number of elements in the ring buffer.
uint32_t RX_Index
Index of next-byte-to-be-received in the ring buffer.

References HIERODULE_USB_Wrapper::RX_Buffer, HIERODULE_USB_Wrapper::RX_BufferSize, HIERODULE_USB_Wrapper::RX_Index, HIERODULE_USB_Wrapper::RX_New, and Wrapper.

◆ HIERODULE_SPI_InitWrapper()

HIERODULE_SPI_Wrapper ** HIERODULE_SPI_InitWrapper ( SPI_TypeDef * _SPI,
uint8_t Mode,
uint16_t RX_BufferSize,
void(* TC_Handler )(void) )
Parameters
_SPISPI peripheral of the wrapper.
Mode1 For master, 0 for slave.
RX_BufferSizeRing buffer length.
TC_HandlerPointer to callback function to be called on a completed transmission.
Returns
Double pointer to the initialized wrapper.

The ring buffer gets a new address allocated to it and is filled with null characters.
The wrapper pointer gets a new address allocated, to be freed at some future point via HIERODULE_SPI_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 SPI peripheral specified.

Definition at line 123 of file hierodule_spi.c.

124{
125 if( _SPI == NULL )
126 {
127 return NULL;
128 }
129
131
132 uint32_t SPI_Address = (uint32_t)_SPI;
133
134 switch(SPI_Address)
135 {
136 case ( (uint32_t)SPI1 ):
138 break;
140 #if ( (defined __STM32F103xB_H) || (defined __STM32F401xC_H) )
141 case ( (uint32_t)SPI2 ):
143 break;
145 #endif
146 #ifdef __STM32F401xC_H
147 case ( (uint32_t)SPI3 ):
149 break;
151 #endif
152 default:
153 return NULL;
154 break;
155 }
156
157 (*Wrapper) = (HIERODULE_SPI_Wrapper*)malloc(sizeof(HIERODULE_SPI_Wrapper));
158
159 (*Wrapper)->_SPI = _SPI;
160
161 (*Wrapper)->RX_Index = 0;
162 (*Wrapper)->RX_New = 0;
163
164 (*Wrapper)->RX_BufferSize = RX_BufferSize;
165 (*Wrapper)->RX_Buffer = (uint8_t*)malloc( ((*Wrapper)->RX_BufferSize) * sizeof(uint8_t));
166 for( uint16_t _rxb_init = 0 ; _rxb_init < (*Wrapper)->RX_BufferSize ; _rxb_init++ )
167 {
168 ((*Wrapper)->RX_Buffer)[_rxb_init] = '\0';
169 }
170
171 (*Wrapper)->TC_Handler = TC_Handler;
172
173 (*Wrapper)->Mode = Mode;
174
175 if( (*Wrapper)->Mode == 1 )
176 {
177 SET_BIT((*Wrapper)->_SPI->CR2, SPI_CR2_TXEIE);
178 }
179 else
180 {
181 SET_BIT((*Wrapper)->_SPI->CR2, SPI_CR2_RXNEIE);
182 Enable(*Wrapper);
183 (*Wrapper)->TX_Counter = 0;
185 }
186
187 return Wrapper;
188}
static HIERODULE_SPI_Wrapper * SPI2_Wrapper
SPI wrapper pointer meant for SPI2. Requires the device specific macro __STM32F103xB_H or __STM32F401...
static HIERODULE_SPI_Wrapper * SPI1_Wrapper
SPI wrapper pointer meant for SPI1.
static HIERODULE_SPI_Wrapper * SPI3_Wrapper
SPI wrapper pointer meant for SPI3. Requires the device specific macro __STM32F401xC_H to be defined.
void Enable(HIERODULE_SPI_Wrapper *Wrapper)
Enables the SPI peripheral.
void HIERODULE_SPI_TransmitByte(HIERODULE_SPI_Wrapper *Wrapper, uint8_t Byte)
Writes a byte into the data register of the SPI peripheral.
Struct that keeps variables for the data buffers, a pointer to the SPI peripheral,...

References Enable(), HIERODULE_SPI_TransmitByte(), HIERODULE_USB_Wrapper::RX_Index, SPI1_Wrapper, SPI2_Wrapper, SPI3_Wrapper, and Wrapper.

◆ HIERODULE_SPI_ReleaseWrapper()

void HIERODULE_SPI_ReleaseWrapper ( HIERODULE_SPI_Wrapper * Wrapper)
Parameters
WrapperPointer to the SPI wrapper.
Returns
None

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

Definition at line 193 of file hierodule_spi.c.

194{
195 free(Wrapper->RX_Buffer);
196 Wrapper->RX_Buffer = NULL;
197
198 free(Wrapper);
199 Wrapper = NULL;
200}

References HIERODULE_USB_Wrapper::RX_Buffer, and Wrapper.

◆ HIERODULE_SPI_TransmitByte()

void HIERODULE_SPI_TransmitByte ( HIERODULE_SPI_Wrapper * Wrapper,
uint8_t Byte )
Parameters
WrapperPointer to the SPI wrapper.
ByteByte to be written into the data register.
Returns
None

Self-explanatory code, nothing to elaborate.

Definition at line 114 of file hierodule_spi.c.

115{
116 *((volatile uint8_t*) &(Wrapper->_SPI->DR)) = Byte;
117}

References Wrapper.

Referenced by HIERODULE_SPI_InitWrapper(), and SPI_IRQ_Handler().

◆ HIERODULE_SPI_TransmitPackage()

void HIERODULE_SPI_TransmitPackage ( HIERODULE_SPI_Wrapper * Wrapper,
uint8_t * TX_Buffer,
uint32_t Size )
Parameters
WrapperPointer to the SPI wrapper.
TX_BufferByte array to be transmitted.
SizeNumber of bytes to be transmitted.
Returns
None

Transmission won't commence if Size is zero.

Definition at line 204 of file hierodule_spi.c.

205{
206 if(Size == 0)
207 return;
208
209 Wrapper->TX_Buffer = TX_Buffer;
210 Wrapper->TX_BufferSize = Size;
211 Wrapper->TX_Counter = 0;
212
214}

References Enable(), and Wrapper.

◆ SPI1_IRQHandler()

void SPI1_IRQHandler ( void )
extern
Returns
None

Self-explanatory code, nothing to elaborate.

Definition at line 286 of file hierodule_spi.c.

287{
288 if( SPI1_Wrapper != NULL )
290}
void SPI_IRQ_Handler(HIERODULE_SPI_Wrapper *Wrapper)
The base IRQ body to be used for all SPI IRQs.

References SPI1_Wrapper, and SPI_IRQ_Handler().

◆ SPI2_IRQHandler()

void SPI2_IRQHandler ( void )
extern
Returns
None

Self-explanatory code, nothing to elaborate.

Definition at line 299 of file hierodule_spi.c.

300{
301 if( SPI2_Wrapper != NULL )
303}

References SPI2_Wrapper, and SPI_IRQ_Handler().

◆ SPI3_IRQHandler()

void SPI3_IRQHandler ( void )
extern
Returns
None

Self-explanatory code, nothing to elaborate.

Definition at line 314 of file hierodule_spi.c.

315{
316 if( SPI3_Wrapper != NULL )
318}

References SPI3_Wrapper, and SPI_IRQ_Handler().