Apтём (04.11.2014 15:54, просмотров: 12608)
Пытаюсь запустить передачу данных по SPI на STM32F4 - не получается. Инициализация DMA:
INLINE static bool SpiDmaReady()
{
return (DMA2_Stream3->CR&DMA_SxCR_EN) ? false : true;
}
INLINE static void SpiDmaDisable()
{
DMA2_Stream3->CR=~DMA_SxCR_EN;
}
INLINE static void StartSpiDmaTransfer(uint32_t * spi_data_address, uint16_t transfer_size)
{
DMA2->LIFCR=0
| DMA_LIFCR_CTCIF3
| DMA_LIFCR_CHTIF3
| DMA_LIFCR_CTEIF3
| DMA_LIFCR_CDMEIF3
| DMA_LIFCR_CFEIF3
;
DMA2_Stream3->PAR=(uint32_t)&SPI1->DR;
DMA2_Stream3->M0AR=(uint32_t)spi_data_address;
DMA2_Stream3->NDTR=transfer_size/sizeof(uint16_t);
// channel
DMA2_Stream3->CR=0
| DMA_SxCR_CHSEL_0
| DMA_SxCR_CHSEL_1
;
// priority
DMA2_Stream3->CR|=0
| DMA_SxCR_PL_0
| DMA_SxCR_PL_1
;
// FIFO
// data transfer direction
DMA2_Stream3->CR|=0
| DMA_SxCR_DIR_0
;
// peripheral and memory incremented mode
DMA2_Stream3->CR|=0
| DMA_SxCR_MINC
;
// single or burst transactions
// peripheral and memory data widths
DMA2_Stream3->CR|=0
| DMA_SxCR_MSIZE_0
| DMA_SxCR_PSIZE_0
;
// Circular mode
// Double buffer mode
// interrupts
DMA2_Stream3->CR|=0
| DMA_SxCR_TCIE
;
// enable transfer
DMA2_Stream3->CR|=0
| DMA_SxCR_EN
;
}
Инициализация SPI:
INLINE static void InitLedSpi()
{
SPI1->CR1=0
| SPI_CR1_DFF
| SPI_CR1_SSM
| SPI_CR1_SSI
| SPI_CR1_BR_2
| SPI_CR1_BR_1
| SPI_CR1_BR_0
| SPI_CR1_SPE
| SPI_CR1_MSTR
;
SPI1->CR2=0;
}
Запуск передачи:
if (SpiDmaReady()) {
StartLedTimer(15);
SpiWordCounter=0;
StartSpiDmaTransfer((uint32_t *)spi_data_ptr, 32);
// LedSpiSend(*spi_data_ptr++);
}
else {
send_divider=9;
SpiWordCounter=0;
SpiDmaDisable();
}
Ничего не передаётся - что же я забыл? Спасибо.