目标:通过调用AGX端口的CAN实现上位机与主控的通信。
整个测试流程都可以直接看官网文档。
参考连接
硬件准备
- Nvidia Jetson AGX Orin / Xvaier / NX
- CAN收发器(本文用的是TJA1050)
- CAN分析仪(非必须)
- 若干杜邦线
CAN使能配置
修改GPIO口功能
由于默认的CAN引脚不是配置为CAN,因此需要修改4个寄存器的值。具体可以从文档看到:
以Orin为例,图中Addr就是寄存器地址,value就是需要写入的值.
- 使用busybox修改寄存器的值
sudo apt-get install busybox
busybox devmem 0x0c303018 w 0xc458
busybox devmem 0x0c303010 w 0xc400
busybox devmem 0x0c303008 w 0xc458
busybox devmem 0x0c303000 w 0xc400
- 挂载CAN内核
sudo modprobe can
sudo modprobe can_raw
sudo modprobe mttcan
CAN属性设置
例如将CAN0波特率设置成250k
sudo ip link set down can0
sudo ip link set can0 type can bitrate 250000
sudo ip link set up can0
注意,配置前需要先关闭can
硬件连接
- CAN0: RX——Pin29 ;TX——Pin31 (收发器的CANH,CANL接分析仪)
- CAN1: RX——Pin37 ;TX——Pin33
- GND: Pin39 / 30
- VCC: Pin2 / 4 (具体看收发器,一般都是接5v)
测试
用can-utils进行简单的can收发测试,后续将用SocketCan结合ROS。
sudo apt-get install can-utils
cansend can0 123#00.00.00.00.11.11.11.11 #cansend can0/1 [can_id]#[八字节数据]
cangen -v can0 #随机发送
candump can0 #接受can帧
(can1同理)
效果:
如果没有can分析仪,可以短接CAN0、CAN1的RX TX,并设置回环模式。具体可以查看参考连接[2]、[3]
可能遇到的问题
- 发送一定数量can帧后报错
write: No buffer space available
解决方法:将缓存区队列长度设大一点 参考
出现这个问题原因是,没有对象接收can帧,就产生了阻塞。所以这个问题也代表了can通信还是存在问题,即无法通过can分析仪查看收发的can帧信息,需要检测硬件连接和软件设置。
SocketCan + ROS
待续。
Up to 2023.6
一直没更新是因为在使用socketcan的时候遇到了一些无法解决的问题(收发非常不稳定)
另,在使用CAN收发器这个方案时,总会遇到许多奇奇怪怪的问题,比如有些问题在NVIDIA的论坛提问,得到的回复时有些官方库没有正常安装。总体来说,个人觉得这个方法并不好用稳定。
解决方法:**购买带有LINUX驱动的CAN分析仪,调用厂家的报文收发函数就好了,比较简单。**
分析仪价格也不算贵,500左右吧。
当然这其中可能也会涉及到缓冲区的问题,我自己遇到的情况是,通过ROS发送接收到的报文数组时,一定时间(一定数量)后,节点便报错。解决方法是一条条can_frame发送。
如有大佬解决了,烦请指教。