实时线程上SPI的移植与实践
作为通信协议的两个基础,IIC和SPI被广泛使用。最后一篇文章谈到了IIC对RTT的移植和实践。看完IIC,自然有SPI相关的内容。基于此,本文将详细阐述实时线程上SPI的移植和实践。SPI的通信原理无需详细描述。百度一搜索,相应的知识点就清晰了。本文的主要内容是解释RTThread上SPI的一些细节。总的来说,我觉得RTThread的代码级别和每个设备驱动的核心文件都相当优秀。这不是广告,而是真的谁知道谁在用。随着慢慢学习,你会逐渐爱上它,你不得不赞美RTThread。的确,优秀来自于长期的积累和升华。好了,让我们开始这篇文章的主要介绍。
1.RTThread上的SPI设备“在线”
这里是“在线”,你可能会好奇。这只是我自己的理解。与RTThread设备的IIC总线不同,IIC总线注册后可以直接使用,SPI总线注册后相当于在内核中,还需要多一步。我对“在线”的理解是得到操作,即需要将SPI设备挂载到总线上才能进行相关操作。下面是代码中的细节。
注册:register函数,与内核系统中注册的其他设备是同一个例程。
“在线”:bus _attach_device,设备挂载在总线上,占用总线,通信开始。
以上也可以简单理解为一个过程,1、注册SPI总线,2、初始化相关硬件,3、在SPI总线上挂载设备,4、开始通信。
2.RTThread上的器件SPI
主文件分为三个部分,一个硬件驱动层:drv_spi.c,一个内核控制层spi_core.c,一个抽象层spi_dev.c三个文件分工明确,结构清晰。结合相关官方文件,参考rtthread设备驱动的相关架构,很容易理解这些文件中相关驱动的内容。以下是相关的工程文件。
内核的相关内容和相关功能显示整体清晰,局部细节有内涵,整体感觉RTThread相当优秀,层次清晰明了,值得学习和研究。相关功能和功能细节也可以在官方文件中查阅,以获得相关的专业解释。
内核与硬件之间的交互驱动也简洁明了一目了然。SPI也是一种通信协议,所以IIC的相关学科也是如此。与IIC驱动相比,读、写、控制多了一项与设备上总线初始化相关的功能,主要是设备与总线之间的相关绑定内容。详见下图。
3、RTThread设备SPI通信板级实践3.1、板级硬件
结合Demo板的原理图,芯片的硬件SPI1总线配备了两个器件,一个是flash,GD25Q16,另一个是LCD。两个SPI器件通过不同的GPIO引脚完成芯片选择。后续的板级实现主要是Flash的SPI控制实践。
3.2.SPI实践
SPI硬件对应GPIO功能设置,自然这些都是按规格相关操作,GPIO相关AF功能设置,以及对应的芯片数据表都有投诉,可以参考。
SPI配置,包括SPI模式、SPI位宽、SPI最大传输频率等参数。
3.3公共汽车登记
下图为RTThread发现的设备,包括IIC总线、SPI总线和对应的GPIO设备。
3.4.设备“在线”
“spi10”是“spi1”上的0号器件。查看list_device,我们发现了一个新设备“spi10”,它是一个安装在spi总线上的Flash设备。
结合自定义的SPI设备名称(当然这里的名称可以修改),执行设备挂载在SPI总线上,可以在设备列表中看到自定义的SPI设备。结合下面两张图,可以清晰地练习SPI总线和SPI设备的发现和“在线”。
3.5.读取SPI设备的芯片号
通过相关的地址读取FlashID和共享例程,实现了两次SPI操作读取FlashID。
4.摘要
通过学习和实践,感觉RTThread优秀而不简单,路漫漫其修远兮。还是需要保持自上而下的搜索心态,认真学习和体验这款实时操作系统的魅力,在后续坚持学以致用。文章中肯定有很多不完善的地方和不恰当的表达,希望大家给我提点建议。谢谢你。最后附上工程实践代码。
原标题:设备SPI移植及在RTThread上的实践
作者:颜正新1
这篇文章是一篇21世纪的获奖散文。详见21ic论坛活动区:万元红包3354蓝V达人二等奖征文活动。如果你也有兴趣参加征文,欢迎来论坛~