RT-Thread上的CAN总线介绍以及驱动编写
线的时候,那肯定是标准帧获得总线控制权。
DLC位代表数据长度,一共四位,有效值是0—8,9到15没有效,他代表数据场,指后面的数据场里面一共有多少个字节能够被传送。再然后是15位CRC位,因为这个CRC校验的起始是从帧开始一直到数据场的结束,整个这一串的位数参加这个CRC校验。CRC检验完事之后是一个DR位,这位叫做CRC界定服务,到这里就表示CRC校验完事了,后面就是应答场。对于我们这个用户来说,在实际的编程应用当中,我们用户一般的需要做的其实是仲裁场以及控制场和数据场,上其他的CRC场场、ASK场均结束。一般不需要用户进行参与,这些都是由CAN控制器来自动完成的。
我们再来看扩展帧。扩展帧首先前面的11位帧ID先不,后面看RTR位后面。SR位与RTR位是在同一个位置上,RTR位叫做远程传送请求位,SR位叫做远程请求替代位,后面的部分就跟标准一样,这个就不再多。真正的RRT位被移送到了29位的帧ID的后面,那么SR位或者是RTR位在标准帧或者是在扩展帧当中,它也有高电平还是低电平。那么在标准帧当中同样的位RTR一定是显性电平,而在扩展帧当中这个一定是隐性电平。
再一下,远程帧。远程帧同样分为两种,就是根据这ID的位数不同,分为标准远程帧和扩展远程帧,我们看一下图上的这个RTR位,在这他就是一个隐形电平,就明他是一个远程帧, 远程侦和数据帧的主要区别就是在于除了这个RTR位之外,还有一个区别远程帧没有数据场,是不带数据的。
远程侦在总线的主要作用是什么呢?就是我们知道CAN总线是多主的,就是大家都是平等的,向总线上各自发送数据,这个就像我们在微信群里聊天一样,有人一直往这个群体方式发送一些消息。但是假如其中有人觉得你发送的消息不是我想要的,或者不满足我的要求那么怎么办呢?我就会主动给你请求数据,那么我就向你发送这个远程侦那。至于你向谁请求数据、请求的是什么数据,那我可以都可以包含在帧ID当中,而且也只能包含在帧ID当中,因为这个远程侦当中他没有数据场,你所有的数据的意义只能在帧I当中,也基本上就相当于你的那个数据的个性化定制吧。
在这点与modbus的0X03和0X06呢比较类似,相当于取多个或单个寄存器的数据命令,指主动的索取数据。这条命令,举一个应用的场合吧。比方在火灾预警的场合,一般现实的过程当中鉴定火灾的几个要素:一个是温度,一个是烟雾,另外一个是一氧化碳的浓度。烟雾传感器、一氧化碳传感器还有温度传感器,他们都是同样挂在一条CAN主线当中,假如现在监测到烟雾传感器烟雾浓度变大了,但是我们知道目前的烟雾传感器有一个最大问题对水蒸气特别敏感,即使水蒸气浓度很高,烟雾传感器就会误报警。那么为了确认当前确实是烟雾传感器误报警,还是确实发生了火灾,那么我们就要及时看到当前一氧化碳的浓度以及温度的情况。这时候我可以主动发送一个远程侦来索取一氧化碳传感器的数据以及温度传感器的数据,通过这几个传感器的数据进行综合的比较,或者是按照一定的算法,我们就可以知道现在是否确实发生了火灾,还是烟雾传感器进行了误报警。这样就可以防止一些不必要的误报警,因为误报警会有很多的问题。关于CAN的帧格式的一些介绍就简单介绍到这里。
下面就进入到RT-Thread上的CAN驱动的编写部分,一些刚接触到RTT的一些朋友,可能觉得这个学这个驱动比较困难,或者是不知道无从下手。
其实你看一下就是RTT上面现有的一些设备的驱动,比方串口的、SPI的等等一些现有设备的驱动,仔细揣摩一下,自带这个驱动都写得很规范,大家可以完全可以借鉴和模仿,那么这个驱动其实主要实现在这个图片上列出来这七个函数,我们能把这些函数都实现了,并且把设备注册到这个系统内核当中,这个设备的驱动也就基本完成。我今天讲的这个CAN的驱动是在1.2.3版本的串口驱动上改写的,当时的这个串口驱动跟现在还是有很大区别的,一会大家可以看一下。
- CAN总线镍氢电池管理解决方案(04-23)
- CAN总线在机车监控系统中的应用(04-04)
- 基于can总线技术的电子控制系统单元在汽车网络系统中的应用(07-16)
- CAN总线+单片机实现通信网络设计(08-27)
- 基于S3C2440处理器和WinCE的智能车载仪表设计(02-04)
- 基于CDMA和CAN总线的车辆远程故障诊断系统(02-20)