随笔 - 733  文章 - 2  评论 - 12  阅读 - 92万

RTT设备与驱动之SPI

SPI全双工设备的操作分为主设备和从设备(可以多个,多线程下从设备访问主设备要先获得总线控制权)

rt_device_t rt_device_find(const char* name);查找设备
struct rt_spi_message *rt_spi_transfer_message(struct rt_spi_device  *device,struct rt_spi_message *message)发送消息,以单向链表形式
void rt_spi_message_append(struct rt_spi_message *list,struct rt_spi_message *message);向链表中增加一条待传输的消息。
传输一次:
rt_size_t rt_spi_transfer(struct rt_spi_device *device,
                          const void           *send_buf,
                          void                  *recv_buf,
                          rt_size_t             length);

发送一次:
rt_size_t rt_spi_send(struct rt_spi_device *device,
                      const void           *send_buf,
                      rt_size_t             length)
接收一次
rt_size_t rt_spi_recv(struct rt_spi_device *device,
                      void                 *recv_buf,
                      rt_size_t             length);
发送2
rt_err_t rt_spi_send_then_send(struct rt_spi_device *device,
                               const void           *send_buf1,
                               rt_size_t             send_length1,
                               const void           *send_buf2,
                               rt_size_t             send_length2);
先发后收
rt_err_t rt_spi_send_then_recv(struct rt_spi_device *device,
                               const void           *send_buf,
                               rt_size_t             send_length,
                               void                 *recv_buf,
                               rt_size_t             recv_length);

多线程下使用总线需要下面个函数:
rt_err_t rt_spi_take_bus(struct rt_spi_device *device);获取总线
rt_err_t rt_spi_take(struct rt_spi_device *device);选中片选
rt_err_t rt_spi_release(struct rt_spi_device *device);取消片选
rt_err_t rt_spi_release_bus(struct rt_spi_device *device)释放总线

特殊使用场景

在一些特殊的使用场景,某个设备希望独占总线一段时间,且期间要保持片选一直有效,期间数据传输可能是间断的,则可以按照如所示步骤使用相关接口。传输数据函数必须使用 rt_spi_transfer_message(),并且此函数每个待传输消息的片选控制域 cs_take 和 cs_release 都要设置为 0 值,因为片选已经使用了其他接口控制,不需要在数据传输的时候控制
rt_spi_transfer_message()
2 SPI从机模式:
 设置SPI从机模式,CS下降沿中断释放的信号量,解除SPI接收线程的阻塞,然后创建内存池,设置DMA接收长度,启动DMA接收;SPI的DMA接收完成回调中通过邮箱将接收内容发送出去;解析线程收到邮箱后进行解析,最后释放内存池。 难点在于在几个us内准备好回传的数据,这要求从机速度要组够快。
 或者通过2个IO引脚握手,进行主从轮换。
posted on   杰瑞鼠  阅读(1188)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2018-01-15 三极管
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示