mirror of https://github.com/ARMmbed/mbed-os.git
Support SPI CPP objects with different pinouts sharing the same peripheral
parent
15c28056c2
commit
946321032c
|
@ -117,7 +117,8 @@ struct serial_s {
|
||||||
#if DEVICE_SPI
|
#if DEVICE_SPI
|
||||||
struct spi_s {
|
struct spi_s {
|
||||||
USART_TypeDef *spi;
|
USART_TypeDef *spi;
|
||||||
int location;
|
uint32_t location;
|
||||||
|
uint32_t route;
|
||||||
uint8_t bits;
|
uint8_t bits;
|
||||||
uint8_t master;
|
uint8_t master;
|
||||||
#if DEVICE_SPI_ASYNCH
|
#if DEVICE_SPI_ASYNCH
|
||||||
|
|
|
@ -213,10 +213,12 @@ void spi_enable_pins(spi_t *obj, uint8_t enable, PinName mosi, PinName miso, Pin
|
||||||
obj->spi.spi->ROUTELOC0 &= ~_USART_ROUTELOC0_CSLOC_MASK;
|
obj->spi.spi->ROUTELOC0 &= ~_USART_ROUTELOC0_CSLOC_MASK;
|
||||||
obj->spi.spi->ROUTELOC0 |= pin_location(cs, PinMap_SPI_MOSI)<<_USART_ROUTELOC0_CSLOC_SHIFT;
|
obj->spi.spi->ROUTELOC0 |= pin_location(cs, PinMap_SPI_MOSI)<<_USART_ROUTELOC0_CSLOC_SHIFT;
|
||||||
}
|
}
|
||||||
|
obj->spi.location = obj->spi.spi->ROUTELOC0;
|
||||||
|
obj->spi.route = route;
|
||||||
obj->spi.spi->ROUTEPEN = route;
|
obj->spi.spi->ROUTEPEN = route;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
uint32_t route = USART_ROUTE_CLKPEN | (obj->spi.location << _USART_ROUTE_LOCATION_SHIFT);
|
uint32_t route = USART_ROUTE_CLKPEN;
|
||||||
|
|
||||||
if (mosi != NC) {
|
if (mosi != NC) {
|
||||||
route |= USART_ROUTE_TXPEN;
|
route |= USART_ROUTE_TXPEN;
|
||||||
|
@ -227,7 +229,9 @@ void spi_enable_pins(spi_t *obj, uint8_t enable, PinName mosi, PinName miso, Pin
|
||||||
if (!obj->spi.master) {
|
if (!obj->spi.master) {
|
||||||
route |= USART_ROUTE_CSPEN;
|
route |= USART_ROUTE_CSPEN;
|
||||||
}
|
}
|
||||||
|
route |= obj->spi.location << _USART_ROUTE_LOCATION_SHIFT;
|
||||||
obj->spi.spi->ROUTE = route;
|
obj->spi.spi->ROUTE = route;
|
||||||
|
obj->spi.route = route;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
void spi_enable(spi_t *obj, uint8_t enable)
|
void spi_enable(spi_t *obj, uint8_t enable)
|
||||||
|
@ -324,14 +328,6 @@ void spi_format(spi_t *obj, int bits, int mode, int slave)
|
||||||
default:
|
default:
|
||||||
clockMode = usartClockMode0;
|
clockMode = usartClockMode0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//save state
|
|
||||||
#ifdef _USART_ROUTEPEN_RESETVALUE
|
|
||||||
uint32_t route = obj->spi.spi->ROUTEPEN;
|
|
||||||
uint32_t loc = obj->spi.spi->ROUTELOC0;
|
|
||||||
#else
|
|
||||||
uint32_t route = obj->spi.spi->ROUTE;
|
|
||||||
#endif
|
|
||||||
uint32_t iflags = obj->spi.spi->IEN;
|
uint32_t iflags = obj->spi.spi->IEN;
|
||||||
bool enabled = (obj->spi.spi->STATUS & (USART_STATUS_RXENS | USART_STATUS_TXENS)) != 0;
|
bool enabled = (obj->spi.spi->STATUS & (USART_STATUS_RXENS | USART_STATUS_TXENS)) != 0;
|
||||||
|
|
||||||
|
@ -339,10 +335,10 @@ void spi_format(spi_t *obj, int bits, int mode, int slave)
|
||||||
|
|
||||||
//restore state
|
//restore state
|
||||||
#ifdef _USART_ROUTEPEN_RESETVALUE
|
#ifdef _USART_ROUTEPEN_RESETVALUE
|
||||||
obj->spi.spi->ROUTEPEN = route;
|
obj->spi.spi->ROUTEPEN = obj->spi.route;
|
||||||
obj->spi.spi->ROUTELOC0 = loc;
|
obj->spi.spi->ROUTELOC0 = obj->spi.location;
|
||||||
#else
|
#else
|
||||||
obj->spi.spi->ROUTE = route;
|
obj->spi.spi->ROUTE = obj->spi.route;
|
||||||
#endif
|
#endif
|
||||||
obj->spi.spi->IEN = iflags;
|
obj->spi.spi->IEN = iflags;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue