mirror of https://github.com/ARMmbed/mbed-os.git
[STMF7 family] add more SPI and I2C for the new NUCLEO_F746ZG platform
parent
d47d87c869
commit
1ecd69bd87
|
@ -46,11 +46,10 @@
|
|||
I2C_HandleTypeDef I2cHandle;
|
||||
|
||||
int i2c1_inited = 0;
|
||||
/* Ready for next F7 devices
|
||||
int i2c2_inited = 0;
|
||||
int i2c3_inited = 0;
|
||||
int i2c4_inited = 0;
|
||||
*/
|
||||
|
||||
|
||||
void i2c_init(i2c_t *obj, PinName sda, PinName scl)
|
||||
{
|
||||
|
@ -73,7 +72,6 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
|
|||
pin_mode(scl, OpenDrain);
|
||||
}
|
||||
|
||||
/* Ready for next F7 devices
|
||||
#if defined(I2C2_BASE)
|
||||
if ((obj->i2c == I2C_2) && !i2c2_inited) {
|
||||
i2c2_inited = 1;
|
||||
|
@ -112,7 +110,6 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
|
|||
pin_mode(scl, OpenDrain);
|
||||
}
|
||||
#endif
|
||||
*/
|
||||
|
||||
// Reset to clear pending flags if any
|
||||
i2c_reset(obj);
|
||||
|
|
|
@ -80,14 +80,30 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
|
|||
MBED_ASSERT(obj->spi != (SPIName)NC);
|
||||
|
||||
// Enable SPI clock
|
||||
if (obj->spi == SPI_1) {
|
||||
__HAL_RCC_SPI1_CLK_ENABLE();
|
||||
}
|
||||
|
||||
if (obj->spi == SPI_2) {
|
||||
__HAL_RCC_SPI2_CLK_ENABLE();
|
||||
}
|
||||
|
||||
if (obj->spi == SPI_3) {
|
||||
__HAL_RCC_SPI3_CLK_ENABLE();
|
||||
}
|
||||
|
||||
if (obj->spi == SPI_4) {
|
||||
__HAL_RCC_SPI4_CLK_ENABLE();
|
||||
}
|
||||
|
||||
if (obj->spi == SPI_5) {
|
||||
__HAL_RCC_SPI5_CLK_ENABLE();
|
||||
}
|
||||
|
||||
if (obj->spi == SPI_6) {
|
||||
__HAL_RCC_SPI6_CLK_ENABLE();
|
||||
}
|
||||
|
||||
// Configure the SPI pins
|
||||
pinmap_pinout(mosi, PinMap_SPI_MOSI);
|
||||
pinmap_pinout(miso, PinMap_SPI_MISO);
|
||||
|
@ -116,18 +132,42 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
|
|||
void spi_free(spi_t *obj)
|
||||
{
|
||||
// Reset SPI and disable clock
|
||||
if (obj->spi == SPI_1) {
|
||||
__HAL_RCC_SPI1_FORCE_RESET();
|
||||
__HAL_RCC_SPI1_RELEASE_RESET();
|
||||
__HAL_RCC_SPI1_CLK_DISABLE();
|
||||
}
|
||||
|
||||
if (obj->spi == SPI_2) {
|
||||
__HAL_RCC_SPI2_FORCE_RESET();
|
||||
__HAL_RCC_SPI2_RELEASE_RESET();
|
||||
__HAL_RCC_SPI2_CLK_DISABLE();
|
||||
}
|
||||
|
||||
if (obj->spi == SPI_3) {
|
||||
__HAL_RCC_SPI3_FORCE_RESET();
|
||||
__HAL_RCC_SPI3_RELEASE_RESET();
|
||||
__HAL_RCC_SPI3_CLK_DISABLE();
|
||||
}
|
||||
|
||||
if (obj->spi == SPI_4) {
|
||||
__HAL_RCC_SPI4_FORCE_RESET();
|
||||
__HAL_RCC_SPI4_RELEASE_RESET();
|
||||
__HAL_RCC_SPI4_CLK_DISABLE();
|
||||
}
|
||||
|
||||
if (obj->spi == SPI_5) {
|
||||
__HAL_RCC_SPI5_FORCE_RESET();
|
||||
__HAL_RCC_SPI5_RELEASE_RESET();
|
||||
__HAL_RCC_SPI5_CLK_DISABLE();
|
||||
}
|
||||
|
||||
if (obj->spi == SPI_6) {
|
||||
__HAL_RCC_SPI6_FORCE_RESET();
|
||||
__HAL_RCC_SPI6_RELEASE_RESET();
|
||||
__HAL_RCC_SPI6_CLK_DISABLE();
|
||||
}
|
||||
|
||||
// Configure GPIOs
|
||||
pin_function(obj->pin_miso, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
|
||||
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)
|
|||
void spi_frequency(spi_t *obj, int hz)
|
||||
{
|
||||
// The frequencies are obtained with:
|
||||
// - SPI2 clock = 54 MHz (APB1 clock)
|
||||
// - SPI5 clock = 108 MHz (APB2 clock)
|
||||
if (obj->spi == SPI_2) {
|
||||
// - SPI2/SPI3 clock = 54 MHz (APB1 clock)
|
||||
// - SPI1/SPI4/SPI5/SPI6 clocks = 108 MHz (APB2 clock)
|
||||
switch(obj->spi) {
|
||||
case SPI_1:
|
||||
case SPI_4:
|
||||
case SPI_5:
|
||||
case SPI_6:
|
||||
if (hz < 800000) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 422 kHz
|
||||
} else if ((hz >= 800000) && (hz < 1000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 844 kHz
|
||||
} else if ((hz >= 1000000) && (hz < 3000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 1.69 MHz
|
||||
} else if ((hz >= 3000000) && (hz < 6000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 3.38 MHz
|
||||
} else if ((hz >= 6000000) && (hz < 12000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 6.75 MHz
|
||||
} else if ((hz >= 12000000) && (hz < 24000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 13.5 MHz
|
||||
} else if ((hz >= 24000000) && (hz < 54000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 27 MHz
|
||||
} else { // >= 54000000
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 54 MHz
|
||||
}
|
||||
break;
|
||||
case SPI_2:
|
||||
case SPI_3:
|
||||
if (hz < 400000) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 211 kHz
|
||||
} else if ((hz >= 400000) && (hz < 800000)) {
|
||||
|
@ -195,27 +259,11 @@ void spi_frequency(spi_t *obj, int hz)
|
|||
} else { // >= 24000000
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 27 MHz
|
||||
}
|
||||
} else if (obj->spi == SPI_5) {
|
||||
if (hz < 800000) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 422 kHz
|
||||
} else if ((hz >= 800000) && (hz < 1000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 844 kHz
|
||||
} else if ((hz >= 1000000) && (hz < 3000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 1.69 MHz
|
||||
} else if ((hz >= 3000000) && (hz < 6000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 3.38 MHz
|
||||
} else if ((hz >= 6000000) && (hz < 12000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 6.75 MHz
|
||||
} else if ((hz >= 12000000) && (hz < 24000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 13.5 MHz
|
||||
} else if ((hz >= 24000000) && (hz < 54000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 27 MHz
|
||||
} else { // >= 54000000
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 54 MHz
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
init_spi(obj);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue