近期因为项目需要需要使用can设备这里对can设备的学习,进行一个总结,主要包括can的介绍,linux下调试can设备,socketcan介绍,stm32 的can模块的使用。
can的介绍
can总线是ISO国际标准化的串行通讯协议。广泛的应用与汽车,船舶等控制系统。can总线通过两根线(can_H和can_L)的差分信号来确定总线的电平,在任意时刻,总线上面只有两种电平:显性电平和隐形电平(”显性”电平,只要总线上面只要有一个设备输出为显性电平,总线即为显性电平;只有当总线上面所有的设备均为隐形电平时,总线才为隐形电平)。
can总线的网络结构
1 | ___ ___ ___ _______ ___ |
can总线的特点
can协议具有以下特点。
- 多主控制。
- 在总线空闲的时候,所有的单元都可以开始发送消息。
- 最先访问总线的单元可以获得总线的发送权限。
- 多个单元同时开始发送消息,发送高优先级ID消息单元可以获得发送权限。
- 消息的发送。
- 在can协议中。所有消息都以固定协议发送。
- 空闲时所有与总线相连的单元都可以开始发送新的数据。
- 两个以上的单元同时发送数据,仲裁获胜者可以继续发送。
- 系统的柔软性
- 与总线相连的单元没有类似与地址的信息。因此在总线上面增加单元。连接在总线上的其他软硬件及应用层都不需要改变。
- 通信速度
- 同一网络下所有单元必须设定成统一的通信速度
- 远程数据请求
- 可以通过遥控帧,请求其他单元发送数据
- 错误检测功能·错误通知功能·错误恢复功能
- 所有的单元都可以检测错误。
- 检测出错误的单元会立即同时通知其他所有单元。
- 正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复的重新发送此消息直到成功发送。
- 故障封闭
- 当总线上面发生持续性数据错误时,将故障单元从总线上隔离出去。
- 连接
- 降低通讯速度,可连接的单元数增加;提高通讯速度,可连接的单元数减少。
错误状态
总线上的单元始终处于三种状态:
- 主动错误状态:单元可以正常参加总线上的通讯。处于主动错误状态的单元检测出错误时,输出主动错误标志。
- 被动错误状态:被动错误状态是容易引起错误的状态。处于被动错误状态的单元能够参加总线通讯。处于被动错误状态的单元在发送结束后不能马上开始再次发送。在开始下次发送前,在间隔帧间必须插上延迟传送。
- 总线关闭状态:总线关闭状态下的单元不能参与总线上的通讯。
帧的种类
- 数据帧:用于发送单元向接受单元传送数据帧
- 遥控帧:用于接受单元向具有相同id的发送单元请求数据的帧。
- 错误帧:用于检测出错误时向其他单元通知错误的帧。
- 过载帧:用于接受单元通知其尚未做好准备的帧。
- 帧间隔:用于将数据帧及遥控帧与前面的帧分离出来的帧。
linux下面调试can设备
linux下面调试can设备需要记住下面命令
1 | ip link set can0 down //关闭can设备 |
stm32 can模块的使用
在cubeMX的设置中可以看到需要设置can是master还是slave模式。但是实际的can总线中是没有主从设备之分的。cubeMX中的这个名字具有一定的误导性,实际上这个主从只是用于stm32内部关于can设备的一些公共资源如内存的一个区分,并不是实际上的主从关系。
参考资料
- can总线入门书。