mirror of https://github.com/ARMmbed/mbed-os.git
[NUCLEO_F401RE] Add more ANALOG_IN, I2C and SPI pins
parent
9b8352d6db
commit
4e907a09fd
|
@ -38,10 +38,20 @@
|
|||
static const PinMap PinMap_ADC[] = {
|
||||
{PA_0, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN0
|
||||
{PA_1, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN1
|
||||
{PA_2, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN2
|
||||
{PA_3, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN3
|
||||
{PA_4, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN4
|
||||
{PA_5, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN5
|
||||
{PA_5, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN6
|
||||
{PA_6, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN7
|
||||
{PB_0, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN8
|
||||
{PC_1, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN11
|
||||
{PB_1, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN9
|
||||
{PC_0, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN10
|
||||
{PC_1, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN11
|
||||
{PC_2, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN12
|
||||
{PC_3, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN13
|
||||
{PC_4, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN14
|
||||
{PC_5, ADC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)}, // ADC1_IN15
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
|
@ -105,18 +115,48 @@ static inline uint16_t adc_read(analogin_t *obj) {
|
|||
case PA_1:
|
||||
sConfig.Channel = ADC_CHANNEL_1;
|
||||
break;
|
||||
case PA_2:
|
||||
sConfig.Channel = ADC_CHANNEL_2;
|
||||
break;
|
||||
case PA_3:
|
||||
sConfig.Channel = ADC_CHANNEL_3;
|
||||
break;
|
||||
case PA_4:
|
||||
sConfig.Channel = ADC_CHANNEL_4;
|
||||
break;
|
||||
case PA_5:
|
||||
sConfig.Channel = ADC_CHANNEL_5;
|
||||
break;
|
||||
case PA_6:
|
||||
sConfig.Channel = ADC_CHANNEL_6;
|
||||
break;
|
||||
case PA_7:
|
||||
sConfig.Channel = ADC_CHANNEL_7;
|
||||
break;
|
||||
case PB_0:
|
||||
sConfig.Channel = ADC_CHANNEL_8;
|
||||
break;
|
||||
case PC_1:
|
||||
sConfig.Channel = ADC_CHANNEL_11;
|
||||
case PB_1:
|
||||
sConfig.Channel = ADC_CHANNEL_9;
|
||||
break;
|
||||
case PC_0:
|
||||
sConfig.Channel = ADC_CHANNEL_10;
|
||||
break;
|
||||
case PC_1:
|
||||
sConfig.Channel = ADC_CHANNEL_11;
|
||||
break;
|
||||
case PC_2:
|
||||
sConfig.Channel = ADC_CHANNEL_12;
|
||||
break;
|
||||
case PC_3:
|
||||
sConfig.Channel = ADC_CHANNEL_13;
|
||||
break;
|
||||
case PC_4:
|
||||
sConfig.Channel = ADC_CHANNEL_14;
|
||||
break;
|
||||
case PC_5:
|
||||
sConfig.Channel = ADC_CHANNEL_15;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -43,16 +43,19 @@
|
|||
#define LONG_TIMEOUT ((int)0x8000)
|
||||
|
||||
static const PinMap PinMap_I2C_SDA[] = {
|
||||
{PB_9, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},
|
||||
{PB_3, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C2)},
|
||||
{PB_4, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C3)},
|
||||
{PB_7, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},
|
||||
{PB_9, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},
|
||||
{PC_9, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
static const PinMap PinMap_I2C_SCL[] = {
|
||||
{PA_8, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},
|
||||
{PB_6, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},
|
||||
{PB_8, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},
|
||||
{PB_10, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},
|
||||
{PA_8, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
|
@ -76,7 +79,6 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
|
|||
if (obj->i2c == I2C_2) {
|
||||
__I2C2_CLK_ENABLE();
|
||||
}
|
||||
|
||||
if (obj->i2c == I2C_3) {
|
||||
__I2C3_CLK_ENABLE();
|
||||
}
|
||||
|
|
|
@ -40,41 +40,40 @@
|
|||
static const PinMap PinMap_SPI_MOSI[] = {
|
||||
{PA_7, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
{PB_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
{PC_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
//{PB_5, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PB_15, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PC_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PC_12, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PB_5 , SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
static const PinMap PinMap_SPI_MISO[] = {
|
||||
{PA_6, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
{PB_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
{PC_2, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
//{PB_4, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PB_14, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PC_2, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PC_11, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PB_4 , SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
static const PinMap PinMap_SPI_SCLK[] = {
|
||||
{PA_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
{PB_3, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
//{PB_3, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PB_10, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PB_13, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PC_10, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PB_3 , SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
// Only used in Slave mode
|
||||
static const PinMap PinMap_SPI_SSEL[] = {
|
||||
{PA_4, SPI_1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF5_SPI1)},
|
||||
{PA_15, SPI_1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF5_SPI1)},
|
||||
{PB_9 , SPI_2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF5_SPI2)},
|
||||
{PB_12, SPI_2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF5_SPI2)},
|
||||
{PA_4 , SPI_3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF6_SPI3)},
|
||||
{PA_15, SPI_3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF6_SPI3)},
|
||||
{PA_4, SPI_1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF5_SPI1)},
|
||||
//{PA_4, SPI_3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF6_SPI3)},
|
||||
{PA_15, SPI_1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF5_SPI1)},
|
||||
//{PA_15, SPI_3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF6_SPI3)},
|
||||
{PB_9, SPI_2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF5_SPI2)},
|
||||
{PB_12, SPI_2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF5_SPI2)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
|
@ -133,9 +132,6 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
|
|||
pinmap_pinout(mosi, PinMap_SPI_MOSI);
|
||||
pinmap_pinout(miso, PinMap_SPI_MISO);
|
||||
pinmap_pinout(sclk, PinMap_SPI_SCLK);
|
||||
if (ssel != NC) { // slave mode
|
||||
pinmap_pinout(ssel, PinMap_SPI_SSEL);
|
||||
}
|
||||
|
||||
// Save new values
|
||||
obj->bits = SPI_DATASIZE_8BIT;
|
||||
|
@ -202,61 +198,31 @@ void spi_format(spi_t *obj, int bits, int mode, int slave) {
|
|||
}
|
||||
|
||||
void spi_frequency(spi_t *obj, int hz) {
|
||||
<<<<<<< HEAD
|
||||
// Note: The frequencies are obtained with SPI1 clock = 84 MHz (APB2 clock)
|
||||
if (hz < 500000) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 331 kHz
|
||||
if (hz < 600000) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 330 kHz
|
||||
}
|
||||
else if ((hz >= 500000) && (hz < 1000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 663 kHz
|
||||
else if ((hz >= 600000) && (hz < 1000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 656 kHz
|
||||
}
|
||||
else if ((hz >= 1000000) && (hz < 2000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 1.3 MHz
|
||||
}
|
||||
else if ((hz >= 2000000) && (hz < 5000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 2.65 MHz
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 2.6 MHz
|
||||
}
|
||||
else if ((hz >= 5000000) && (hz < 10000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 5.3 MHz
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 5.25 MHz
|
||||
}
|
||||
else if ((hz >= 10000000) && (hz < 20000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 10.6 MHz
|
||||
else if ((hz >= 10000000) && (hz < 21000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 10.5 MHz
|
||||
}
|
||||
else if ((hz >= 20000000) && (hz < 40000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 21.2 MHz
|
||||
else if ((hz >= 21000000) && (hz < 42000000)) {
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 21 MHz
|
||||
}
|
||||
else { // >= 40000000
|
||||
else { // >= 42000000
|
||||
obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 42 MHz
|
||||
}
|
||||
=======
|
||||
// Get SPI clock frequency
|
||||
|
||||
// SPI1 runs from PCLK2, which runs at SystemCoreClock / 2. SPI2 and SPI3
|
||||
// run from PCLK1, which runs at SystemCoreClock / 4.
|
||||
uint32_t PCLK = SystemCoreClock;
|
||||
switch ((int)obj->spi) {
|
||||
case SPI_1: PCLK = PCLK >> 1; break;
|
||||
case SPI_2: PCLK = PCLK >> 2; break;
|
||||
case SPI_3: PCLK = PCLK >> 2; break;
|
||||
}
|
||||
// Choose the baud rate divisor (between 2 and 256)
|
||||
uint32_t divisor = PCLK / hz;
|
||||
|
||||
// Find the nearest power-of-2
|
||||
divisor = (divisor > 0 ? divisor-1 : 0);
|
||||
divisor |= divisor >> 1;
|
||||
divisor |= divisor >> 2;
|
||||
divisor |= divisor >> 4;
|
||||
divisor |= divisor >> 8;
|
||||
divisor |= divisor >> 16;
|
||||
divisor++;
|
||||
|
||||
uint32_t baud_rate = __builtin_ffs(divisor) - 2;
|
||||
|
||||
// Save new value
|
||||
obj->br_presc = ((baud_rate > 7) ? (7 << 3) : (baud_rate << 3));
|
||||
|
||||
>>>>>>> b95ba7a52a7ae9e1239b3adafff2293a2c7aebfd
|
||||
init_spi(obj);
|
||||
}
|
||||
|
||||
|
@ -279,9 +245,7 @@ static inline int ssp_writeable(spi_t *obj) {
|
|||
static inline void ssp_write(spi_t *obj, int value) {
|
||||
SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
|
||||
while (!ssp_writeable(obj));
|
||||
if(obj->bits == SPI_DATASIZE_8BIT)
|
||||
spi->DR = (uint8_t)value; // 8 bit mode
|
||||
else spi->DR = (uint16_t)value; // 16 bit mode
|
||||
spi->DR = (uint16_t)value;
|
||||
}
|
||||
|
||||
static inline int ssp_read(spi_t *obj) {
|
||||
|
@ -314,7 +278,7 @@ int spi_slave_read(spi_t *obj) {
|
|||
void spi_slave_write(spi_t *obj, int value) {
|
||||
SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
|
||||
while (!ssp_writeable(obj));
|
||||
spi->DR = (uint8_t)value;
|
||||
spi->DR = (uint16_t)value;
|
||||
}
|
||||
|
||||
int spi_busy(spi_t *obj) {
|
||||
|
|
Loading…
Reference in New Issue