打印

与 SPI 外设进行通信

[复制链接]
882|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在 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来接收数据块。

使用特权

评论回复
5
flycamelaaa| | 2025-2-27 16:00 | 只看该作者
注意处理可能的溢出情况,例如接收缓冲区在读取之前就已经被新的数据覆盖。

使用特权

评论回复
6
powerantone| | 2025-2-27 17:00 | 只看该作者
对于高速通信或需要处理大量数据的应用,使用中断或DMA比较好吧

使用特权

评论回复
7
stormwind123| | 2025-2-27 19:00 | 只看该作者
可以考虑使用宏或枚举来定义SPI的标志和寄存器地址

使用特权

评论回复
8
l1uyn9b| | 2025-3-19 13:47 | 只看该作者
GD的SPI应该也有例程,你看看吧,一般能直接使用

使用特权

评论回复
9
ex7s4| | 2025-3-19 15:01 | 只看该作者
这种SPI的话控制OLED确实方便

使用特权

评论回复
10
liu96jp| | 2025-3-19 16:25 | 只看该作者
你这个SPI是发送和接收啊,有没有关于配置SPI的啊?

使用特权

评论回复
11
y1n9an| | 2025-3-19 17:30 | 只看该作者
SPI通讯好像比I2C的速度还要快呢

使用特权

评论回复
12
w2nme1ai7| | 2025-3-19 18:41 | 只看该作者
话说,SPI发送数据是不是跟串口一样,就数据和长度一起发过去呢?

使用特权

评论回复
13
tax2r6c| | 2025-3-19 20:23 | 只看该作者
我看你这就是单个字节发送和接收啊

使用特权

评论回复
14
lamanius| | 2025-3-20 09:16 | 只看该作者
楼主SPI是使用的硬件SPI配置的是么

使用特权

评论回复
15
d1ng2x| | 2025-3-20 10:06 | 只看该作者
话说,SPI标记这个怎么理解呢?就有些flag不是很懂,楼主能多科普科普吗

使用特权

评论回复
16
cen9ce| | 2025-3-20 13:55 | 只看该作者
这种接收数据的操作算是中断接收吗?

使用特权

评论回复
17
zhizia4f| | 2025-3-20 16:41 | 只看该作者
SPI其实可以考虑使用DMA,这样就更好了

使用特权

评论回复
18
FranklinUNK| | 2025-3-20 22:43 | 只看该作者
DMA配置起来复杂吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

65

帖子

0

粉丝