【正点原子Linux连载】 第三十三章 Linux CAN驱动实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

1)实验平台:正点原子ATK-DLRK3568开发板
2)平台购买地址:https://detail.tmall.com/item.htm?id=731866264428
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban

第三十三章 Linux CAN驱动实验

CAN是目前应用非常广泛的现场总线之一,主要应用于汽车电子和工业领域,尤其是汽车领域,汽车上大量的传感器与模块都是通过CAN总线连接起来的。CAN总线目前是自动化领域发展的热点技术之一,由于其高可靠性,CAN总线目前广泛的应用于工业自动化、船舶、汽车、医疗和工业设备等方面。RK3568自带了CAN外设,因此可以开发CAN相关的设备,本章我们就来学习一下如何驱动正点原子的RK3568开发板上的CAN接口。

33.1 CAN协议简析
有关CAN协议详细内容请参考开发板资料里面由瑞萨电子编写的《CAN入门教程》,路径为:06、参考资料->CAN入门教程.pdf,本小节参考自此教程。
33.1.1 何为CAN
CAN的全称为Controller Area Network,也就是控制局域网络,简称为CAN。CAN最早是由德国BOSCH(博世)开发的,目前已经是国际标准(ISO 11898),是当前应用最广泛的现场总线之一。BOSCH主要是做汽车电子的,因此CAN一开始主要是为汽车电子准备的,事实也是如此,CAN协议目前已经是汽车网络的标准协议。当然了,CAN不仅仅应用于汽车电子,经过几十年的发展,CAN协议的高性能和高可靠性已经得到了业界的认可,目前除了汽车电子以外也广泛应用于工业自动化、医疗、工业和船舶等领域。
以汽车电子为例,汽车上有空调、车门、发动机、大量传感器等,这些部件都是通过CAN总线连在一起形成一个网络,车载网络结构如图33.1.1.1所示:
在这里插入图片描述

图33.1.1.1 车载网络示意图
图49.1.1.1中各个单元通过CAN总线连接在一起,每个单元都是独立的CAN节点。同一个CAN网络中所有单元的通信速度必须一致,不同的网络之间通信速度可以不同。比如图33.1.1.1中125Kbps的CAN网络下所有的节点速度都是125Kbps的,整个网络由一个网关与其他的网络连接。
CAN的特点主要有一下几点:
1、多主控制
在总线空闲时,所有单元都可以发送消息(多主控制),而两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
2、系统的柔软性
与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
3、通信速度快,距离远
最高1Mbps(距离小于40M),最远可达10KM(速率低于5Kbps),最新的CAN FD速度可以到5Mbps。
4、具有错误检测、错误通知和错误恢复功能
所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
5、故障封闭功能
CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
6、连接节点多
CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。
33.1.2 CAN电气属性
CAN总线使用两根线来连接各个单元:CAN_H和CAN_L,CAN控制器通过判断这两根线上的电位差来得到总线电平,CAN总线电平分为显性电平和隐性电平两种。显性电平表示逻辑“0”,此时CAN_H电平比CAN_L高,分别为3.5V和1.5V,电位差为2V。隐形电平表示逻辑“1”,此时CAN_H和CAN_L电压都为2.5V左右,电位差为0V。CAN总线就通过显性和隐形电平的变化来将具体的数据发送出去,如图33.1.2.1所示:
在这里插入图片描述

图33.1.2.1 CAN电平
CAN总线上没有节点传输数据的时候一直处于隐性状态,也就是说总线空闲状态的时候一直处于隐性。CAN网络中的所有单元都通过CAN_H和CAN_L这两根线连接在一起,如图33.1.2.2所示:
在这里插入图片描述

图33.1.2.2 CAN网络示意图
图中所有的CAN节点单元都采用CAN_H和CAN_L这两根线连接在一起,CAN_H接CAN_H、CAN_L接CAN_L,CAN总线两端要各接一个120Ω的端接电阻,用于匹配总线阻抗,吸收信号反射及回拨,提高数据通信的抗干扰能力以及可靠性。
CAN总线传输速度可达1Mbps/S,最新的CAN-FD最高速度可达5Mbps/S,甚至更高,CAN-FD不在本章讨论范围,感兴趣的可以自行查阅相关资料。CAN传输速度和总线距离有关,总线距离越短,传输速度越快。
33.1.3 CAN协议
通过CAN总线传输数据是需要按照一定协议进行的,CAN协议提供了5种帧格式来传输数据:数据帧、遥控帧、错误帧、过载帧和帧间隔。其中数据帧和遥控帧有标准格式和扩展格式两种,标准格式有11位标识符(ID),扩展格式有29个标识符(ID)。这5中帧的用途见表33.1.3.1所示:
帧类型 帧用途
数据帧 用于CAN节点单元之间进行数据传输的帧
遥控帧 用于接收单元向具有相同 ID 的发送单元请求数据的帧
错误帧 用于当检测出错误时向其它单元通知错误的帧
过载帧 用于接收单元通知其尚未做好接收准备的帧
间隔帧 用于将数据帧及遥控帧与前面的帧分离开来的帧
表33.1.3.1 帧用途
1、数据帧
数据帧由7段组成:
①、帧起始,表示数据帧开始的段。
②、仲裁段,表示该帧优先级的段。
③、控制段,表示数据的字节数及保留位的段。
④、数据段,数据的内容,一帧可发送0~8个字节的数据。
⑤、CRC段,检查帧的传输错误的段。
⑥、ACK段,表示确认正常接收的段。
⑦、帧结束,表示数据帧结束的段。
数据帧结构如图33.1.3.2所示:

在这里插入图片描述

图33.1.3.2 数据帧结构
图33.1.3.2给出了数据帧标准格式和扩展格式两种帧结构,图中D表示显性电平0、R表示隐性电平1,D/R表示显性或隐性,也就是0或1,我们来简单分析一下数据帧的这7个段。
①、帧起始
帧起始很简单,标准格式和扩展格式都是由一个位的显性电平0来表示帧起始。
②、仲裁段
仲裁段表示帧优先级,仲裁段结构如图33.1.3.3所示:
在这里插入图片描述

图33.1.3.3仲裁段结构
标准格式和扩展格式的仲裁段不同,从图33.1.3.3可以看出,标准格式的ID为11位,发送顺序是从ID10到ID0,最高7位ID10~ID4不能全为隐性(1),也就是禁止0X1111111XXXXX这样的ID。扩展格式的ID为29位,基本ID从ID28到ID18,扩展ID由ID17到ID0,基本ID与标准格式一样,禁止最高7位都为隐性。
③、控制段
控制段由6个位构成,表示数据段的字节数,标准格式和扩展格式的控制段略有不同,如图33.1.3.4所示:
在这里插入图片描述

图33.1.3.4控制段结构
图33.1.3.3中r1和r0为保留位,保留位必须以显性电平发送。DLC为数据长度,高位在前,DLC段有效值范围为0~8。
④、数据段
数据段也就是帧的有效数据,标准格式和扩展格式相同,可以包含0~8个字节的数据,从最高位(MSB)开始发送,结构如图33.1.3.4所示:
在这里插入图片描述

图33.1.3.4 数据段
注意,图33.1.3.4中数据段的064为bit,对应到字节就是08字节。
⑤、CRC段
CRC段保存CRC校准值,用于检查帧传输错误,标准格式和扩展格式相同,CRC段结构如图33.1.3.5所示:

在这里插入图片描述

图33.1.3.5 CRC段结构
从图33.1.3.5可以看出,CRC段由15位的CRC值与1位的CRC界定符组成。CRC值的计算范围包括:帧起始、仲裁段、控制段、数据段,接收方以同样的算法进行计算,然后用计算得到的CRC值与此CRC段进行比较,如果不一致的话就会报错。
⑥、ACK段
ACK段用来确认接收是否正常,标准格式和扩展格式相同,ACK段结构如图33.1.3.6所示:
在这里插入图片描述

图33.1.3.6 ACK段结构
从图33.1.3.7可以看出,ACK段由ACK槽(ACK Slot)和ACK界定符两部分组成。发送单元的ACK,发送2个隐性位,而接收到正确消息的单元在ACK槽(ACK Slot)发送显性位,通知发送单元正常接收结束,这个过程叫发送ACK/返回ACK。发送 ACK 的是所有接收单元中接收到正常消息的单元,所谓正常消息是指不含填充错误、格式错误、CRC 错误的消息,这些接收单元既不处于总线关闭态也不处于休眠态的所有接收单元中。
⑦、帧结束
最后就是帧结束段,标准格式和扩展格式相同,帧结束段结构如图33.1.3.7所示:
在这里插入图片描述

图33.1.3.7 帧结束段结构
从图33.1.3.7可以看出,帧结束段很简单,由7位隐性位构成。
2、遥控帧
接收单元向发送单元请求数据的时候就用遥控帧,遥控帧由6个段组成:
①、帧起始,表示数据帧开始的段。
②、仲裁段,表示该帧优先级的段。
③、控制段,表示数据的字节数及保留位的段。
④、CRC段,检查帧的传输错误的段。
⑤、ACK段,表示确认正常接收的段。
⑥、帧结束,表示数据帧结束的段。
遥控帧结构如图33.1.3.8所示:
在这里插入图片描述

图33.1.3.8 遥控帧结构
从图33.1.3.8可以看出,遥控帧结构基本和数据帧一样,最主要的区别就是遥控帧没有数据段。遥控帧的RTR位为隐性的,数据帧的RTR位为显性,因此可以通过RTR位来区分遥控帧和没有数据的数据帧。遥控帧没有数据,因此DLC表示的是所请求的数据帧数据长度,遥控帧的其他段参考数据帧的描述即可。
3、错误帧
当接收或发送消息出错的时候使用错误帧来通知,错误帧由错误标志和错误界定符两部分组成,错误帧结构如图33.1.3.9所示:
在这里插入图片描述

图33.1.3.9 错误帧结构
错误标志有主动错误标志和被动错误标志两种,主动错误标志是6个显性位,被动错误标志是6个隐性位,错误界定符由8个隐性位组成。
4、过载帧
接收单元尚未完成接收准备的话就会发送过载帧,过载帧由过载标志和过载界定符构成,过载帧结构如图33.1.3.10所示:
在这里插入图片描述

图33.1.3.10 过载帧结构
过载标志由6个显性位组成,与主动错误标志相同,过载界定符由8个隐性位组成,与错误帧中的错误界定符构成相同。
5、帧间隔
帧间隔用于分隔数据帧和遥控帧,数据帧和遥控帧可以通过插入帧间隔来将本帧与前面的任何帧隔开,过载帧和错误帧前不能插入帧间隔,帧间隔结构如图33.1.3.11所示:
在这里插入图片描述

图33.1.3.11 帧间隔结构
图33.1.3.11中间隔由3个隐性位构成,总线空闲为隐性电平,长度没有限制,本状态下表示总线空闲,发送单元可以访问总线。延迟发送由8个隐性位构成,处于被动错误状态的单元发送一个消息后的帧间隔中才会有延迟发送。
33.1.4 CAN速率
CAN总线以帧的形式发送数据,但是最终到总线上的就是“0”和“1”这样的二进制数据,这里就涉及到了通信速率,也就是每秒钟发送多少位数据,前面说了CAN2.0最高速度为1Mbps/S。对于CAN总线,一个位分为4段:
①、同步段(SS)
②、传播时间段(PTS)
③、相位缓冲段1(PBS1)
④、相位缓冲段2(PBS2)
这些段由Tq(Time Quantum)组成,Tq是CAN总线的最小时间单位。帧由位构成,一个位由4个段构成,每个段又由若干个Tq组成,这个就是位时序。1 位由多少个Tq 构成、每个段又由多少个Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。各段的作用和 Tq 数如图33.1.4.1所示:
在这里插入图片描述

图33.1.4.1 一个位各段及其作用
1个位的构成如图33.1.4.2所示:
在这里插入图片描述

图33.1.4.2 一个位的构成
图33.1.4.2中的采样点是指读取总线电平,并将读到的电平作为位值的点。位置在 PBS1 结束处。根据这个位时序,我们就可以计算CAN通信的波特率了。具体计算方法,我们等下再介绍,前面提到的CAN协议具有仲裁功能,下面我们来看看是如何实现的。
在总线空闲态,最先开始发送消息的单元获得发送权。
当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。实现过程,如图33.1.4.3所示:
在这里插入图片描述

图33.1.4.3 CAN总线仲裁过程
图33.1.4.3中,单元1和单元2同时开始向总线发送数据,开始部分他们的数据格式是一样的,故无法区分优先级,直到T时刻,单元1输出隐性电平,而单元2输出显性电平,此时单元1仲裁失利,立刻转入接收状态工作,不再与单元2竞争,而单元2则顺利获得总线使用权,继续发送自己的数据。这就实现了仲裁,让连续发送显性电平多的单元获得总线使用权。
关于CAN协议就讲到这里,关于CAN协议更详细的内容请参考《CAN入门教程》。
33.1.5 CAN FD简介
随着汽车电子的发展,CAN的速度已经跟不上需求,因此CAN FD应运而生。BOSCH在2011年推出了CAN FD方案,CAN FD在CAN的基础上发展而来,主要扩展了CAN的带宽以及数据长度。
CAN FD采用两种速率,控制段和总裁段等使用标准的CAN速率,但是数据段会切换到更高的通信速率,比如5Mbps。CAN FD也对数据长度做了扩展,最大支持64字节。CAN FD数据帧格式如图33.1.5.1所示:
在这里插入图片描述

图33.1.5.1 CAN FD数据帧
CAN FD相比于CAN改进的地方有一下几点:
1、增加一些控制位
CAN FD在帧报文里面主要增加了EDL、BRS和ESI这三位:
EDL:用于指示当前为CAN帧还是CAN FD帧,标准CAN中此位为显性,在CAN FD中此位为隐性。
BRS:速率转换开关,为隐性的时候转换为可变速率,此时速率可变,BRS到CRC之间使用可变速率。为显性的时候速率不变。
ESI:错误状态指示位,隐性的时候表示节点处于被动错误状态,显性的时候表示节点处于主动错误状态。
2、优化CRC算法
传统的CAN协议中,使用位填充的方式来保持同步,但是这种方法会对CRC造成干扰,导致错帧漏检。CAN FD为此对CRC算法进行了优化,将填充位加入到差错校验码中进行计算,也就是以填充位的位流进行计算。
关于CAN FD就简单介绍这些,它主要的目的就是为了应对车载电子对通信带宽的需求,提供更高的数据速率以及数据长度。
33.2 硬件原理图分析
正点原子ATK-DLRK3568开发板CAN接口原理图如图33.2.1所示:
在这里插入图片描述

图33.2.1 CAN原理图
图33.2.1中CAN1_RX_M1和CAN1_TX_M1是ATK-DLRK3568 CAN的发送和接收引脚,对应的是GPIO4_C2和GPIO4_C3这两个引脚。通过收发器向外界提供CAN_H和CAN_L总线,R206是一个120欧的端接匹配电阻。
开发板支持CAN,不支持CANFD(在RK的文档里有提及到CANFD,但是测试发现CANFD会丢帧,反馈给原厂,原厂建议我们使用CAN功能)。注意CAN是半双工,不能同时收发。
33.3 实验程序编写
33.3.1 修改设备树
RK原厂提供的设备树已经配置好了CAN的节点信息,但是我们还是要来看一下如何配置CAN节点。RK的CAN设备树绑定文档,打开Documentation/devicetree/bindings/net/can/m_can.txt,此文档描述了CAN节点下的相关属性信息,这里就不做介绍了,大家自行查阅。
1、CAN1 pinctrl配置
首先我们肯定是配置CAN1的引脚配置,打开rk3568-pinctrl.dtsi,找到如下所示内容:
示例代码33.3.1.1 CAN1的pinctrl配置

1 can1 {
2   /omit-if-no-ref/
3   can1m0_pins: can1m0-pins {
4       rockchip,pins =
5           /* can1_rxm0 */
6           <1 RK_PA0 3 &pcfg_pull_none>,
7           /* can1_txm0 */
8           <1 RK_PA1 3 &pcfg_pull_none>;
9   };
10
11  /omit-if-no-ref/
12  can1m1_pins: can1m1-pins {
13      rockchip,pins =
14          /* can1_rxm1 */
15          <4 RK_PC2 3 &pcfg_pull_none>,
16          /* can1_txm1 */
17          <4 RK_PC3 3 &pcfg_pull_none>;
18  };
19 };

可以看出,这里的can1m1_pins节点就是CAN1的引脚配置,其中CAN1_RX_M1和CAN1_TX_M1的引脚分别为GPIO4_C2和GPIO4_C3,这个配置和我们开发板上的引脚是一致,所以无需修改,如果使用了其他引脚作为CAN1的收发引脚就需要自行修改。
2、CAN1 控制器节点信息
打开rk3568.dtsi文件,找到名为“can1”的节点,内容如下:
示例代码33.3.1.2 m_can1节点信息

1 can1: can@fe580000 {
2   compatible = "rockchip,rk3568-can-2.0";
3   reg = <0x0 0xfe580000 0x0 0x1000>;
4   interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
5   clocks = <&cru CLK_CAN1>, <&cru PCLK_CAN1>;
6   clock-names = "baudclk", "apb_pclk";
7   resets = <&cru SRST_CAN1>, <&cru SRST_P_CAN1>;
8   reset-names = "can", "can-apb";
9   tx-fifo-depth = <1>;
10  rx-fifo-depth = <6>;
11  status = "disabled";
12 };

根据第2行的compatible属性名“rockchip,rk3568-can-2.0”可以找到RK的CAN驱动文件,驱动文件名为drivers/net/can/rockchip/rockchip_canfd.c。第11行的status属性为disabled,所以CAN1默认关闭的。在rk3568-atk-evb1-ddr4-v10.dtsi中添加使能CAN1的操作,status属性为okay,所以在ATK-DLRK3568开发板的出厂buildroot系统中是默认打开CAN1功能的。
33.3.2 使能Linux内核自带的CAN驱动
正常来说还需要配置Linux内核,使能内核里面的CAN驱动,这些RK官方已经帮我们做好了,不需要我们重新去配置内核。但是这里为了学习,还是来看一下如何配置内核,使能CAN驱动。
1、使能CAN总线
首先打开CAN总线子系统,在Linux下CAN总线是作为网络子系统,配置的路径如下:
-> Networking support (NET [=y])
-> CAN bus subsystem support (CAN [=y])
-> CAN Device Drivers
-> Platform CAN drivers with Netlink support (CAN_DEV [=y])
配置如图33.3.2.1所示
在这里插入图片描述

图33.3.2.1 使能CAN驱动
33.4 CAN测试
33.4.1 检查CAN网卡设备是否存在
启动开发板出厂系统,然后输入如下命令:
ifconfig -a //查看所有网卡
前面我们说了,Linux系统中CAN总线接口设备作为网络设备进行统一管理,因此如果CAN驱动正常的话就会看到CAN对应的网卡接口,如图33.4.1.1所示:
在这里插入图片描述

图33.4.1.1 当前系统网卡信息
从图33.4.1.1可以看出,有一个名为“can0”的网卡,这个就是正点原子的ATK-DLRK3568开发板上的CAN1接口对应的can网卡设备。
33.4.2 iproute2和can-utils工具
1、移植iproute2
iproute2是Linux上有关TCP/IP网络的一系列工具,我们需要此工具进行配置CAN网络设备,在正点原子出厂系统上已经添加好了iproute2,这里我们简单学习下如何在buildroot中添加iproute2。在buildroot的源码目录下进入图形化界面配置,路径如下:
-> Target packages
-> Networking applications
-> [*] iproute2(选中)
结果如图33.4.2.1所示:
在这里插入图片描述

图33.4.2.1 配置iproute2
2、移植can-utils
can0网卡已经出现了,但是工作正不正常还不知道,必须要进行数据收发测试,can-utils工具出厂系统也是适配好的,同样在buildroot的源码目录下进入图形化配置,路径如下:
-> Target packages
-> Networking applications
-> [*] can-utils(选中)
结果如图33.4.2.2所示:
在这里插入图片描述

图 33.4.2.2 配置can-utils
保存和退出配置选择,然后重新编译buildroot,更新文件系统到开发板上就可以了,正点原子的出厂系统默认已经配置好这两个工具了,这里我们直接用正点原子的出厂系统来操作。
33.4.3 CAN通讯测试
测试 CAN 需要用户手上有 USB CAN(FD)分析仪,如周立功的 CAN(FD)分析仪等,如
果用户是搞 CAN 这块的,那么这部分用户应该有 CAN(FD)分析仪。如果你是初学者,需要购
买 CAN(FD)分析仪,,测试 CAN 就需要购买 CAN(FD)分析仪。或者两块开发板 CAN 接口对接也可以测试,有条件或者需求就购买 CAN(FD)分析仪。但是 USB CAN(FD)分析仪往往价格不菲,比一套板子还要贵。
注意CAN是半双工的,不能同时收发。
本次实验就使用了周立功的 USB CANFD 分析仪,如下图。注意,关于 CANFD 分析仪的使用请咨询商家,本实验不讲解 USB CANFD 分析仪的使用。

33.4.3.1 CAN分析仪
开发板CAN接口位置如图33.4.3.2所示:
在这里插入图片描述

图33.4.3.2 CAN接口位置
将USB CANFD分析仪一个通道的CANH接开发板的CAN接口处的H,CANL接开发板的CAN接口处的L,启动CAN上位机。
1、收发测试
在出厂系统里面输入下面的指令配置CAN。若你的Linux系统设置报错,请更新最新的Linux固件。V1.1版本资料以上才支持。
ip link set can0 up type can bitrate 1000000
指令解释:
① ip link set can0 up:将CAN0接口设置为启动状态。
② type can:将CAN总线类型设置为CAN。
③ bitrate 1000000:将CAN总线的比特率设置为1Mbps(1000000 bits/sec)。
注CAN总线通常支持1Kbps(千位每秒)到1Mbps(兆位每秒)的位速率范围,一般取值为800K、500K、250K、125K、100K和50K。
在这里插入图片描述

图33.4.3.3 CAN配置信息
执行下面的指令打印CAN的信息。
ip -details link show can0
在这里插入图片描述

图33.4.3.4 CAN打印功能开启
CAN发送:
发送(标准帧,数据帧,ID:123,date:DEADBEEF):
cansend can0 123#DEADBEEF
发送(标准帧,远程帧,ID:123):
cansend can0 123#R
发送(扩展帧,数据帧,ID:00000123,data:DEADBEEF):
cansend can0 00000123#DEADBEEF
发送(扩展帧,远程帧,ID:00000123):
cansend can0 00000123#R
在这里插入图片描述

图33.4.3.5 CAN发送数据
CAN上位机收到数据如下。
在这里插入图片描述

图33.4.3.6 CAN上位机接收数据
CAN接收数据输入下面的指令等待接收:
candump can0
CAN上位机发送数据如图33.4.3.7,这次我们发送8个字节
在这里插入图片描述

图33.4.3.7 CAN上位机发送数据
在这里插入图片描述

图33.4.3.8 系统接收数据
接下来,我们来测试一下CAN数据是否会丢帧,编写一个CAN随机生成8个字节数据发送的脚本,脚本如下:
#!/bin/bash

循环发送 10000 次

for ((i = 1; i <= 10000; i++)); do

生成随机的 8 字节数据(16 个十六进制数字)

random_data=$(od -A n -t x8 -N 8 /dev/urandom | tr -d ’ ')

构建 cansend 命令

cansend_cmd=“cansend can0 123#${random_data}”

执行 cansend 命令

eval $cansend_cmd
echo “Sent CAN frame $i with data: $random_data”

等待一段时间,以控制发送速率(单位:秒)

sleep 0.01
done
上述脚本发送10000帧间隔100ms数据测试,等待测试完成后,上位机也发送10000帧数据间隔100ms给开发板CAN。错误帧测试结果如下,错误率为0%
在这里插入图片描述

图33.4.3.9 上位机数据测试结果
注 CAN 时钟频率可以修改,如果 CAN 的比特率 1M 建议修改 CAN 时钟到 300M,信号更稳定。低于 1M 比特率的,时钟设置 200M 就可以。CAN 时钟最好设置成比特率的偶数倍,便于分出精准的比特率频率。默认 Linux 出厂设备树为 200M。
关于CAN驱动就讲解到这里,如果要编写CAN总线应用的话就直接使用Linux提供的CAN接口,使用方法类网络通信,本教程不讲解应用编程。

  • 10
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值