Skip to content

Commit 1ecd69b

Browse files
adustm0xc0170
authored andcommitted
[STMF7 family] add more SPI and I2C for the new NUCLEO_F746ZG platform
1 parent d47d87c commit 1ecd69b

File tree

2 files changed

+71
-26
lines changed

2 files changed

+71
-26
lines changed

libraries/mbed/targets/hal/TARGET_STM/TARGET_STM32F7/i2c_api.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,10 @@
4646
I2C_HandleTypeDef I2cHandle;
4747

4848
int i2c1_inited = 0;
49-
/* Ready for next F7 devices
5049
int i2c2_inited = 0;
5150
int i2c3_inited = 0;
5251
int i2c4_inited = 0;
53-
*/
52+
5453

5554
void i2c_init(i2c_t *obj, PinName sda, PinName scl)
5655
{
@@ -73,7 +72,6 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
7372
pin_mode(scl, OpenDrain);
7473
}
7574

76-
/* Ready for next F7 devices
7775
#if defined(I2C2_BASE)
7876
if ((obj->i2c == I2C_2) && !i2c2_inited) {
7977
i2c2_inited = 1;
@@ -112,7 +110,6 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
112110
pin_mode(scl, OpenDrain);
113111
}
114112
#endif
115-
*/
116113

117114
// Reset to clear pending flags if any
118115
i2c_reset(obj);

libraries/mbed/targets/hal/TARGET_STM/TARGET_STM32F7/spi_api.c

Lines changed: 70 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,30 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
8080
MBED_ASSERT(obj->spi != (SPIName)NC);
8181

8282
// Enable SPI clock
83+
if (obj->spi == SPI_1) {
84+
__HAL_RCC_SPI1_CLK_ENABLE();
85+
}
86+
8387
if (obj->spi == SPI_2) {
8488
__HAL_RCC_SPI2_CLK_ENABLE();
8589
}
8690

91+
if (obj->spi == SPI_3) {
92+
__HAL_RCC_SPI3_CLK_ENABLE();
93+
}
94+
95+
if (obj->spi == SPI_4) {
96+
__HAL_RCC_SPI4_CLK_ENABLE();
97+
}
98+
8799
if (obj->spi == SPI_5) {
88100
__HAL_RCC_SPI5_CLK_ENABLE();
89101
}
90102

103+
if (obj->spi == SPI_6) {
104+
__HAL_RCC_SPI6_CLK_ENABLE();
105+
}
106+
91107
// Configure the SPI pins
92108
pinmap_pinout(mosi, PinMap_SPI_MOSI);
93109
pinmap_pinout(miso, PinMap_SPI_MISO);
@@ -116,18 +132,42 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
116132
void spi_free(spi_t *obj)
117133
{
118134
// Reset SPI and disable clock
135+
if (obj->spi == SPI_1) {
136+
__HAL_RCC_SPI1_FORCE_RESET();
137+
__HAL_RCC_SPI1_RELEASE_RESET();
138+
__HAL_RCC_SPI1_CLK_DISABLE();
139+
}
140+
119141
if (obj->spi == SPI_2) {
120142
__HAL_RCC_SPI2_FORCE_RESET();
121143
__HAL_RCC_SPI2_RELEASE_RESET();
122144
__HAL_RCC_SPI2_CLK_DISABLE();
123145
}
124146

147+
if (obj->spi == SPI_3) {
148+
__HAL_RCC_SPI3_FORCE_RESET();
149+
__HAL_RCC_SPI3_RELEASE_RESET();
150+
__HAL_RCC_SPI3_CLK_DISABLE();
151+
}
152+
153+
if (obj->spi == SPI_4) {
154+
__HAL_RCC_SPI4_FORCE_RESET();
155+
__HAL_RCC_SPI4_RELEASE_RESET();
156+
__HAL_RCC_SPI4_CLK_DISABLE();
157+
}
158+
125159
if (obj->spi == SPI_5) {
126160
__HAL_RCC_SPI5_FORCE_RESET();
127161
__HAL_RCC_SPI5_RELEASE_RESET();
128162
__HAL_RCC_SPI5_CLK_DISABLE();
129163
}
130164

165+
if (obj->spi == SPI_6) {
166+
__HAL_RCC_SPI6_FORCE_RESET();
167+
__HAL_RCC_SPI6_RELEASE_RESET();
168+
__HAL_RCC_SPI6_CLK_DISABLE();
169+
}
170+
131171
// Configure GPIOs
132172
pin_function(obj->pin_miso, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
133173
pin_function(obj->pin_mosi, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
@@ -175,9 +215,33 @@ void spi_format(spi_t *obj, int bits, int mode, int slave)
175215
void spi_frequency(spi_t *obj, int hz)
176216
{
177217
// The frequencies are obtained with:
178-
// - SPI2 clock = 54 MHz (APB1 clock)
179-
// - SPI5 clock = 108 MHz (APB2 clock)
180-
if (obj->spi == SPI_2) {
218+
// - SPI2/SPI3 clock = 54 MHz (APB1 clock)
219+
// - SPI1/SPI4/SPI5/SPI6 clocks = 108 MHz (APB2 clock)
220+
switch(obj->spi) {
221+
case SPI_1:
222+
case SPI_4:
223+
case SPI_5:
224+
case SPI_6:
225+
if (hz < 800000) {
226+
obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 422 kHz
227+
} else if ((hz >= 800000) && (hz < 1000000)) {
228+
obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 844 kHz
229+
} else if ((hz >= 1000000) && (hz < 3000000)) {
230+
obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 1.69 MHz
231+
} else if ((hz >= 3000000) && (hz < 6000000)) {
232+
obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 3.38 MHz
233+
} else if ((hz >= 6000000) && (hz < 12000000)) {
234+
obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 6.75 MHz
235+
} else if ((hz >= 12000000) && (hz < 24000000)) {
236+
obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 13.5 MHz
237+
} else if ((hz >= 24000000) && (hz < 54000000)) {
238+
obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 27 MHz
239+
} else { // >= 54000000
240+
obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 54 MHz
241+
}
242+
break;
243+
case SPI_2:
244+
case SPI_3:
181245
if (hz < 400000) {
182246
obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 211 kHz
183247
} else if ((hz >= 400000) && (hz < 800000)) {
@@ -195,27 +259,11 @@ void spi_frequency(spi_t *obj, int hz)
195259
} else { // >= 24000000
196260
obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 27 MHz
197261
}
198-
} else if (obj->spi == SPI_5) {
199-
if (hz < 800000) {
200-
obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 422 kHz
201-
} else if ((hz >= 800000) && (hz < 1000000)) {
202-
obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 844 kHz
203-
} else if ((hz >= 1000000) && (hz < 3000000)) {
204-
obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 1.69 MHz
205-
} else if ((hz >= 3000000) && (hz < 6000000)) {
206-
obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 3.38 MHz
207-
} else if ((hz >= 6000000) && (hz < 12000000)) {
208-
obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 6.75 MHz
209-
} else if ((hz >= 12000000) && (hz < 24000000)) {
210-
obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 13.5 MHz
211-
} else if ((hz >= 24000000) && (hz < 54000000)) {
212-
obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 27 MHz
213-
} else { // >= 54000000
214-
obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 54 MHz
215-
}
216-
} else {
262+
break;
263+
default:
217264
return;
218265
}
266+
219267
init_spi(obj);
220268
}
221269

0 commit comments

Comments
 (0)