Skip to content

Commit 055864f

Browse files
authored
Merge pull request #15 from stm32duino/issue_11
Fixed issue #11: SPI constructors and SS pin usage modified
2 parents dadfba3 + 052443e commit 055864f

File tree

4 files changed

+162
-127
lines changed

4 files changed

+162
-127
lines changed

cores/arduino/stm32/spi_com.c

Lines changed: 115 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,6 @@
8686
* @{
8787
*/
8888

89-
static PinName g_pin_mosi = NC;
90-
static PinName g_pin_miso = NC;
91-
static PinName g_pin_sclk = NC;
92-
static PinName g_pin_ssel = NC;
93-
9489
/**
9590
* @}
9691
*/
@@ -106,6 +101,71 @@ static PinName g_pin_ssel = NC;
106101
/** @addtogroup STM32F4xx_System_Private_Functions
107102
* @{
108103
*/
104+
/**
105+
* @brief return clock freq of an SPI instance
106+
* @param spi_inst : SPI instance
107+
* @retval clock freq of the instance else SystemCoreClock
108+
*/
109+
uint32_t spi_getClkFreqInst(SPI_TypeDef * spi_inst)
110+
{
111+
uint32_t spi_freq = SystemCoreClock;
112+
113+
#ifdef STM32F0xx
114+
/* SPIx source CLK is PCKL1 */
115+
spi_freq = HAL_RCC_GetPCLK1Freq();
116+
#else
117+
if(spi_inst != (SPI_TypeDef *)NC) {
118+
/* Get source clock depending on SPI instance */
119+
switch ((uint32_t)spi_inst) {
120+
case (uint32_t)SPI1:
121+
#if defined SPI4_BASE
122+
case (uint32_t)SPI4:
123+
#endif
124+
#if defined SPI5_BASE
125+
case (uint32_t)SPI5:
126+
#endif
127+
#if defined SPI6_BASE
128+
case (uint32_t)SPI6:
129+
#endif
130+
/* SPI1, SPI4, SPI5 and SPI6. Source CLK is PCKL2 */
131+
spi_freq = HAL_RCC_GetPCLK2Freq();
132+
break;
133+
case (uint32_t)SPI2:
134+
#if defined SPI3_BASE
135+
case (uint32_t)SPI3:
136+
#endif
137+
/* SPI_2 and SPI_3. Source CLK is PCKL1 */
138+
spi_freq = HAL_RCC_GetPCLK1Freq();
139+
break;
140+
default:
141+
printf("CLK: SPI instance not set");
142+
break;
143+
}
144+
}
145+
#endif
146+
return spi_freq;
147+
}
148+
149+
/**
150+
* @brief return clock freq of an SPI instance
151+
* @param obj : pointer to spi_t structure
152+
* @retval clock freq of the instance else SystemCoreClock
153+
*/
154+
uint32_t spi_getClkFreq(spi_t *obj)
155+
{
156+
uint32_t spi_inst = NC;
157+
uint32_t spi_freq = SystemCoreClock;
158+
159+
if(obj != NULL) {
160+
spi_inst = pinmap_peripheral(obj->pin_sclk, PinMap_SPI_SCLK);
161+
162+
if(spi_inst != NC) {
163+
spi_freq = spi_getClkFreqInst(spi_inst);
164+
}
165+
}
166+
return spi_freq;
167+
}
168+
109169
/**
110170
* @brief SPI initialization function
111171
* @param obj : pointer to spi_t structure
@@ -120,13 +180,21 @@ void spi_init(spi_t *obj, uint32_t speed, spi_mode_e mode, uint8_t msb)
120180
return;
121181

122182
SPI_HandleTypeDef *handle = &(obj->handle);
183+
GPIO_InitTypeDef GPIO_InitStruct;
184+
GPIO_TypeDef *port;
185+
uint32_t spi_freq = 0;
123186

124187
// Determine the SPI to use
125188
uint32_t spi_mosi = pinmap_peripheral(obj->pin_mosi, PinMap_SPI_MOSI);
126189
uint32_t spi_miso = pinmap_peripheral(obj->pin_miso, PinMap_SPI_MISO);
127190
uint32_t spi_sclk = pinmap_peripheral(obj->pin_sclk, PinMap_SPI_SCLK);
128191
uint32_t spi_ssel = pinmap_peripheral(obj->pin_ssel, PinMap_SPI_SSEL);
129192

193+
/* Pins MOSI/MISO/SCLK must not be NC. ssel can be NC. */
194+
if(spi_mosi == NC || spi_miso == NC || spi_sclk == NC) {
195+
return;
196+
}
197+
130198
uint32_t spi_data = pinmap_merge(spi_mosi, spi_miso);
131199
uint32_t spi_cntl = pinmap_merge(spi_sclk, spi_ssel);
132200

@@ -139,35 +207,32 @@ void spi_init(spi_t *obj, uint32_t speed, spi_mode_e mode, uint8_t msb)
139207
}
140208

141209
// Configure the SPI pins
142-
g_pin_mosi = obj->pin_mosi;
143-
g_pin_miso = obj->pin_miso;
144-
g_pin_sclk = obj->pin_sclk;
145210
if (obj->pin_ssel != NC) {
146-
g_pin_ssel = obj->pin_ssel;
211+
handle->Init.NSS = SPI_NSS_HARD_OUTPUT;
147212
} else {
148-
g_pin_ssel = NC;
149213
handle->Init.NSS = SPI_NSS_SOFT;
150214
}
151215

152216
/* Fill default value */
153217
handle->Instance = obj->spi;
154218
handle->Init.Mode = SPI_MODE_MASTER;
155219

156-
if(speed >= SPI_SPEED_CLOCK_DIV2_MHZ) {
220+
spi_freq = spi_getClkFreqInst(obj->spi);
221+
if(speed >= (spi_freq/SPI_SPEED_CLOCK_DIV2_MHZ)) {
157222
handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
158-
} else if(speed >= SPI_SPEED_CLOCK_DIV4_MHZ) {
223+
} else if(speed >= (spi_freq/SPI_SPEED_CLOCK_DIV4_MHZ)) {
159224
handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
160-
} else if (speed >= SPI_SPEED_CLOCK_DIV8_MHZ) {
225+
} else if (speed >= (spi_freq/SPI_SPEED_CLOCK_DIV8_MHZ)) {
161226
handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
162-
} else if (speed >= SPI_SPEED_CLOCK_DIV16_MHZ) {
227+
} else if (speed >= (spi_freq/SPI_SPEED_CLOCK_DIV16_MHZ)) {
163228
handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
164-
} else if (speed >= SPI_SPEED_CLOCK_DIV32_MHZ) {
229+
} else if (speed >= (spi_freq/SPI_SPEED_CLOCK_DIV32_MHZ)) {
165230
handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
166-
} else if (speed >= SPI_SPEED_CLOCK_DIV64_MHZ) {
231+
} else if (speed >= (spi_freq/SPI_SPEED_CLOCK_DIV64_MHZ)) {
167232
handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
168-
} else if (speed >= SPI_SPEED_CLOCK_DIV128_MHZ) {
233+
} else if (speed >= (spi_freq/SPI_SPEED_CLOCK_DIV128_MHZ)) {
169234
handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;
170-
} else if (speed >= SPI_SPEED_CLOCK_DIV256_MHZ) {
235+
} else if (speed >= (spi_freq/SPI_SPEED_CLOCK_DIV256_MHZ)) {
171236
handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
172237
} else {
173238
handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
@@ -199,96 +264,84 @@ void spi_init(spi_t *obj, uint32_t speed, spi_mode_e mode, uint8_t msb)
199264

200265
handle->Init.TIMode = SPI_TIMODE_DISABLED;
201266

202-
HAL_SPI_Init(handle);
203-
}
204-
205-
/**
206-
* @brief Initialize the SPI MSP.
207-
* @param hspi: pointer to a SPI_HandleTypeDef structure that contains
208-
* the configuration information for SPI module.
209-
* @retval None
210-
*/
211-
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
212-
{
213-
GPIO_InitTypeDef GPIO_InitStruct;
214-
GPIO_TypeDef *port;
215-
216-
if(g_pin_mosi != NC) {
217-
port = set_GPIO_Port_Clock(STM_PORT(g_pin_mosi));
218-
GPIO_InitStruct.Pin = STM_GPIO_PIN(g_pin_mosi);
219-
GPIO_InitStruct.Mode = STM_PIN_MODE(pinmap_function(g_pin_mosi,PinMap_SPI_MOSI));
220-
GPIO_InitStruct.Pull = STM_PIN_PUPD(pinmap_function(g_pin_mosi,PinMap_SPI_MOSI));
267+
if(obj->pin_mosi != NC) {
268+
port = set_GPIO_Port_Clock(STM_PORT(obj->pin_mosi));
269+
GPIO_InitStruct.Pin = STM_GPIO_PIN(obj->pin_mosi);
270+
GPIO_InitStruct.Mode = STM_PIN_MODE(pinmap_function(obj->pin_mosi,PinMap_SPI_MOSI));
271+
GPIO_InitStruct.Pull = STM_PIN_PUPD(pinmap_function(obj->pin_mosi,PinMap_SPI_MOSI));
221272
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
222-
GPIO_InitStruct.Alternate = STM_PIN_AFNUM(pinmap_function(g_pin_mosi,PinMap_SPI_MOSI));
273+
GPIO_InitStruct.Alternate = STM_PIN_AFNUM(pinmap_function(obj->pin_mosi,PinMap_SPI_MOSI));
223274
HAL_GPIO_Init(port, &GPIO_InitStruct);
224275
}
225276

226-
if(g_pin_miso != NC) {
227-
port = set_GPIO_Port_Clock(STM_PORT(g_pin_miso));
228-
GPIO_InitStruct.Pin = STM_GPIO_PIN(g_pin_miso);
229-
GPIO_InitStruct.Mode = STM_PIN_MODE(pinmap_function(g_pin_miso,PinMap_SPI_MISO));
230-
GPIO_InitStruct.Pull = STM_PIN_PUPD(pinmap_function(g_pin_miso,PinMap_SPI_MISO));
277+
if(obj->pin_miso != NC) {
278+
port = set_GPIO_Port_Clock(STM_PORT(obj->pin_miso));
279+
GPIO_InitStruct.Pin = STM_GPIO_PIN(obj->pin_miso);
280+
GPIO_InitStruct.Mode = STM_PIN_MODE(pinmap_function(obj->pin_miso,PinMap_SPI_MISO));
281+
GPIO_InitStruct.Pull = STM_PIN_PUPD(pinmap_function(obj->pin_miso,PinMap_SPI_MISO));
231282
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
232-
GPIO_InitStruct.Alternate = STM_PIN_AFNUM(pinmap_function(g_pin_miso,PinMap_SPI_MISO));
283+
GPIO_InitStruct.Alternate = STM_PIN_AFNUM(pinmap_function(obj->pin_miso,PinMap_SPI_MISO));
233284
HAL_GPIO_Init(port, &GPIO_InitStruct);
234285
}
235286

236-
if(g_pin_sclk != NC) {
237-
port = set_GPIO_Port_Clock(STM_PORT(g_pin_sclk));
238-
GPIO_InitStruct.Pin = STM_GPIO_PIN(g_pin_sclk);
239-
GPIO_InitStruct.Mode = STM_PIN_MODE(pinmap_function(g_pin_sclk,PinMap_SPI_SCLK));
240-
GPIO_InitStruct.Pull = STM_PIN_PUPD(pinmap_function(g_pin_sclk,PinMap_SPI_SCLK));
287+
if(obj->pin_sclk != NC) {
288+
port = set_GPIO_Port_Clock(STM_PORT(obj->pin_sclk));
289+
GPIO_InitStruct.Pin = STM_GPIO_PIN(obj->pin_sclk);
290+
GPIO_InitStruct.Mode = STM_PIN_MODE(pinmap_function(obj->pin_sclk,PinMap_SPI_SCLK));
291+
GPIO_InitStruct.Pull = STM_PIN_PUPD(pinmap_function(obj->pin_sclk,PinMap_SPI_SCLK));
241292
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
242-
GPIO_InitStruct.Alternate = STM_PIN_AFNUM(pinmap_function(g_pin_sclk,PinMap_SPI_SCLK));
293+
GPIO_InitStruct.Alternate = STM_PIN_AFNUM(pinmap_function(obj->pin_sclk,PinMap_SPI_SCLK));
243294
HAL_GPIO_Init(port, &GPIO_InitStruct);
244295
}
245296

246-
if(g_pin_ssel != NC) {
247-
port = set_GPIO_Port_Clock(STM_PORT(g_pin_ssel));
248-
GPIO_InitStruct.Pin = STM_GPIO_PIN(g_pin_ssel);
249-
GPIO_InitStruct.Mode = STM_PIN_MODE(pinmap_function(g_pin_ssel,PinMap_SPI_SSEL));
250-
GPIO_InitStruct.Pull = STM_PIN_PUPD(pinmap_function(g_pin_ssel,PinMap_SPI_SSEL));
297+
if(obj->pin_ssel != NC) {
298+
port = set_GPIO_Port_Clock(STM_PORT(obj->pin_ssel));
299+
GPIO_InitStruct.Pin = STM_GPIO_PIN(obj->pin_ssel);
300+
GPIO_InitStruct.Mode = STM_PIN_MODE(pinmap_function(obj->pin_ssel,PinMap_SPI_SSEL));
301+
GPIO_InitStruct.Pull = STM_PIN_PUPD(pinmap_function(obj->pin_ssel,PinMap_SPI_SSEL));
251302
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
252-
GPIO_InitStruct.Alternate = STM_PIN_AFNUM(pinmap_function(g_pin_ssel,PinMap_SPI_SSEL));
303+
GPIO_InitStruct.Alternate = STM_PIN_AFNUM(pinmap_function(obj->pin_ssel,PinMap_SPI_SSEL));
253304
HAL_GPIO_Init(port, &GPIO_InitStruct);
254305
}
255306

256307
#if defined SPI1_BASE
257308
// Enable SPI clock
258-
if (hspi->Instance == SPI1) {
309+
if (handle->Instance == SPI1) {
259310
__HAL_RCC_SPI1_CLK_ENABLE();
260311
}
261312
#endif
262313

263314
#if defined SPI2_BASE
264-
if (hspi->Instance == SPI2) {
315+
if (handle->Instance == SPI2) {
265316
__HAL_RCC_SPI2_CLK_ENABLE();
266317
}
267318
#endif
268319

269320
#if defined SPI3_BASE
270-
if (hspi->Instance == SPI3) {
321+
if (handle->Instance == SPI3) {
271322
__HAL_RCC_SPI3_CLK_ENABLE();
272323
}
273324
#endif
274325

275326
#if defined SPI4_BASE
276-
if (hspi->Instance == SPI4) {
327+
if (handle->Instance == SPI4) {
277328
__HAL_RCC_SPI4_CLK_ENABLE();
278329
}
279330
#endif
280331

281332
#if defined SPI5_BASE
282-
if (hspi->Instance == SPI5) {
333+
if (handle->Instance == SPI5) {
283334
__HAL_RCC_SPI5_CLK_ENABLE();
284335
}
285336
#endif
286337

287338
#if defined SPI6_BASE
288-
if (hspi->Instance == SPI6) {
339+
if (handle->Instance == SPI6) {
289340
__HAL_RCC_SPI6_CLK_ENABLE();
290341
}
291342
#endif
343+
344+
HAL_SPI_Init(handle);
292345
}
293346

294347
/**

cores/arduino/stm32/spi_com.h

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,16 @@ typedef struct spi_s spi_t;
6262

6363

6464
///@brief specifies the SPI speed bus in HZ.
65-
#define SPI_SPEED_CLOCK_DIV2_MHZ ((uint32_t)(SystemCoreClock/2))
66-
#define SPI_SPEED_CLOCK_DIV4_MHZ ((uint32_t)(SystemCoreClock/4))
67-
#define SPI_SPEED_CLOCK_DIV8_MHZ ((uint32_t)(SystemCoreClock/8))
68-
#define SPI_SPEED_CLOCK_DIV16_MHZ ((uint32_t)(SystemCoreClock/16))
69-
#define SPI_SPEED_CLOCK_DIV32_MHZ ((uint32_t)(SystemCoreClock/32))
70-
#define SPI_SPEED_CLOCK_DIV64_MHZ ((uint32_t)(SystemCoreClock/64))
71-
#define SPI_SPEED_CLOCK_DIV128_MHZ ((uint32_t)(SystemCoreClock/128))
72-
#define SPI_SPEED_CLOCK_DIV256_MHZ ((uint32_t)(SystemCoreClock/256))
65+
#define SPI_SPEED_CLOCK_DEFAULT 4000000
66+
67+
#define SPI_SPEED_CLOCK_DIV2_MHZ ((uint32_t)2)
68+
#define SPI_SPEED_CLOCK_DIV4_MHZ ((uint32_t)4)
69+
#define SPI_SPEED_CLOCK_DIV8_MHZ ((uint32_t)8)
70+
#define SPI_SPEED_CLOCK_DIV16_MHZ ((uint32_t)16)
71+
#define SPI_SPEED_CLOCK_DIV32_MHZ ((uint32_t)32)
72+
#define SPI_SPEED_CLOCK_DIV64_MHZ ((uint32_t)64)
73+
#define SPI_SPEED_CLOCK_DIV128_MHZ ((uint32_t)128)
74+
#define SPI_SPEED_CLOCK_DIV256_MHZ ((uint32_t)256)
7375

7476
///@brief speficies the SPI mode to use
7577
//Mode Clock Polarity (CPOL) Clock Phase (CPHA)
@@ -101,6 +103,7 @@ void spi_deinit(spi_t *obj);
101103
spi_status_e spi_send(spi_t *obj, uint8_t *Data, uint16_t len, uint32_t Timeout);
102104
spi_status_e spi_transfer(spi_t *obj, uint8_t * tx_buffer,
103105
uint8_t * rx_buffer, uint16_t len, uint32_t Timeout);
106+
uint32_t spi_getClkFreq(spi_t *obj);
104107

105108
#ifdef __cplusplus
106109
}

0 commit comments

Comments
 (0)