推荐顺序:
spi_enable(SPI1); // 先使能 SPI
spi_dma_enable(SPI1, SPI_DMA_TRANSMIT); // 再打开 SPI DMA 发送功能
dma_channel_enable(DMA0, DMA_CHx); // 最后使能 DMA 通道
bidirectional 指的是3线制spi
spi不用dma,就只能通过循环,每次发送一个字节。
如果接收的数据不用,最好是读但不使用,否则可能有下面的问题
while (spi_i2s_flag_get(SPI0, SPI_FLAG_TBE) == RESET);
spi_i2s_data_transmit(SPI0, tx);
while (spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE) == RESET);
(void)spi_i2s_data_receive(SPI0); // 读出来但不用
场景:只发送,例如SPI驱动WS2812,使用 3 线制模式的只发送功能。
SPI 只有接收中断(接收缓冲区非空),一次一个字节。
SPI + DMA:无论发送还是接收,都要指定 DMA 传输的数据量。
DMA 按指定数量传输,它无法自动判断“什么时候结束”。
数据在物理上的传输是没有正负的概念的,正负取决于怎么理解这个数。比如将接收到的数据视为 int8_t 那他就是有符号的。
uint16_t spi_i2s_data_receive(uint32_t spi_periph)
{
return ((uint16_t)SPI_DATA(spi_periph));
}