CAN

前置知识

差分信号
差分信号又称差模信号,与传统使用单根信号线电压表示逻辑的方式有区别,使用差分信号传输时,需要两根信号线,这两个信号线的振幅相等,相位相反,通过两根信号线的电压差值来表示逻辑0和逻辑1。

c1201-dcdc

CAN总线

  • CAN(Controller Area Network)是 ISO国际标准化的串行通信协议。主要用于工业级联网和嵌入式系统,支持多设备联网;

  • CAN总线上可以挂载多个通讯节点,节点之间的信号进过总线传输,实现节点间通讯;

  • CAN 通讯节点由一个 CAN 控制器及 CAN 收发器组成,控制器与收发器之间通过CAN_Tx 及CAN_Rx 信号线相连,收发器与 CAN 总线之间使用 CAN_High 及 CAN_Low信号线相连。其中 CAN_Tx 及 CAN_Rx 使用普通的类似 TTL 逻辑信号,而 CAN_High 及CAN_Low 是一对差分信号线,使用差分信号;

  • 当 CAN 节点需要发送数据时,控制器把要发送的二进制编码通过 CAN_Tx 线发送到收发器,然后由收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线CAN_High 和 CAN_Low 线输出到 CAN 总线网络。而通过收发器接收总线上的数据到控制器时,则是相反的过程,收发器把总线上收到的 CAN_High 及 CAN_Low 信号转化成普通的逻辑电平信号,通过 CAN_Rx 输出到控制器中。

c1201-dcdc

接口说明

C1201载板上的CAN接口

c1201-dcdc

c1201-dcdc

接口实验

CAN内回环通信实验

实验步骤
1.启用CAN内核驱动
加载CAN相关的内核模块,为后续配置做准备。

sudo modprobe can
sudo modprobe can_raw
sudo modprobe mttcan

2.配置CAN接口为内回环模式​

  • 关闭接口

sudo ip link set down can0
  • 配置波特率并启用内回环​​:将接口的比特率设置为500kbps,并开启内回环模式

sudo ip link set can0 type can bitrate 500000 loopback on
  • 配置完成后,重新启用接口

sudo ip link set up can0

3.验证接口状态 检查 can0接口的详细状态,确认内回环模式已成功启用

ip -details link show can0
3: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10
link/can  promiscuity 0 minmtu 0 maxmtu 0
can <LOOPBACK> state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0
bitrate 500000 sample-point 0.870
tq 20 prop-seg 43 phase-seg1 43 phase-seg2 13 sjw 1
mttcan: tseg1 2..255 tseg2 0..127 sjw 1..127 brp 1..511 brp-inc 1
mttcan: dtseg1 1..31 dtseg2 0..15 dsjw 1..15 dbrp 1..15 dbrp-inc 1
clock 50000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 parentbus platform parentdev c310000.mttcan
  • 3: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10​
    can0接口已启用,物理链路正常;

  • link/can promiscuity 0
    链路类型:CAN;
    混杂模式关闭;

  • can <LOOPBACK> state ERROR-ACTIVE (berr-counter tx 0 rx 0)
    已启用内回环模式,数据会直接在控制器内部环回,无需物理连接外部设备;
    CAN总线处于正常工作状态;
    tx 0 / rx 0:收发错误计数器 = 0;

  • bitrate 500000 sample-point 0.870
    波特率为500k;
    采样点87%;

4.进行回环测试​

  • 在终端1中运行 candump命令,监听 can0接口上的数据:

candump can0
  • 在终端2中,使用 cansend命令向 can0接口发送一条测试消息

cansend can0 123#DEADBEEF

5.观察与验证​
执行发送命令后,几乎同时,在​​终端一​​的 candump界面中,会看到一行接收到的数据。 数据发送后,立即被本机成功接收,整个CAN软件通路工作正常

can0  123  [4]  DE AD BE EF

c1201-dcdc