git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1255 35acf78f-673a-0410-8e92-d51de3d6d3f4

This commit is contained in:
gdisirio 2009-10-25 20:51:50 +00:00
parent 5d19ae768a
commit 34f29ab36c
1 changed files with 33 additions and 23 deletions

View File

@ -40,6 +40,9 @@ SPIDriver SPID1;
SPIDriver SPID2; SPIDriver SPID2;
#endif #endif
static uint16_t dummyrx;
static uint16_t dummytx;
/*===========================================================================*/ /*===========================================================================*/
/* Low Level Driver local functions. */ /* Low Level Driver local functions. */
/*===========================================================================*/ /*===========================================================================*/
@ -75,6 +78,8 @@ CH_IRQ_HANDLER(Vector78) {
*/ */
void spi_lld_init(void) { void spi_lld_init(void) {
dummyrx = dummytx = 0xFFFF;
#if USE_STM32_SPI1 #if USE_STM32_SPI1
spiObjectInit(&SPID1); spiObjectInit(&SPID1);
SPID1.spd_spi = SPI1; SPID1.spd_spi = SPI1;
@ -104,28 +109,10 @@ void spi_lld_init(void) {
void spi_lld_setup(SPIDriver *spip) { void spi_lld_setup(SPIDriver *spip) {
/* SPI setup.*/ /* SPI setup.*/
spip->spd_spi->CR1 = spip->spd_config->spc_cr1; spip->spd_spi->CR1 = spip->spd_config->spc_cr1 | SPI_CR1_MSTR;
spip->spd_spi->CR2 = SPI_CR2_SSOE | SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN;
/* DMA setup.*/ /* DMA setup.*/
if ((spip->spd_config->spc_cr1 & SPI_CR1_DFF) != 0) {
/* Prepares for 16 bits transfer.*/
spip->spd_dmarx->CCR = spip->spd_dmaprio |
DMA_CCR1_MSIZE_0 | DMA_CCR1_PSIZE_0 |
DMA_CCR1_MINC |
DMA_CCR1_TEIE | DMA_CCR1_TCIE;
spip->spd_dmatx->CCR = spip->spd_dmaprio |
DMA_CCR1_MSIZE_0 | DMA_CCR1_PSIZE_0 |
DMA_CCR1_MINC | DMA_CCR1_DIR |
DMA_CCR1_TEIE | DMA_CCR1_TCIE;
}
else {
/* Prepares for 8 bits transfer.*/
spip->spd_dmarx->CCR = spip->spd_dmaprio | DMA_CCR1_MINC |
DMA_CCR1_TEIE | DMA_CCR1_TCIE;
spip->spd_dmatx->CCR = spip->spd_dmaprio |
DMA_CCR1_MINC | DMA_CCR1_DIR |
DMA_CCR1_TEIE | DMA_CCR1_TCIE;
}
spip->spd_dmarx->CPAR = (uint32_t)&spip->spd_spi->DR; spip->spd_dmarx->CPAR = (uint32_t)&spip->spd_spi->DR;
spip->spd_dmatx->CPAR = (uint32_t)&spip->spd_spi->DR; spip->spd_dmatx->CPAR = (uint32_t)&spip->spd_spi->DR;
} }
@ -169,12 +156,35 @@ void spi_lld_unselect(SPIDriver *spip) {
* an uint16_t array. * an uint16_t array.
*/ */
void spi_lld_exchange(SPIDriver *spip, size_t n, void *rxbuf, void *txbuf) { void spi_lld_exchange(SPIDriver *spip, size_t n, void *rxbuf, void *txbuf) {
uint32_t baseccr, ccr;
/* DMA setup.*/ /* Common DMA setup.*/
baseccr = spip->spd_dmaprio;
if ((spip->spd_config->spc_cr1 & SPI_CR1_DFF) != 0)
baseccr |= DMA_CCR1_MSIZE_0 | DMA_CCR1_PSIZE_0; /* 16 bits transfer.*/
/* RX DMA setup.*/
ccr = baseccr | DMA_CCR1_TCIE | DMA_CCR1_TEIE | DMA_CCR1_EN;
if (rxbuf == NULL)
rxbuf = &dummyrx;
else
ccr |= DMA_CCR1_MINC;
spip->spd_dmarx->CMAR = (uint32_t)rxbuf;
spip->spd_dmarx->CNDTR = (uint32_t)n; spip->spd_dmarx->CNDTR = (uint32_t)n;
spip->spd_dmarx->CCR = ccr;
/* TX DMA setup.*/
ccr = baseccr | DMA_CCR1_DIR | DMA_CCR1_TEIE | DMA_CCR1_EN;
if (txbuf == NULL)
txbuf = &dummytx;
else
ccr |= DMA_CCR1_PINC;
spip->spd_dmatx->CMAR = (uint32_t)txbuf;
spip->spd_dmatx->CNDTR = (uint32_t)n; spip->spd_dmatx->CNDTR = (uint32_t)n;
spip->spd_dmarx->CMAR = (uint32_t)rxbuf; spip->spd_dmatx->CCR = ccr;
spip->spd_dmatx->CMAR = (uint32_t)txbuf;
/* SPI enable.*/
spip->spd_spi->CR1 != SPI_CR1_SPE;
} }
/** @} */ /** @} */