Added code to 'get' the gpio mode of a pin, and have used it in SPIClass::begin() to store and reinstate the pin mode of the SPI NSS pin. This is a work around for 'features' in the STM32 silicon, which seem to change the GPIO mode of the SPI NSS (hardware - 'Software Select' pin)
This commit is contained in:
parent
ef03bcdfdc
commit
ece9c3681d
|
@ -138,6 +138,23 @@ void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode) {
|
|||
}
|
||||
}
|
||||
|
||||
gpio_pin_mode gpio_get_mode(gpio_dev *dev, uint8 pin) {
|
||||
gpio_reg_map *regs = dev->regs;
|
||||
__io uint32 *cr = ®s->CRL + (pin >> 3);
|
||||
uint32 shift = (pin & 0x7) * 4;
|
||||
uint32 tmp = *cr;
|
||||
|
||||
uint32 crMode = (*cr>>shift) & 0x0F;
|
||||
|
||||
// could be pull up or pull down. Nee to check the ODR
|
||||
if (crMode==GPIO_INPUT_PD && ((regs->ODR >> pin) & 0x01) !=0 )
|
||||
{
|
||||
crMode = GPIO_INPUT_PU;
|
||||
}
|
||||
|
||||
return(crMode);
|
||||
}
|
||||
|
||||
/*
|
||||
* AFIO
|
||||
*/
|
||||
|
|
|
@ -119,10 +119,35 @@ SPIClass::SPIClass(uint32 spi_num) {
|
|||
*/
|
||||
|
||||
void SPIClass::begin(void) {
|
||||
gpio_pin_mode nssPinMode;
|
||||
int nssPin;
|
||||
if (dataMode >= 4) {
|
||||
ASSERT(0);
|
||||
return;
|
||||
}
|
||||
|
||||
#if BOARD_NR_SPI >= 1
|
||||
if (this->spi_d == SPI1)
|
||||
{
|
||||
nssPin=BOARD_SPI1_NSS_PIN;
|
||||
}
|
||||
#endif
|
||||
#if BOARD_NR_SPI >= 2
|
||||
if (this->spi_d == SPI2)
|
||||
{
|
||||
nssPin=BOARD_SPI2_NSS_PIN;
|
||||
}
|
||||
#endif
|
||||
#if BOARD_NR_SPI >= 3
|
||||
if (this->spi_d == SPI3)
|
||||
{
|
||||
nssPin=BOARD_SPI3_NSS_PIN;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
nssPinMode = gpio_get_mode(PIN_MAP[nssPin].gpio_device, PIN_MAP[nssPin].gpio_bit);// get and save NSS pin mode
|
||||
|
||||
uint32 flags = ((bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | SPI_DFF_8_BIT | SPI_SW_SLAVE | SPI_SOFT_SS);
|
||||
spi_init(spi_d);
|
||||
configure_gpios(spi_d, 1);
|
||||
|
@ -130,6 +155,7 @@ void SPIClass::begin(void) {
|
|||
Serial.print("spi_master_enable("); Serial.print(clockDivider); Serial.print(","); Serial.print(dataMode); Serial.print(","); Serial.print(flags); Serial.println(")");
|
||||
#endif
|
||||
spi_master_enable(spi_d, (spi_baud_rate)clockDivider, (spi_mode)dataMode, flags);
|
||||
gpio_set_mode(PIN_MAP[nssPin].gpio_device, PIN_MAP[nssPin].gpio_bit, nssPinMode);// restore pin mode of nss pin (work around for bug in the STM32)
|
||||
}
|
||||
|
||||
void SPIClass::beginSlave(void) {
|
||||
|
|
|
@ -71,7 +71,7 @@ void gpio_init(gpio_dev *dev);
|
|||
void gpio_init_all(void);
|
||||
/* TODO flags argument version? */
|
||||
void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode);
|
||||
|
||||
gpio_pin_mode gpio_get_mode(gpio_dev *dev, uint8 pin);
|
||||
/**
|
||||
* @brief Get a GPIO port's corresponding EXTI port configuration.
|
||||
* @param dev GPIO port whose exti_cfg to return.
|
||||
|
|
Loading…
Reference in New Issue