与 SPI 外设进行通信

[复制链接]
2003|17
 楼主| 感觉很反感mva 发表于 2025-2-24 11:05 | 显示全部楼层 |阅读模式
在 SPI 配置完成后,我们可以实现与外部 SPI 从设备如 OLED 屏幕、SPI Flash 存储器、加速度传感器等进行数据交换。
向外设发送数据
通过 SPI 主控发送数据时,使用 SPI_SendData() 函数将数据写入发送数据寄存器,主控通过 SPI 总线发送数据给从设备。

c
void SPI_Send(uint8_t data)
{
    // 等待 SPI 发送数据寄存器为空
    while (spi_i2s_flag_get(SPI0, SPI_FLAG_TBE) == RESET);

    // 发送数据
    spi_i2s_data_transmit(SPI0, data);
}
从外设接收数据
接收数据时,主控通过 SPI_ReceiveData() 函数读取接收数据寄存器中的数据。

c
uint8_t SPI_Receive(void)
{
    // 等待 SPI 接收数据寄存器不为空
    while (spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE) == RESET);

    // 返回接收到的数据
    return spi_i2s_data_receive(SPI0);
}

chenqianqian 发表于 2025-2-26 19:37 来自手机 | 显示全部楼层
这种发送方式效率太低了,要用DMA。
七毛钱 发表于 2025-2-27 11:09 | 显示全部楼层
如果SPI接口支持DMA,考虑使用DMA来发送数据,提高效率。
laocuo1142 发表于 2025-2-27 13:00 | 显示全部楼层
如果需要连续接收多个字节,可以考虑将接收操作放在一个循环中,或者使用DMA来接收数据块。
flycamelaaa 发表于 2025-2-27 16:00 | 显示全部楼层
注意处理可能的溢出情况,例如接收缓冲区在读取之前就已经被新的数据覆盖。
powerantone 发表于 2025-2-27 17:00 | 显示全部楼层
对于高速通信或需要处理大量数据的应用,使用中断或DMA比较好吧
stormwind123 发表于 2025-2-27 19:00 | 显示全部楼层
可以考虑使用宏或枚举来定义SPI的标志和寄存器地址
l1uyn9b 发表于 2025-3-19 13:47 | 显示全部楼层
GD的SPI应该也有例程,你看看吧,一般能直接使用
ex7s4 发表于 2025-3-19 15:01 | 显示全部楼层
这种SPI的话控制OLED确实方便
liu96jp 发表于 2025-3-19 16:25 | 显示全部楼层
你这个SPI是发送和接收啊,有没有关于配置SPI的啊?
y1n9an 发表于 2025-3-19 17:30 | 显示全部楼层
SPI通讯好像比I2C的速度还要快呢
w2nme1ai7 发表于 2025-3-19 18:41 | 显示全部楼层
话说,SPI发送数据是不是跟串口一样,就数据和长度一起发过去呢?
tax2r6c 发表于 2025-3-19 20:23 | 显示全部楼层
我看你这就是单个字节发送和接收啊
lamanius 发表于 2025-3-20 09:16 | 显示全部楼层
楼主SPI是使用的硬件SPI配置的是么
d1ng2x 发表于 2025-3-20 10:06 | 显示全部楼层
话说,SPI标记这个怎么理解呢?就有些flag不是很懂,楼主能多科普科普吗
cen9ce 发表于 2025-3-20 13:55 | 显示全部楼层
这种接收数据的操作算是中断接收吗?
zhizia4f 发表于 2025-3-20 16:41 | 显示全部楼层
SPI其实可以考虑使用DMA,这样就更好了
FranklinUNK 发表于 2025-3-20 22:43 来自手机 | 显示全部楼层
DMA配置起来复杂吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

68

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部