在之前的分享中,我们聊了PX4的通信框架和任务调度框架,现在我们讲一下PX4的设备驱动。
PX4支持很多种设备,根据通信方式的不同大致分为:SPI/IIC设备、串口设备、IO设备、CAN设备。这一篇讲一下PX4的SPI/IIC设备。
PX4每个版本中设备驱动都有一些明变化,我们以PX4-1.11.3版本为例,l3gd20陀螺仪设备类的继承关系图如图所示:
![图片](https://img-blog.csdnimg.cn/img_convert/f2f69e1efd28dbfad6ff4b367175024e.png)
对于IIC设备与其类似,以磁罗盘ist8310为例
![图片](https://img-blog.csdnimg.cn/img_convert/6922232da329b737cc77b7a579e432bf.png)
可以发现,SPI和IIC设备都继承了I2CSPIDriver这个类,而这个类继承自两个类
一个是ScheduledWorkItem,这个类封装了设备任务调度需要的接口,这个部分上一篇分享 PX4的任务调度中讲过了,这里不再分析。
另外一个是I2CSPIInstance类,这个类主要定义了SPI和IIC设备参数的定义,如:总线地址、速度、操作等
我们主要讲一下device::SPI和device::IIC类,SPI和IIC这两个类结构类似,我们以SPI类为例,它定义了SPI总线的接口,用于操作SPI总线进行数据读写。SPI类的继承图如图所示:
![图片](https://img-blog.csdnimg.cn/img_convert/1068e3f61b99655162ceb8c4ecfb4ac1.png)
device::SPI继承了两个类,一个是cdev::CDev,另外一个是device::Device
device::Device主要是总线信息的描述信息,从接口函数可以知道,主要是定义了总线id、类型、地址以及总线的读写接口。
cdev::CDev是PX4封装的字符设备接口类,提供了字符设备注册、open、close、read、write等操作的C++接口。在PX4早期的版本中spi/iic等字符设备使用cdev::CDev提供了字符设备的驱动接口,即实现了cdev::CDev的open、close、read、write等接口,应用层可以通过设备地址/dev/xxx进行open、close、read、write等操作,目前的版本去掉了这些接口的实现,仅有uORB的数据输出方式。
说完SPI设备的类的继承关系,我们来看一下SPI设备的运行时序是怎么样的。
l3gd20设备的运行时序如图所示:
![图片](https://img-blog.csdnimg.cn/img_convert/6f3eaad65ce9432d107fd2fc2925716b.png)
上图简化了任务调度部分的时序,仅体现会定时队列任务,参考上一篇 PX4-4-任务调度 分享中的任务队列时序图。
简单而言SPI设备的时序分为启动和运行,启动部分是驱动任务的初始化,SPI的初始化和设备本身的初始化,运行部分则使用PX4的任务队列功能进行周期性数据更新。
PX4如何处理传感器驱动更新的原始数据,在融合算法应用和控制应用中使用,我们在后面的分享中再讨论。
IIC设备的时序与SPI设备类似,这里不再单独分析,感兴趣的同学可以自己研究绘制一下它的时序图。
以上的图表是使用 工欲善其事-4-绘制程序流程图 方法绘制,由于微信不能插入该绘图插件,因此采用图片方式上传,显示的分辨率可能有限。
需要图表源代码的同学可以在我的公众号中回复 SPI驱动 关键字获取,直接将源码复制到typora编辑器的源代码编辑模式中即可显示出图表,也可以自行编辑补充图表。
往期分享:
AcmeGCS-5-模拟国庆阅兵
http://mp.weixin.qq.com/s?__biz=Mzg4MjY2MDM5NQ==&mid=2247483797&idx=1&sn=c5518a49b4fa5cd4f8a983a18c3970b9&chksm=cf5204d1f8258dc71ca08beb19d46a839986283db518a1d22d493f94389fb90533a4351ed88e&scene=21#wechat_redirect
Uav开发杂记-2-无人机的RTOS
http://mp.weixin.qq.com/s?__biz=Mzg4MjY2MDM5NQ==&mid=2247483780&idx=1&sn=82cf7a3a7cec75ad797336475cf08d53&chksm=cf5204c0f8258dd6935a5cd30494bbb0f27eea98c9c34bdb49d9d5b9d5e39db6f2e83f1d8295&scene=21#wechat_redirect
PX4-4-任务调度
http://mp.weixin.qq.com/s?__biz=Mzg4MjY2MDM5NQ==&mid=2247483771&idx=1&sn=11bc3612d63dc1c928c99b2676555657&chksm=cf52043ff8258d29f56f358fc8dea574bf8904276ec4bda20a60da20969fea3f27793103ade9&scene=21#wechat_redirect
这个博客转载自我个人的微信公众号,这里会不定期更新一些我整理的无人机相关知识和个人设计,欢迎添加关注。
![](https://img-blog.csdnimg.cn/20210825095256898.jpg)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)