没志青年
发布于 2025-07-02 / 20 阅读
0

GD32 SPI 通信

推荐顺序:

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,就只能通过循环,每次发送一个字节。

如果接收的数据不用,最好是读但不使用,否则可能有下面的问题

后果

表现

RX 缓冲满

RBNE 一直置位

发生溢出

OVR 错误

SPI 停止

后续通信异常

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));
}