CAN接口介绍 CAN总线是广播类型的总线。这意味着所有节点都可以侦听到所有传输的报文。无法将报文单独发送给指定节点;所有节点都将始终捕获所有报文。但是,CAN硬件能够提供本地过滤功能,让每个节点对报文有选择性地做出响应。 总线使用不归零位填充。模块以线与逻辑连接到总线:如果只有一个节点向总线传输逻辑0,那么不管有多少个节点向总线传输逻辑1,整个总线都处于逻辑0状态。 CAN总线上的电平: CAN2.0A/B标准规定:总线空闲时,CAN_H和CAN_L上的电压为2.5V; 在数据传输时,显性电平(逻辑 0):CAN_H 3.5V CAN_L 1.5V; 隐性电平(逻辑 1):CAN_H 2.5V CAN_L 2.5V; CAN标准定义四种不同的报文类型(数据帧、远程帧、错误帧、过载帧)。报文使用逐位仲裁智能方案来控制对总线的访问,每条报文都带有优先级标记,在协议中规定ID小则优先级高。CAN总线拓扑图如下图: CAN总线拓扑图
ELF 1 CAN接口硬件电路介绍 主板上提供了1路CAN接口,扩展板上有1路CAN接口,由3.81mm间距绿端子引出。 目前ELF 1上默认焊接TJA1040T。CAN模块原理图如下图所示,由于TJA1040T的输出端RX为5V电平,可能会影响核心板的3.3V电压,因此,芯片输出端分别经过电阻R51和R54分压到3.3V,再输入CPU的CAN1_RX。 此部分电路除了电平的匹配外还要注意到R52和R53两个电阻这两个电阻为CAN总线的终端电阻这两个电阻在CAN总线通讯时起着至关重要的作用,首先阻抗匹配实现保证信号在总线上的最大传输功率提高抗干扰能力,其次是确保总线可以快速进入隐性状态,给结电容的快速放电,如果在多个设备挂载的情况下,两端设备不接终端电阻CAN总线会有不能通讯的风险。 图1 CAN模块 图2 CAN引脚示意图 通过查表CAN1_TX对应的PAD NAME为UART3_CTS_B,CNA1_RX的PAD NAME为UART3_RTS_B,CAN2_TX对应的PAD NAME为UART2_CTS_B,CNA2_RX的PAD NAME为UART2_RTS_B。
图3 TJA1040T芯片功能框图 图4 TJA1040T芯片引脚说明
CAN接口设计指南 (1)ELF 1核心板最多可支持2路CAN; (2)设计CAN接口时要注意收发器和核心板之间的电平匹配; (3)终端电阻可以预留插针通过跳线帽选择使用; CAN接口PCB设计指南 (1)CAN使用差分布线,预留120Ω端接电阻; (2)连接端口建议预留地信号; CAN口对测ELF1引出两路CAN,我们使用CAN1和CAN2进行对测,CAN1位于主板上,CAN2位于扩展板上。将ELF1的CAN1与CAN2 H与H相连,L与L相连。 ELF1启动之后,在命令行输入以下命令,对CAN1配置波特率为125000: root@ELF1:~# ifconfig can0 down //关闭can1 | root@ELF1:~# ip link set can0 up type can bitrate 125000 triple-sampling on //设置can1波特率 | flexcan 2090000.can can0:writing ctrl=0x0e312085 | IPV6:ADDRCONF(NETDEV_CHANGE):can0:link becomes ready | root@ELF1:~# ifconfig can0 up //开启can1 |
对CAN2配置波特率为125000: root@ELF1:~# ifconfig can1 down //关闭can2 | root@ELF1:~# ip link set can1 up type can bitrate 125000 triple-sampling on //设置can2波特率 | flexcan 2094000.can can1:writing ctrl=0x0e312085 | IPV6:ADDRCONF(NETDEV_CHANGE):can0:link becomes ready | root@ELF1:~# ifconfig can1 up //开启can2 |
设置CAN2接收数据: root@ELF1:~# candump can1 & //can2以后台方式接收数据 | |
CAN1发送数据: root@ELF1:~# cansend can0 123#1234567891234567 //can1发送数据 | root@ELF1:~# can1 123 [8] 12 34 56 78 91 23 45 67 //can2接收到数据 |
CAN2接收到CAN1发送的数据。
|