Skip to content

Commit 052443e

Browse files
author
fpr
committed
Merge branch 'SPI_Freq' into issue_11
2 parents ea8aea7 + 8b2ab03 commit 052443e

File tree

5 files changed

+112
-68
lines changed

5 files changed

+112
-68
lines changed

cores/arduino/stm32/spi_com.c

Lines changed: 75 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,71 @@
101101
/** @addtogroup STM32F4xx_System_Private_Functions
102102
* @{
103103
*/
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+
104169
/**
105170
* @brief SPI initialization function
106171
* @param obj : pointer to spi_t structure
@@ -117,6 +182,7 @@ void spi_init(spi_t *obj, uint32_t speed, spi_mode_e mode, uint8_t msb)
117182
SPI_HandleTypeDef *handle = &(obj->handle);
118183
GPIO_InitTypeDef GPIO_InitStruct;
119184
GPIO_TypeDef *port;
185+
uint32_t spi_freq = 0;
120186

121187
// Determine the SPI to use
122188
uint32_t spi_mosi = pinmap_peripheral(obj->pin_mosi, PinMap_SPI_MOSI);
@@ -151,21 +217,22 @@ void spi_init(spi_t *obj, uint32_t speed, spi_mode_e mode, uint8_t msb)
151217
handle->Instance = obj->spi;
152218
handle->Init.Mode = SPI_MODE_MASTER;
153219

154-
if(speed >= SPI_SPEED_CLOCK_DIV2_MHZ) {
220+
spi_freq = spi_getClkFreqInst(obj->spi);
221+
if(speed >= (spi_freq/SPI_SPEED_CLOCK_DIV2_MHZ)) {
155222
handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
156-
} else if(speed >= SPI_SPEED_CLOCK_DIV4_MHZ) {
223+
} else if(speed >= (spi_freq/SPI_SPEED_CLOCK_DIV4_MHZ)) {
157224
handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
158-
} else if (speed >= SPI_SPEED_CLOCK_DIV8_MHZ) {
225+
} else if (speed >= (spi_freq/SPI_SPEED_CLOCK_DIV8_MHZ)) {
159226
handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
160-
} else if (speed >= SPI_SPEED_CLOCK_DIV16_MHZ) {
227+
} else if (speed >= (spi_freq/SPI_SPEED_CLOCK_DIV16_MHZ)) {
161228
handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
162-
} else if (speed >= SPI_SPEED_CLOCK_DIV32_MHZ) {
229+
} else if (speed >= (spi_freq/SPI_SPEED_CLOCK_DIV32_MHZ)) {
163230
handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
164-
} else if (speed >= SPI_SPEED_CLOCK_DIV64_MHZ) {
231+
} else if (speed >= (spi_freq/SPI_SPEED_CLOCK_DIV64_MHZ)) {
165232
handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
166-
} else if (speed >= SPI_SPEED_CLOCK_DIV128_MHZ) {
233+
} else if (speed >= (spi_freq/SPI_SPEED_CLOCK_DIV128_MHZ)) {
167234
handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;
168-
} else if (speed >= SPI_SPEED_CLOCK_DIV256_MHZ) {
235+
} else if (speed >= (spi_freq/SPI_SPEED_CLOCK_DIV256_MHZ)) {
169236
handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
170237
} else {
171238
handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;

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
}

cores/arduino/stm32/uart.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@
8989
*/
9090
/// @brief uart caracteristics
9191
#define UART_NUM (8)
92-
static UART_HandleTypeDef *uart_handlers[UART_NUM];
92+
static UART_HandleTypeDef *uart_handlers[UART_NUM] = {NULL};
9393
static void (*rx_callback[UART_NUM])(serial_t*);
9494
static serial_t *rx_callback_obj[UART_NUM];
9595
static int (*tx_callback[UART_NUM])(serial_t*);
@@ -336,21 +336,27 @@ size_t uart_write(serial_t *obj, uint8_t data, uint16_t size)
336336
size_t uart_debug_write(uint8_t *data, uint32_t size)
337337
{
338338
uint8_t index = 0;
339+
uint32_t tickstart = HAL_GetTick();
340+
339341
for(index = 0; index < UART_NUM; index++) {
340-
if(DEBUG_UART == uart_handlers[index]->Instance) {
341-
break;
342+
if(uart_handlers[index] != NULL) {
343+
if(DEBUG_UART == uart_handlers[index]->Instance) {
344+
break;
345+
}
342346
}
343347
}
344348

345349
if(index >= UART_NUM) {
346350
return 0;
347351
}
348352

349-
if(HAL_UART_Transmit(uart_handlers[index], data, size, TX_TIMEOUT) == HAL_OK) {
350-
return 1;
351-
} else {
352-
return 0;
353+
while(HAL_UART_Transmit(uart_handlers[index], data, size, TX_TIMEOUT) != HAL_OK) {
354+
if((HAL_GetTick() - tickstart) >= TX_TIMEOUT) {
355+
return 0;
356+
}
353357
}
358+
359+
return size;
354360
}
355361

356362
/**

libraries/SPI/SPI.cpp

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -140,39 +140,30 @@ void SPIClass::setDataMode(uint8_t _pin, uint8_t _mode)
140140
g_active_id = _pin;
141141
}
142142

143+
/*
144+
* This function should not be used in new projects.
145+
* Use SPISettings with SPI.beginTransaction() to configure SPI parameters.
146+
*/
143147
void SPIClass::setClockDivider(uint8_t _pin, uint8_t _divider)
144148
{
145149
if(_pin > SPI_CHANNELS_NUM)
146150
return;
147151

152+
/* Get clk freq of the SPI instance */
153+
uint32_t spiClkFreq = spi_getClkFreq(&_spi);
154+
148155
switch(_divider) {
149156
case (SPI_CLOCK_DIV2) :
150-
spiSettings[_pin].clk = SPI_SPEED_CLOCK_DIV2_MHZ;
151-
break;
152157
case (SPI_CLOCK_DIV4) :
153-
spiSettings[_pin].clk = SPI_SPEED_CLOCK_DIV4_MHZ;
154-
break;
155158
case (SPI_CLOCK_DIV8) :
156-
spiSettings[_pin].clk = SPI_SPEED_CLOCK_DIV8_MHZ;
157-
break;
158159
case (SPI_CLOCK_DIV16) :
159-
spiSettings[_pin].clk = SPI_SPEED_CLOCK_DIV16_MHZ;
160-
break;
161160
case (SPI_CLOCK_DIV32) :
162-
spiSettings[_pin].clk = SPI_SPEED_CLOCK_DIV32_MHZ;
163-
break;
164161
case (SPI_CLOCK_DIV64) :
165-
spiSettings[_pin].clk = SPI_SPEED_CLOCK_DIV64_MHZ;
166-
break;
167162
case (SPI_CLOCK_DIV128) :
168-
spiSettings[_pin].clk = SPI_SPEED_CLOCK_DIV128_MHZ;
163+
spiSettings[_pin].clk = spiClkFreq/_divider;
169164
break;
170165
default:
171-
#if defined (STM32F0xx) || defined (STM32F3xx) || defined (STM32L0xx)
172-
spiSettings[_pin].clk = SPI_SPEED_CLOCK_DIV64_MHZ;
173-
#else
174-
spiSettings[_pin].clk = SPI_SPEED_CLOCK_DIV16_MHZ;
175-
#endif
166+
spiSettings[_pin].clk = SPI_SPEED_CLOCK_DEFAULT;
176167
break;
177168
}
178169

libraries/SPI/SPI.h

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@
3535

3636
// For compatibility with sketches designed for AVR @ 16 MHz
3737
// need to go from 64MHz to 16 (/4)
38-
// New programs should use SPI.beginTransaction to set the SPI clock
38+
// This function should not be used in new projects.
39+
// Use SPISettings with SPI.beginTransaction() to configure SPI parameters.
3940
#define SPI_CLOCK_DIV2 2
4041
#define SPI_CLOCK_DIV4 4
4142
#define SPI_CLOCK_DIV8 8
@@ -57,27 +58,7 @@ enum SPITransferMode {
5758
class SPISettings {
5859
public:
5960
SPISettings(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) {
60-
if(clock >= SPI_SPEED_CLOCK_DIV2_MHZ) {
61-
clk = SPI_SPEED_CLOCK_DIV2_MHZ;
62-
} else if (clock >= SPI_SPEED_CLOCK_DIV4_MHZ) {
63-
clk = SPI_SPEED_CLOCK_DIV4_MHZ;
64-
} else if (clock >= SPI_SPEED_CLOCK_DIV8_MHZ) {
65-
clk = SPI_SPEED_CLOCK_DIV8_MHZ;
66-
} else if (clock >= SPI_SPEED_CLOCK_DIV16_MHZ) {
67-
clk = SPI_SPEED_CLOCK_DIV16_MHZ;
68-
} else if (clock >= SPI_SPEED_CLOCK_DIV32_MHZ) {
69-
clk = SPI_SPEED_CLOCK_DIV32_MHZ;
70-
} else if (clock >= SPI_SPEED_CLOCK_DIV64_MHZ) {
71-
clk = SPI_SPEED_CLOCK_DIV64_MHZ;
72-
} else if (clock >= SPI_SPEED_CLOCK_DIV128_MHZ) {
73-
clk = SPI_SPEED_CLOCK_DIV128_MHZ;
74-
} else {
75-
#if defined (STM32F0xx) || defined(STM32F3xx) || defined(STM32L0xx)
76-
clk = SPI_SPEED_CLOCK_DIV256_MHZ;
77-
#else
78-
clk = SPI_SPEED_CLOCK_DIV16_MHZ;
79-
#endif
80-
}
61+
clk = clock;
8162

8263
if(bitOrder == MSBFIRST) {
8364
msb = 1;
@@ -98,11 +79,7 @@ class SPISettings {
9879

9980
}
10081
SPISettings() {
101-
#if defined (STM32F0xx) || defined(STM32F3xx)
102-
clk = SPI_SPEED_CLOCK_DIV64_MHZ;
103-
#else
104-
clk = SPI_SPEED_CLOCK_DIV16_MHZ;
105-
#endif
82+
clk = SPI_SPEED_CLOCK_DEFAULT;
10683
bOrder = MSBFIRST;
10784
msb = 1;
10885
dMode = SPI_MODE_0;

0 commit comments

Comments
 (0)