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;
|
I2C_HandleTypeDef I2cHandle;
|
||||||
|
|
||||||
int i2c1_inited = 0;
|
int i2c1_inited = 0;
|
||||||
/* Ready for next F7 devices
|
|
||||||
int i2c2_inited = 0;
|
int i2c2_inited = 0;
|
||||||
int i2c3_inited = 0;
|
int i2c3_inited = 0;
|
||||||
int i2c4_inited = 0;
|
int i2c4_inited = 0;
|
||||||
*/
|
|
||||||
|
|
||||||
void i2c_init(i2c_t *obj, PinName sda, PinName scl)
|
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);
|
pin_mode(scl, OpenDrain);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ready for next F7 devices
|
|
||||||
#if defined(I2C2_BASE)
|
#if defined(I2C2_BASE)
|
||||||
if ((obj->i2c == I2C_2) && !i2c2_inited) {
|
if ((obj->i2c == I2C_2) && !i2c2_inited) {
|
||||||
i2c2_inited = 1;
|
i2c2_inited = 1;
|
||||||
|
@ -112,7 +110,6 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
|
||||||
pin_mode(scl, OpenDrain);
|
pin_mode(scl, OpenDrain);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
*/
|
|
||||||
|
|
||||||
// Reset to clear pending flags if any
|
// Reset to clear pending flags if any
|
||||||
i2c_reset(obj);
|
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);
|
MBED_ASSERT(obj->spi != (SPIName)NC);
|
||||||
|
|
||||||
// Enable SPI clock
|
// Enable SPI clock
|
||||||
|
if (obj->spi == SPI_1) {
|
||||||
|
__HAL_RCC_SPI1_CLK_ENABLE();
|
||||||
|
}
|
||||||
|
|
||||||
if (obj->spi == SPI_2) {
|
if (obj->spi == SPI_2) {
|
||||||
__HAL_RCC_SPI2_CLK_ENABLE();
|
__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) {
|
if (obj->spi == SPI_5) {
|
||||||
__HAL_RCC_SPI5_CLK_ENABLE();
|
__HAL_RCC_SPI5_CLK_ENABLE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (obj->spi == SPI_6) {
|
||||||
|
__HAL_RCC_SPI6_CLK_ENABLE();
|
||||||
|
}
|
||||||
|
|
||||||
// Configure the SPI pins
|
// Configure the SPI pins
|
||||||
pinmap_pinout(mosi, PinMap_SPI_MOSI);
|
pinmap_pinout(mosi, PinMap_SPI_MOSI);
|
||||||
pinmap_pinout(miso, PinMap_SPI_MISO);
|
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)
|
void spi_free(spi_t *obj)
|
||||||
{
|
{
|
||||||
// Reset SPI and disable clock
|
// 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) {
|
if (obj->spi == SPI_2) {
|
||||||
__HAL_RCC_SPI2_FORCE_RESET();
|
__HAL_RCC_SPI2_FORCE_RESET();
|
||||||
__HAL_RCC_SPI2_RELEASE_RESET();
|
__HAL_RCC_SPI2_RELEASE_RESET();
|
||||||
__HAL_RCC_SPI2_CLK_DISABLE();
|
__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) {
|
if (obj->spi == SPI_5) {
|
||||||
__HAL_RCC_SPI5_FORCE_RESET();
|
__HAL_RCC_SPI5_FORCE_RESET();
|
||||||
__HAL_RCC_SPI5_RELEASE_RESET();
|
__HAL_RCC_SPI5_RELEASE_RESET();
|
||||||
__HAL_RCC_SPI5_CLK_DISABLE();
|
__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
|
// Configure GPIOs
|
||||||
pin_function(obj->pin_miso, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
|
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));
|
pin_function(obj->pin_mosi, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
|
||||||
|
@ -175,27 +215,13 @@ void spi_format(spi_t *obj, int bits, int mode, int slave)
|
||||||
void spi_frequency(spi_t *obj, int hz)
|
void spi_frequency(spi_t *obj, int hz)
|
||||||
{
|
{
|
||||||
// The frequencies are obtained with:
|
// The frequencies are obtained with:
|
||||||
// - SPI2 clock = 54 MHz (APB1 clock)
|
// - SPI2/SPI3 clock = 54 MHz (APB1 clock)
|
||||||
// - SPI5 clock = 108 MHz (APB2 clock)
|
// - SPI1/SPI4/SPI5/SPI6 clocks = 108 MHz (APB2 clock)
|
||||||
if (obj->spi == SPI_2) {
|
switch(obj->spi) {
|
||||||
if (hz < 400000) {
|
case SPI_1:
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 211 kHz
|
case SPI_4:
|
||||||
} else if ((hz >= 400000) && (hz < 800000)) {
|
case SPI_5:
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 422 kHz
|
case SPI_6:
|
||||||
} else if ((hz >= 800000) && (hz < 1000000)) {
|
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 844 kHz
|
|
||||||
} else if ((hz >= 1000000) && (hz < 3000000)) {
|
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 1.69 MHz
|
|
||||||
} else if ((hz >= 3000000) && (hz < 6000000)) {
|
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 3.38 MHz
|
|
||||||
} else if ((hz >= 6000000) && (hz < 12000000)) {
|
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 6.75 MHz
|
|
||||||
} else if ((hz >= 12000000) && (hz < 24000000)) {
|
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 13.5 MHz
|
|
||||||
} else { // >= 24000000
|
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 27 MHz
|
|
||||||
}
|
|
||||||
} else if (obj->spi == SPI_5) {
|
|
||||||
if (hz < 800000) {
|
if (hz < 800000) {
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 422 kHz
|
obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 422 kHz
|
||||||
} else if ((hz >= 800000) && (hz < 1000000)) {
|
} else if ((hz >= 800000) && (hz < 1000000)) {
|
||||||
|
@ -213,9 +239,31 @@ void spi_frequency(spi_t *obj, int hz)
|
||||||
} else { // >= 54000000
|
} else { // >= 54000000
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 54 MHz
|
obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 54 MHz
|
||||||
}
|
}
|
||||||
} else {
|
break;
|
||||||
|
case SPI_2:
|
||||||
|
case SPI_3:
|
||||||
|
if (hz < 400000) {
|
||||||
|
obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 211 kHz
|
||||||
|
} else if ((hz >= 400000) && (hz < 800000)) {
|
||||||
|
obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 422 kHz
|
||||||
|
} else if ((hz >= 800000) && (hz < 1000000)) {
|
||||||
|
obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 844 kHz
|
||||||
|
} else if ((hz >= 1000000) && (hz < 3000000)) {
|
||||||
|
obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 1.69 MHz
|
||||||
|
} else if ((hz >= 3000000) && (hz < 6000000)) {
|
||||||
|
obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 3.38 MHz
|
||||||
|
} else if ((hz >= 6000000) && (hz < 12000000)) {
|
||||||
|
obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 6.75 MHz
|
||||||
|
} else if ((hz >= 12000000) && (hz < 24000000)) {
|
||||||
|
obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 13.5 MHz
|
||||||
|
} else { // >= 24000000
|
||||||
|
obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 27 MHz
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
init_spi(obj);
|
init_spi(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue