Hierodule 1.6.2
Utility module set for STM32 MCUs
Loading...
Searching...
No Matches
hierodule_spi.c
Go to the documentation of this file.
1
12#include <hierodule_spi.h>
13
28
33#if ( (defined __STM32F103xB_H) || (defined __STM32F401xC_H) )
36#endif
42#ifdef __STM32F401xC_H
45#endif
55{
56 return (uint8_t)(Wrapper->_SPI->DR);
57}
58
59
66{
67 SET_BIT(Wrapper->_SPI->CR1, SPI_CR1_SPE);
68}
69
78{
79 CLEAR_BIT(Wrapper->_SPI->CR1, SPI_CR1_SPE);
80}
81
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}
111
115{
116 *((volatile uint8_t*) &(Wrapper->_SPI->DR)) = Byte;
117}
118
123HIERODULE_SPI_Wrapper **HIERODULE_SPI_InitWrapper( SPI_TypeDef *_SPI, uint8_t Mode, uint16_t RX_BufferSize, void (*TC_Handler)(void) )
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}
189
194{
195 free(Wrapper->RX_Buffer);
196 Wrapper->RX_Buffer = NULL;
197
198 free(Wrapper);
199 Wrapper = NULL;
200}
201
204void HIERODULE_SPI_TransmitPackage(HIERODULE_SPI_Wrapper *Wrapper, uint8_t *TX_Buffer, uint32_t Size)
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}
215
231{
232 if( Wrapper->Mode == 1 )
233 {
234 if( READ_BIT(Wrapper->_SPI->CR1, SPI_CR1_SPE) == (SPI_CR1_SPE) )
235 {
236 if( READ_BIT(Wrapper->_SPI->SR, SPI_SR_TXE) == (SPI_SR_TXE) )
237 {
238 HIERODULE_SPI_TransmitByte(Wrapper, Wrapper->TX_Buffer[Wrapper->TX_Counter++]);
239 while( READ_BIT(Wrapper->_SPI->SR, SPI_SR_TXE) != (SPI_SR_TXE) );
240
241 while( READ_BIT(Wrapper->_SPI->SR, SPI_SR_RXNE) != (SPI_SR_RXNE) );
245 Wrapper->RX_New++;
246
247 if( Wrapper->TX_Counter == Wrapper->TX_BufferSize )
248 {
249 while( READ_BIT(Wrapper->_SPI->SR, SPI_SR_BSY) == (SPI_SR_BSY) );
251 if( Wrapper->TC_Handler != NULL )
253 }
254 }
255 }
256 }
257 else if( Wrapper->Mode == 0 )
258 {
259 if( READ_BIT(Wrapper->_SPI->SR, SPI_SR_RXNE) == (SPI_SR_RXNE) )
260 {
264 Wrapper->RX_New++;
265
266 HIERODULE_SPI_TransmitByte(Wrapper, Wrapper->TX_Buffer[Wrapper->TX_Counter++]);
267
268 if( Wrapper->TC_Handler != NULL )
270 }
271 }
272}
273
286extern void SPI1_IRQHandler(void)
287{
288 if( SPI1_Wrapper != NULL )
290}
291
298#if ( (defined __STM32F103xB_H) || (defined __STM32F401xC_H) )
299extern void SPI2_IRQHandler(void)
300{
301 if( SPI2_Wrapper != NULL )
303}
305#endif
313#ifdef __STM32F401xC_H
314extern void SPI3_IRQHandler(void)
315{
316 if( SPI3_Wrapper != NULL )
318}
320#endif
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.
static uint8_t ReceiveData(HIERODULE_SPI_Wrapper *Wrapper)
Reads and returns the data register content of the SPI peripheral.
void SPI_IRQ_Handler(HIERODULE_SPI_Wrapper *Wrapper)
The base IRQ body to be used for all SPI IRQs.
void Enable(HIERODULE_SPI_Wrapper *Wrapper)
Enables the SPI peripheral.
static void Disable(HIERODULE_SPI_Wrapper *Wrapper)
Disables 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.
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.
void SPI2_IRQHandler(void)
SPI2 IRQ implementation. Requires the device specific macro __STM32F103xB_H or __STM32F401xC_H to be ...
void HIERODULE_SPI_TransmitPackage(HIERODULE_SPI_Wrapper *Wrapper, uint8_t *TX_Buffer, uint32_t Size)
Starts a transmission as the master.
void SPI3_IRQHandler(void)
SPI3 IRQ implementation. Requires the device specific macro __STM32F401xC_H to be defined.
void SPI1_IRQHandler(void)
SPI1 IRQ implementation.
void HIERODULE_SPI_ReleaseWrapper(HIERODULE_SPI_Wrapper *Wrapper)
Frees the memory allocated to an SPI wrapper.
HIERODULE_USB_Wrapper Wrapper
Extern declaration for the wrapper instance in the source file.
: Header file for the SPI module.
Struct that keeps variables for the data buffers, a pointer to the SPI peripheral,...
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.
void(* TC_Handler)(void)
Pointer to the callback function to be called on a completed transmission.
uint32_t RX_Index
Index of next-byte-to-be-received in the ring buffer.