文章目录

  • 前言
  • Jetson/AGX Xavier CAN
  • 更新Pinmux方法1
  • 更新Pinmux方法2
  • 挂载CAN控制器
  • 配置CAN接口
  • 打开或关闭CAN
  • CAN收发
  • 小结Xavier CAN配置
  • 上电加载
  • SocketCAN 和 can-utils
  • python-can
  • 一些参考链接
  • 微信公众号

前言

Nvidia Xavier GPIO 输入输出 中断 PWM
NVIDIA Xavier UART
前面几节总结了GPIO, UART相关的操作, 本节总结一下NVIDIA Xavier的CAN, 作为本周的小结. Xavier的40-Pin扩展口引出了两路CAN, 具体引脚为:

引脚 CAN
29 CAN0_DIN
31 CAN0_DOUT
33 CAN1_DOUT
37 CAN1_DIN

如果接上CAN收发器(别忘了120Ω终端电阻), 如下图所示:

图出自 https://elinux.org/Jetson/AGX_Xavier_CAN.

Jetson/AGX Xavier CAN

Jetson/AGX Xavier CAN 是权威的资料, 文中指出, 为了和树莓派40-Pin引脚兼容, CAN的相应引脚默认配置为GPIO功能, 使用CAN功能需要两步:

通过这两步使能CAN后, 再进行诸如 Socket CAN 的编程.

更新Pinmux方法1

嫌麻烦的直接跳到下一小节方法2.

上小节链接中给出的更新Pinmux的方法是通过Jetson_AGX_Devkit_Pinmux_Configuration_Template.xlsm文件配置后自动生成, 改动大致有:

diff --git a/tegra19x-mb1-pinmux-p2888-0000-a04-p2822-0000-b01.cfg b/tegra19x-mb1-pinmux-p2888-0000-a04-p2822-0000-b01.cfg
index df43561..c61e80d 100644
--- a/tegra19x-mb1-pinmux-p2888-0000-a04-p2822-0000-b01.cfg
+++ b/tegra19x-mb1-pinmux-p2888-0000-a04-p2822-0000-b01.cfg
@@ -322,10 +322,10 @@ pinmux.0x0243d010 = 0x00000059; # spi1_cs0_pz6: rsvd1, pull-up, tristate-enable,pinmux.0x0243d050 = 0x00000059; # spi1_cs1_pz7: rsvd1, pull-up, tristate-enable, input-enable, lpdr-disablepinmux.0x0c301010 = 0x00000059; # safe_state_pee0: rsvd1, pull-up, tristate-enable, input-enable, io_high_voltage-disable, lpdr-disablepinmux.0x0c301038 = 0x00000058; # power_on_pee4: rsvd0, pull-up, tristate-enable, input-enable, lpdr-disable
-pinmux.0x0c303000 = 0x0000c055; # can1_dout_paa0: rsvd1, pull-down, tristate-enable, input-enable
-pinmux.0x0c303008 = 0x0000c055; # can1_din_paa1: rsvd1, pull-down, tristate-enable, input-enable
-pinmux.0x0c303010 = 0x0000c059; # can0_dout_paa2: rsvd1, pull-up, tristate-enable, input-enable
-pinmux.0x0c303018 = 0x0000c059; # can0_din_paa3: rsvd1, pull-up, tristate-enable, input-enable
+pinmux.0x0c303000 = 0x0000c400; # can1_dout_paa0: rsvd1, pull-down, tristate-enable, input-enable
+pinmux.0x0c303008 = 0x0000c458; # can1_din_paa1: rsvd1, pull-down, tristate-enable, input-enable
+pinmux.0x0c303010 = 0x0000c400; # can0_dout_paa2: rsvd1, pull-up, tristate-enable, input-enable
+pinmux.0x0c303018 = 0x0000c458; # can0_din_paa3: rsvd1, pull-up, tristate-enable, input-enablepinmux.0x0c303020 = 0x0000c000; # can0_stb_paa4: rsvd0, tristate-disable, input-disablepinmux.0x0c303028 = 0x0000c000; # can0_en_paa5: rsvd0, tristate-disable, input-disablepinmux.0x0c303030 = 0x0000c058; # can0_wake_paa6: rsvd0, pull-up, tristate-enable, input-enable

自动生成的pinmux配置文件放到主机的Jetpack里面, 路径是: $JETPACK_ROOT/Xavier/Linux_for_Tegra/bootloader/t186ref/BCT, 然后开始刷机:

$ cd $JETPACK_ROOT/Xavier/Linux_for_Tegra/
$ sudo ./flash.sh jetson-xavier mmcblk0p1

更新Pinmux方法2

https://github.com/hmxf/can_xavier, 这里使用busybox中的devmem工具配置:

# 安装busybox, 需要里面的devmem工具
sudo apt install busybox# pinmux.0x0c303000 and pinmux.0x0c303008 are for CAN1
# pinmux.0x0c303010 and pinmux.0x0c303018 are for CAN0
# 检查当前的寄存器值
sudo busybox devmem 0x0c303000  # 0x0000C055
sudo busybox devmem 0x0c303008  # 0x0000C055
sudo busybox devmem 0x0c303010  # 0x0000C059
sudo busybox devmem 0x0c303018  # 0x0000C059# 用devmem修改寄存器
sudo busybox devmem 0x0c303000 32 0x0000C400
sudo busybox devmem 0x0c303008 32 0x0000C458
sudo busybox devmem 0x0c303010 32 0x0000C400
sudo busybox devmem 0x0c303018 32 0x0000C458# 改完后检查
sudo busybox devmem 0x0c303000  # 0x0000C400
sudo busybox devmem 0x0c303008  # 0x0000C458
sudo busybox devmem 0x0c303010  # 0x0000C400
sudo busybox devmem 0x0c303018  # 0x0000C458

挂载CAN控制器

寄存器改好了, 该挂载了, 使用modprobe:

sudo modprobe can
sudo modprobe can_raw
sudo modprobe mttcan# 检查挂载
lsmod

与下面操作似乎等效:

# Load prebuilt but not loaded drivers(Please modify path if system has been updated)
sudo insmod /lib/modules/4.9.108-tegra/kernel/net/can/can.ko
sudo insmod /lib/modules/4.9.108-tegra/kernel/net/can/can-raw.ko
sudo insmod /lib/modules/4.9.108-tegra/kernel/net/can/can-bcm.ko
sudo insmod /lib/modules/4.9.108-tegra/kernel/net/can/can-gw.ko
sudo insmod /lib/modules/4.9.108-tegra/kernel/drivers/net/can/can-dev.ko
sudo insmod /lib/modules/4.9.108-tegra/kernel/drivers/net/can/mttcan/native/mttcan.ko

下面是挂载后, 用lsmod检查的情况:

xavier@xavier-c:~$ lsmod
Module                  Size  Used by
mttcan                 66187  0
can_dev                13306  1 mttcan
can_raw                10388  3
can                    46600  1 can_raw
fuse                  103841  3
zram                   26166  7
overlay                48691  0
hid_logitech_hidpp     22721  0
hid_logitech_dj        13813  0
nvgpu                1569917  20
bluedroid_pm           13912  0
ip_tables              19441  0
x_tables               28951  1 ip_tables

配置CAN接口

挂载好了, 还需要配置一些波特率之类的参数:

配置为1Mbps的标准CAN

sudo ip link set can0 type can bitrate 1000000
sudo ip link set can1 type can bitrate 1000000

或者配置为仲裁段500k, 数据段2M的的CANFD:

sudo ip link set can0 type can bitrate 500000 dbitrate 2000000 berr-reporting on fd on
sudo ip link set can1 type can bitrate 500000 dbitrate 2000000 berr-reporting on fd on

如果没有外面的CAN收发器, 不要慌, 配置为回环模式:

sudo ip link set can0 type can bitrate 1000000 loopback on
sudo ip link set can1 type can bitrate 1000000 loopback on

然后找根杜邦线短接CAN1的TX和RX, CAN0的TX和RX, 照样可以测试收发. 如图所示(不建议这么做, 为防止烧坏IO, 可以串联一个数K的电阻进行限流):

打开或关闭CAN

打开CAN控制器:

sudo ip link set up can0
sudo ip link set up can1# 检查
ifconfig# 或者静态检查
ip -details -statistics link show can0
ip -details -statistics link show can1# 或者简写版的
ip -s -d link show can0
ip -s -d link show can1

使用ifconfig检查的效果如图:

关闭CAN控制器:

sudo ip link set down can0
sudo ip link set down can1# 检查
ifconfig    # 关闭的话里面就没有can0, can1了

建议每次配置上小节的参数前都先关闭, 然后配置, 最后重新打开!!!

CAN收发

可以使用 can-utils 进行简单的收发测试, 先安装:

sudo apt install can-utils

发送:

# 123是十六进制帧ID, #后面是8字节十六进制数, 可以用.相隔也可以不用
cansend can0 123#99.95.42.07.2B.96.66.6E
cansend can1 123#99.95.42.07.2B.96.66.6E# 随机发送
cangen -v can0
cangen -v can1

发送数据的格式(均为十六进制, 3字节是标准帧, 8字节是扩展帧, #跟标准数据帧, #R跟遥控帧, ##跟CANFD帧):

<can_frame>:<can_id>#{R|data}          for CAN 2.0 frames<can_id>##<flags>{data}    for CAN FD frames<can_id>:can have 3 (SFF) or 8 (EFF) hex chars
{data}:has 0..8 (0..64 CAN FD) ASCII hex-values (optionally separated by '.')
<flags>:a single ASCII Hex value (0 .. F) which defines canfd_frame.flagsExamples:5A1#11.2233.44556677.88 / 123#DEADBEEF / 5AA# / 123##1 / 213##3111F334455#1122334455667788 / 123#R for remote transmission request.

接收:

candump can0
candump can1

收的数据格式如下, can_x, can_id, [data_dlc], data:

xavier@xavier-c:~$ candump can1can1  123   [8]  99 95 42 07 2B 96 66 6Ecan1  123   [8]  99 95 42 07 2B 96 66 6E

小结Xavier CAN配置

以CAN1 配置为500kbps, 回环模式为例:

# 安装busybox, 需要里面的devmem工具
sudo apt install busybox# 用devmem修改寄存器
sudo busybox devmem 0x0c303000 32 0x0000C400
sudo busybox devmem 0x0c303008 32 0x0000C458
sudo busybox devmem 0x0c303010 32 0x0000C400
sudo busybox devmem 0x0c303018 32 0x0000C458# 安装CAN控制器并加载驱动程序
sudo modprobe can
sudo modprobe can_raw
sudo modprobe mttcan# 配置前先关闭
sudo ip link set down can1# 配置CAN为回环模式, 用线短接CAN的TX和RX即可测试, 不用CAN收发器
sudo ip link set can1 type can bitrate 500000 loopback on
# sudo ip link set can1 type can bitrate 500000# 启动CAN
sudo ip link set up can1# 打开一个接收终端用于CAN接收
candump can1# 再打开一个接收终端用于CAN发送
cansend can1 A234567F#99.95.42.07.2B.96.66.6E

需要说明的是, CAN1我测试通过了, CAN0出不来数据, 可能哪里没有配好, 慢慢来吧…

上电加载

需要说明的是, 上面的配置一断电就没了, 是的, 寄存器, lsmodifconfig里面都没了.

如果想开机直接配好, 就把这些写到脚本里, 开机加载就好了, 具体可以参考 Enabling CAN on Nvidia Jetson Xavier Developer Kit. 这里就不赘述了.

SocketCAN 和 can-utils

可参考SocketCAN, 这里引用一段代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>#include <net/if.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>#include <linux/can.h>
#include <linux/can/raw.h>int
main(void)
{int s;int nbytes;struct sockaddr_can addr;struct can_frame frame;struct ifreq ifr;const char *ifname = "vcan0";if((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {perror("Error while opening socket");return -1;}strcpy(ifr.ifr_name, ifname);ioctl(s, SIOCGIFINDEX, &ifr);addr.can_family  = AF_CAN;addr.can_ifindex = ifr.ifr_ifindex;printf("%s at index %d\n", ifname, ifr.ifr_ifindex);if(bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {perror("Error in socket bind");return -2;}frame.can_id  = 0x123;frame.can_dlc = 2;frame.data[0] = 0x11;frame.data[1] = 0x22;nbytes = write(s, &frame, sizeof(struct can_frame));printf("Wrote %d bytes\n", nbytes);return 0;
}

linux-can里有很多示例, 可以去扒拉:

python-can

是的, 这个很重要, 贴出文档链接: https://python-can.readthedocs.io/en/stable/index.html
引用一个示例代码:

#!/usr/bin/env python
# coding: utf-8"""
This example shows how sending a single message works.
"""from __future__ import print_functionimport candef send_one():# this uses the default configuration (for example from the config file)# see https://python-can.readthedocs.io/en/stable/configuration.htmlbus = can.interface.Bus()# Using specific buses works similar:# bus = can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)# bus = can.interface.Bus(bustype='pcan', channel='PCAN_USBBUS1', bitrate=250000)# bus = can.interface.Bus(bustype='ixxat', channel=0, bitrate=250000)# bus = can.interface.Bus(bustype='vector', app_name='CANalyzer', channel=0, bitrate=250000)# ...msg = can.Message(arbitration_id=0xC0FFEE, data=[0, 25, 0, 1, 3, 1, 4, 1], is_extended_id=True)try:bus.send(msg)print("Message sent on {}".format(bus.channel_info))except can.CanError:print("Message NOT sent")if __name__ == "__main__":send_one()

各种工具或者模块很实用:

CAN Interface Modules:
SocketCAN
Kvaser’s CANLIB
CAN over Serial
CAN over Serial / SLCAN
IXXAT Virtual CAN Interface
PCAN Basic API
USB2CAN Interface
NI-CAN
isCAN
NEOVI Interface
Vector
Virtual
CANalyst-II
SYSTEC interface
USB-CAN Analyzer

一些参考链接

hmxf/can_xavier
Enabling CAN on Nvidia Jetson Xavier Developer Kit
在Nvidia Jetson Xavier开发者套件上启用CAN总线
Nvidia Jetson Xavier与树莓派3b+进行can通讯

微信公众号

欢迎扫描二维码关注本人微信公众号, 及时获取或者发送给我最新消息:

NVIDIA Xavier CAN相关推荐

  1. nvidia xavier平台无PD控制器USB接口调试

    NVIDIA英伟达 1. 前言 问题: 基于nvidia xavier核心板,设计载板,但是USB功能无法使用: 硬件: OTG连接器使用Micro B VBUS_ID=GPIO30(B55) pin ...

  2. 史上最全!!!ARM架构下的NVIDIA Xavier安装ROS-Melodic以及使用速腾激光雷达+A-loam获取点云图

    ** 一.ARM架构下的NVIDIA Xavier 切换国内的源 ** 这里不要换成AMD架构的PC平台的软件源,需要换成配套ARM使用的源. 首先备份下之前的 source.list sudo cp ...

  3. 基于NVIDIA Xavier NX(ubuntu20.04)的Optitrack视觉定位 PX4+ros noetic(实物运行记录)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一:硬件准备 两种界面化显示的方式 无线连接 有线连接 二:软件准备 1:远程登录软件 NoMachine 2:安装r ...

  4. 世界上最强大的SoC——NVIDIA Xavier学习笔记

    界上最强大的SoC--NVIDIA Xavier学习笔记 NVIDIA在2018年CES上推出了Xavier平台,作为Driver PX2 的进化版本.NVIDIA称Xavier 是"世界上 ...

  5. NVIDIA Xavier UART

    文章目录 前言 40-Pin扩展口中的UART pyserial 调试串口 微信公众号 前言 Nvidia Xavier GPIO 输入输出 中断 PWM 上节总结了40-Pin扩展口中GPIO的应用 ...

  6. 小鹏汽车L3自动驾驶方案---基于NVIDIA Xavier

    小鹏汽车今日与芯片巨头NVIDIA(英伟达)及NVIDIA中国相助同伴德赛西威在英伟达全球GTC大会首日签订三方战略相助协议,配合研发适配中国交通情况和驾驶场景的L3级自动驾驶技术. 按照介绍,基于X ...

  7. Nvidia Xavier Nx平台PCIE速率调整调试记录

    1. 前言 如何增加最大速度的pcie上的jetson xavier? 因为被限制在2.5 GT/s Xavier似乎可以增加到8 GT/s. 使用Jetpack 4.5 0004:00:00.0 P ...

  8. 亲测有效:Nvidia XAVIER NX刷机、pytorch、torchvision安装,

    前言:最近在使用英伟达的Jetson-Xavier-NX板子,主要用于机器视觉,将配置的过程在这里记录一下. 目录 一.镜像烧录 1.下载镜像 2.写入镜像 3.开机 4.远程连接 二.环境配置 1. ...

  9. Nvidia Xavier GPIO 输入输出 中断 PWM

    文章目录 前言 Jetson.GPIO安装 可用引脚 点亮LED GPIO输出示例 GPIO输入示例 GPIO Event GPIO Interrupt PWM 微信公众号 前言 Nvidia Jet ...

最新文章

  1. 2019上海车展展后报告(整车篇)
  2. Bind和Eval地区别详细解说
  3. Almost All Divisors
  4. OpenCV在图像中寻找轮廓
  5. php重载,PHP重载基础知识回顾
  6. 如何使用 .NET Core 安全地加/解密文件
  7. 基于matlab的数字水印技术研究,MATLAB在数字水印技术研究中的应用
  8. 修炼成QTP高手的十个步骤
  9. 43. Pandas查询数据的简便方法df.query
  10. 交互设计的职能:交互设计师具体做什么
  11. 我有阳光(我爱生活)
  12. python excel条件格式_Python操作Excel学习笔记(28):条件格式
  13. Ansible事实变量常见fact
  14. LSF集群作业管理系统
  15. SV基础知识---功能覆盖率1 (概念理解)
  16. 土壤基因组dna提取试剂盒
  17. 落户上海市高校毕业生就业指导中心集体户口办理办法
  18. CSDN开发云-优雅使用云容器服务
  19. windows xp桌面消失
  20. 启动计算机 英语,电脑开机显示英文是怎么回事

热门文章

  1. 智能安防哪家强,智能摄像头帮你忙
  2. 小程序语音红包中遇到的 语音识别silk转wav格式 如何在线转 或者mp3转wav格式...
  3. systemctl 启动redis
  4. ipad iphone开发_如何在iPhone或iPad上拍摄延时视频
  5. 谷歌邮件曝光:无人车项目提防百度、滴滴、Uber
  6. 2022第四季度的机遇,Genesis Universe限量卡牌争夺战开启
  7. Java基础面试题(建议收藏)
  8. 基于TCP Reno的拥塞控制的基本原理
  9. iphone6计算机没了,怎么解决苹果6连接电脑没反应
  10. 罗永浩:锤子手机一共卖了12万部,我已经交出微博密码