can总线学习笔记

近期因为项目需要需要使用can设备这里对can设备的学习,进行一个总结,主要包括can的介绍,linux下调试can设备,socketcan介绍,stm32 的can模块的使用。

can的介绍

can总线是ISO国际标准化的串行通讯协议。广泛的应用与汽车,船舶等控制系统。can总线通过两根线(can_H和can_L)的差分信号来确定总线的电平,在任意时刻,总线上面只有两种电平:显性电平和隐形电平(”显性”电平,只要总线上面只要有一个设备输出为显性电平,总线即为显性电平;只有当总线上面所有的设备均为隐形电平时,总线才为隐形电平)。

can总线的网络结构

1
2
3
4
5
6
___   ___   ___                   _______   ___
| _ | | _ | | _ | | _ _ | | _ |
||A|| ||B|| ||C|| ||A| |B|| ||C||
|___| |___| |___| |_______| |___|
| | | | |
-----------------(1)- CAN bus -(2)---------------

can总线的特点

can协议具有以下特点。

  1. 多主控制。
    • 在总线空闲的时候,所有的单元都可以开始发送消息。
    • 最先访问总线的单元可以获得总线的发送权限。
    • 多个单元同时开始发送消息,发送高优先级ID消息单元可以获得发送权限。
  2. 消息的发送。
    • 在can协议中。所有消息都以固定协议发送。
    • 空闲时所有与总线相连的单元都可以开始发送新的数据。
    • 两个以上的单元同时发送数据,仲裁获胜者可以继续发送。
  3. 系统的柔软性
    • 与总线相连的单元没有类似与地址的信息。因此在总线上面增加单元。连接在总线上的其他软硬件及应用层都不需要改变。
  4. 通信速度
    • 同一网络下所有单元必须设定成统一的通信速度
  5. 远程数据请求
    • 可以通过遥控帧,请求其他单元发送数据
  6. 错误检测功能·错误通知功能·错误恢复功能
    • 所有的单元都可以检测错误。
    • 检测出错误的单元会立即同时通知其他所有单元。
    • 正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复的重新发送此消息直到成功发送。
  7. 故障封闭
    • 当总线上面发生持续性数据错误时,将故障单元从总线上隔离出去。
  8. 连接
  • 降低通讯速度,可连接的单元数增加;提高通讯速度,可连接的单元数减少。

错误状态

总线上的单元始终处于三种状态:

  1. 主动错误状态:单元可以正常参加总线上的通讯。处于主动错误状态的单元检测出错误时,输出主动错误标志。
  2. 被动错误状态:被动错误状态是容易引起错误的状态。处于被动错误状态的单元能够参加总线通讯。处于被动错误状态的单元在发送结束后不能马上开始再次发送。在开始下次发送前,在间隔帧间必须插上延迟传送。
  3. 总线关闭状态:总线关闭状态下的单元不能参与总线上的通讯。

帧的种类

  1. 数据帧:用于发送单元向接受单元传送数据帧
  2. 遥控帧:用于接受单元向具有相同id的发送单元请求数据的帧。
  3. 错误帧:用于检测出错误时向其他单元通知错误的帧。
  4. 过载帧:用于接受单元通知其尚未做好准备的帧。
  5. 帧间隔:用于将数据帧及遥控帧与前面的帧分离出来的帧。

linux下面调试can设备

linux下面调试can设备需要记住下面命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ip link set can0 down	//关闭can设备
ip link set can0 up //开启can设备
ip -details link show can0 //显示can设备的详细信息
candump can0 //接受can总线发来的数据
ifconfig can0 down //关闭can设备,以便配置
ip link set can0 up type can bitrate 1000000 //设置can波特率
canconfig can0 bitrate + 波特率
canconfig can0 start //启动can设备
canconfig can0 ctrlmode loopback on //回环测试
canconfig can0 restart //重启can设备
canconfig can0 stop //停止can设备
canecho can0 //查看can设备总线状态
cansend can0 --identifer=ID+数据 //发送数据;
candump can0 --filter=ID:mask //使用滤波器接受ID匹配的数据

stm32 can模块的使用

在cubeMX的设置中可以看到需要设置can是master还是slave模式。但是实际的can总线中是没有主从设备之分的。cubeMX中的这个名字具有一定的误导性,实际上这个主从只是用于stm32内部关于can设备的一些公共资源如内存的一个区分,并不是实际上的主从关系。

参考资料

  1. can总线入门书。