JETSON ORIN 系列入门教程 本章节主要介绍Jetson Orin的基本配置、系统烧录和基础外设使用。 连接到Jetson系统 Jetson拥有一个HDMI/DP视频输出接口、RJ45网口、Type-C接口和UART调试接口,下面我们将使用上面这四种方法连接到Jetson开发板系统。 1. 连接显示器 使用功能正常的 DP/HDMI 线材连接到功能正常的显示器,接通开发板电源就能正常进入桌面。接入鼠标键盘后即可如普通桌面PC一样操作。 2. 远程登陆 此方法需要提前使用SDK Maneger写入用户名和密码 2.1将开发板连接到路由器,并接通电源开机 2.2-1通过路由器后台获取到开发板ip地址 不同品牌的路由器存在较大差异,请按照设备制造商的指引进行查询 2.2-2使用 advanced ip scanner 软件扫描同网段下的设备 在刷入官方固件时,制造商信息为 NVIDIA Corporation 的设备即为开发板。 2.3 下载安装 putty 或 MobaXterm 等连接工具(下面以 MobaXterm 为例) 2.4 点击 session 创建一个会话 2.5 点击 SSH 2.6 输入刚刚查询到的 IP 地址和刷入系统时或者自定义的用户名,完成后点击OK保存 2.7 输入密码(命令行不显示),完成后回车即可登录到系统。 3. 通过type-c连接到SSH   3.1 在开发板正常上电开机 在默认模式下连接到主机后,Jetson默认作为主机,其IP地址为 192.168.55.1 3.2 使用 putty 或 MobaXterm 等连接工具,连接到开发板 参考 2.3 节进行操作 4. 远程连接到Jetson桌面环境 在无显示器模式下建议使用HDMI/DP诱骗器确保桌面环境正常 4.1 使用 NoMachine NoMachine 是一款功能强大、跨平台的远程桌面软件,专注于提供高速、高画质的远程访问体验。其核心基于 ​ ​NX 协议​ ​,通过高效压缩和加密技术实现低延迟传输,特别适合图形密集型任务(如视频编辑、3D 渲染)和多场景协作。 主机下载安装NoMachine Jetson端下载安装NoMachine  (下载页面参考: NoMachine–arm_version ) 通过scp等方式上传到开发板(也可尝试复制下载链接通过命令行使用 wget 命令下载) 命令行安装deb软件包 sudo dpkg -i nomachine_9.1.24_6_arm64.deb #随软件的更新包名可能发生变化 主机和开发板都安装成功后将其连接到同一局域网下,在主机打开NoMachine便可自动搜索到Jetson服务端 输入用户名和密码,点击OK 成功连接到桌面 点击软件显示区域右上角可以进入设置调节画质、显示画幅和编码模式等选项 4.2 使用 VNC VNC (​​虚拟网络计算机​​)是一种基于图形界面的远程控制技术,允许用户通过网络(互联网或局域网)实时访问并操作另一台计算机的桌面环境。其核心协议为 ​ ​RFB( Remote Framebuffer Protocol )​ ​,通过传输屏幕帧缓冲区的像素数据实现跨平台远程控制 下载安装主机端 在Jetson上进行如下设置 设置VNC服务为开机自启 cd /usr/lib/systemd/user/graphical-session.target.wants sudo ln -s ../vino-server.service ./. 配置VNC服务 gsettings set org.gnome.Vino prompt-enabled false gsettings set org.gnome.Vino require-encryption false 设置VNC登录密码 # 将 <密码> 替换为你要设置的密码 gsettings set org.gnome.Vino authentication-methods "['vnc']" gsettings set org.gnome.Vino vnc-password $(echo -n '密码'|base64) 重启系统生效 sudo reboot 在主机的 VNC 软件中新建连接并输入 Jetson 的局域网 IP 并按回车确认 输入密码并确认 可参考英伟达官方说明 Setting Up VNC | NVIDIA Developer 摄像头 接入摄像头后,您可以使用以下指令查看现有摄像头的编号。 jetson@jetson-desktop:~$ ls /dev/video* /dev/video0 /dev/video1 1. CSI摄像头 尽量避免带电操作,接入CSI摄像头时注意FPC排线金属触点一面朝下 1.1 使用gst-launch打开摄像头 确认CSI摄像头正确连接后,分别在两个命令行窗口运行以下命令打开摄像头。 gst-launch-1.0 nvarguscamerasrc sensor-id=0 ! "video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080,format=(string)NV12, framerate=(fraction)30/1" ! nvvidconv ! xvimagesink sync=false gst-launch-1.0 nvarguscamerasrc sensor-id=1 ! "video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080,format=(string)NV12, framerate=(fraction)30/1" ! nvvidconv ! xvimagesink sync=false #打开另一个命令行窗口运行 sensor-id :指定摄像头物理接口 ID,双摄使用 sensor-id=0 和 sensor-id=1 。 memory :使用 NVIDIA GPU 内存(NVMM),减少延迟。 width, height :设置分辨率,需硬件支持,例如 1080p。 format :像素格式为 NV12 (NVIDIA 编码器原生支持)。 framerate :设置帧率,例如 30/1 (30 FPS)。 sync : false 禁用音视频同步,减少延迟。 2. USB摄像头 Cheese是一款简单易用的摄像头应用,它允许用户在Ubuntu系统中轻松地进行拍照、录像以及连拍等操作。运行以下命令以安装Cheese软件。 sudo apt install cheese 将USB摄像头连接至开发板USB接口,并打开cheese软件 Guvcview是一款开源的图形用户界面软件,它为用户提供了简单直观的方式来捕捉视频。运行以下命令以安装guvcview软件。 sudo apt install guvcview 您也仍然可以使用nvgstcapture来打开USB摄像头 # V4L2 USB camera (where is the /dev/videoN node) sudo nvgstcapture --cap-dev-node 2 #0,1默认为CSI摄像头 更详细的说明可参考 NVIDIA Developer GPIO控制 GPIO(General-purpose input/output )是一种通用型输入输出接口,其脚位可由使用者编程控制。根据实际需要,这些脚位可以被设置为通用输入(GPI)、通用输出(GPO),或兼具输入输出功能(GPIO)。 Jetson Orin Nano系列的40PIN GPIO引脚定义如下: 1 在JetPack 5系统中使用GPIO 1.1 使用命令行控制GPIO 获取GPIO口的引脚名称与编号 以31号引脚为例,454为GPIO口编号,PQ.06为引脚名称 提升至root权限,启用GPIO口 sudo bash echo 454 > /sys/class/gpio/export 设置GPIO为输入模式 echo in > /sys/class/gpio/PQ.06/direction 获取GPIO当前状态,返回值1为高电平,0为低电平 cat /sys/class/gpio/PQ.06/value 设置GPIO为输出模式 echo out > /sys/class/gpio/PQ.06/direction 设置GPIO输出,1为高电平,0为低电平 echo 1 > /sys/class/gpio/PQ.06/value 您也可以使用以下脚本进行测试 #!/bin/bash trap 'echo PQ.06 > /sys/class/gpio/unexport; echo "GPIO PQ.06 is released"' EXIT echo "setting GPIO PQ.06" echo PQ.06 > /sys/class/gpio/export 2>/dev/null # set Pin output mode echo out > /sys/class/gpio/PQ.06/direction # blink while true do echo 0 > /sys/class/gpio/PQ.06/value sleep 0.5 cat /sys/class/gpio/PQ.06/value sleep 0.5 echo 1 > /sys/class/gpio/PQ.06/value sleep 0.5 cat /sys/class/gpio/PQ.06/value sleep 0.5 done 1.2 使用python控制GPIO 1.2.1 安装JETSON.GPIO包 如果您不确定您的环境是否正常,或者您尝试使用 conda 环境运行脚本请执行以下指令安装Jetson官方的GPIO库 pip install JETSON.GPIO Jetson GPIO库提供了四种给I / O引脚编号的方法。 ​ ​BOARD​ ​:物理引脚编号(40针接口顺序)。 ​ ​BCM​ ​:Broadcom SoC 的 GPIO 编号(​ ​常用​ ​)。 ​ ​CVM​ ​:CVM/CVB 连接器的信号名称。 ​ ​TEGRA_SOC​ ​:Tegra SoC 信号名称。 import time import RPi.GPIO as GPIO # define pin number output_pin = 31 # set pin as BOARD mode GPIO.setmode(GPIO.BOARD) # set pin mode GPIO.setup(output_pin, GPIO.OUT) print("Press CTRL+C to exit") curr_value = GPIO.HIGH try: while True: time.sleep(1) print("pin {} now is {}".format(output_pin, curr_value)) GPIO.output(output_pin, curr_value) # blink curr_value ^= GPIO.HIGH finally: GPIO.cleanup() 其他具体用法和例程可参考 项目官网 1.3使用C/C++控制GPIO 安装libgpio-dev sudo apt install libgpio-dev 参考例程: /** * License - MIT. */ #include #include #include #include #define GPIO_CHIP "/dev/gpiochip0" #define GPIO_LED 3 int main() { int ret = 0; struct gpiod_chip *gpiochip; struct gpiod_line *gpioline; // Open driver. gpiochip = gpiod_chip_open(GPIO_CHIP); if (NULL == gpiochip) { printf("Error in gpiod_chip_open.\n"); ret = -1; goto out1; } // Get gpio. gpioline = gpiod_chip_get_line(gpiochip, GPIO_LED); if (NULL == gpioline) { printf("Error in gpiod_chip_get_line.\n"); ret = -1; goto out2; } // Set gpio direction. ret = gpiod_line_request_output(gpioline, "gpio", 0); if (ret != 0) { printf("Error in gpiod_line_request_output.\n"); ret = -1; goto out2; } // Blink. for (int i = 0; i < 10; i++) { printf("%d times.\n", i); gpiod_line_set_value(gpioline, 1); sleep(1); gpiod_line_set_value(gpioline, 0); sleep(1); } // Release. gpiod_line_release(gpioline); out2: gpiod_chip_close(gpiochip); out1: return ret; } 编译源文件 g++ test_gpio.cc -o test_gpio -lgpiod 执行测试程序 ./test_gpio 2 在JetPack 6系统中使用GPIO 2.1使用libgpiod控制GPIO 在 JetPack 6.2/r36.4.3 中,NVIDIA已经移除了传统的 sysfs GPIO 接口(/sys/class/gpio)不建议再使用 sysfs 来控制 GPIO。推荐使用Linux统一的 libgpiod 管理 GPIO 安装前置软件包 sudo apt-get install busybox automake autoconf libtool 验证安装是否成功 jetson@jetson-desktop:~$ gpioinfo gpiochip0 - 164 lines: line 0: "PA.00" "regulator-vdd-3v3-sd" output active-high [used] line 1: "PA.01" unused input active-high line 2: "PA.02" unused input active-high line 3: "PA.03" unused input active-high line 4: "PA.04" unused input active-high line 5: "PA.05" unused input active-high line 6: "PA.06" unused input active-high line 7: "PA.07" unused input active-high line 8: "PB.00" unused input active-high line 9: "PC.00" unused input active-high ........... 读取 GPIO 状态 gpioget $(gpiofind "PQ.06") 将 GPIO 设置为输出模式 sudo busybox devmem 0x2430070 w 0x004 各个引脚对应的寄存器地址从 官方文档 中可以查询到 保持高电平: gpioset --mode=wait `gpiofind "PQ.06"`=1 保持低电平: gpioset --mode=wait `gpiofind "PQ.06"`=0 2.2 使用python控制GPIO 在JetPack6 系统中仍需要修改寄存器内容来更改引脚GPIO模式以使用高级语言控制GPIO 将 PQ.06 引脚设置为输出模式 sudo busybox devmem 0x2430070 w 0x004 如果您尝试使用 conda 环境运行脚本请执行以下指令安装 Jetson 官方的 GPIO 库 pip install JETSON.GPIO 建议执行以下指令,重新安装系统自带的 JETSON.GPIO 库 sudo rm -rf /usr/lib/python3*/dist-packages/Jetson sudo rm -rf /usr/local/lib/python3*/dist-packages/Jetson git clone https://github.com/NVIDIA/jetson-gpio.git cd jetson-gpio sudo pip3 install . Jetson GPIO 库提供了四种给I / O引脚编号的方法。 ​ ​BOARD​ ​:物理引脚编号(40针接口顺序)。 ​ ​BCM​ ​:Broadcom SoC 的 GPIO 编号(​ ​常用​ ​)。 ​ ​CVM​ ​:CVM/CVB 连接器的信号名称。 ​ ​TEGRA_SOC​ ​:Tegra SoC 信号名称。 import time import RPi.GPIO as GPIO # define pin number PQ.06 output_pin = 31 # set pin as BOARD mode GPIO.setmode(GPIO.BOARD) # set pin mode GPIO.setup(output_pin, GPIO.OUT) print("Press CTRL+C to exit") curr_value = GPIO.HIGH try: while True: time.sleep(1) print("pin {} now is {}".format(output_pin, curr_value)) GPIO.output(output_pin, curr_value) # blink curr_value ^= GPIO.HIGH finally: GPIO.cleanup() 其他具体用法和例程可参考 项目官网 2.3使用C/C++控制GPIO 在JetPack6 系统中仍需要修改寄存器内容来更改引脚GPIO模式以使用高级语言控制GPIO 将 PQ.06 引脚设置为输出模式 sudo busybox devmem 0x2430070 w 0x004 安装libgpio-dev sudo apt install libgpiod-dev 参考例程: /** * License - MIT. */ #include #include #include #include #define GPIO_CHIP "/dev/gpiochip0" #define GPIO_LED 106 int main() { int ret = 0; struct gpiod_chip *gpiochip; struct gpiod_line *gpioline; // Open driver. gpiochip = gpiod_chip_open(GPIO_CHIP); if (NULL == gpiochip) { printf("Error in gpiod_chip_open.\n"); ret = -1; goto out1; } // Get gpio. gpioline = gpiod_chip_get_line(gpiochip, GPIO_LED); if (NULL == gpioline) { printf("Error in gpiod_chip_get_line.\n"); ret = -1; goto out2; } // Set gpio direction. ret = gpiod_line_request_output(gpioline, "gpio", 0); if (ret != 0) { printf("Error in gpiod_line_request_output.\n"); ret = -1; goto out2; } // Blink PQ.06 for (int i = 0; i < 30; i++) { printf("%d times.\n", i); gpiod_line_set_value(gpioline, 1); sleep(1); gpiod_line_set_value(gpioline, 0); sleep(1); } // Release. gpiod_line_release(gpioline); out2: gpiod_chip_close(gpiochip); out1: return ret; } 编译源文件 g++ test_gpio.cc -o test_gpio -lgpiod 执行测试程序 ./test_gpio PADCTL基地址与GPIO口偏移量 我们从官方文档中查找摘取了以下信息供您参考,您也可以自行查阅官方Pinmux和TRM文档。 PADCTL_A0(PADCTL_G3) 0x02430000 PADCTL_A4(PADCTL_G4) 0x02434000 PADCTL_A16(PADCTL_EDP) 0x02440000 PADCTL_A24(PADCTL_G7) 0x02448000 7号 GPIO09 PADCTL_G7_SOC_GPIO59_0 0x30 gpio-492 PAC.06 0x02448030 15号 GPIO12 PADCTL_EDP_SOC_GPIO39_0 0x20 gpio-433 PN.01 0x02440020 29号 GPIO01 PADCTL_G3_SOC_GPIO32_0 0x68 gpio-453 PQ.05 0x02430068 31号 GPIO11 PADCTL_G3_SOC_GPIO33_0 0x70 gpio-454 PQ.06 0x02430070 32号 GPIO07 PADCTL_G4_SOC_GPIO19_0 0x80 gpio-389 PG.06 0x02434080 33号 GPIO13 PADCTL_G4_SOC_GPIO21_0 0x40 gpio-391 PH.00 0x02434040 3 持久化GPIO配置 某些场景下可能需要开机自动配置引脚,除了配置开机脚本以外,还可以通过修改Pinmux配置表来完成。 3.1 获取Pinmux配置表和配置说明 可以在  Jetson Download Center 找到 Jetson Orin NX Series and Jetson Orin Nano Series Pinmux 项目并下载,或者直接 点击此处 获取。 3.2 更改Pinmux配置并生成设备树描述文件 以GPIO11(PQ.06)为例,将其从默认的输入模式改成输出模式,并默认输出高电平。 更改后: 保存后点击上方的Generate DT File,excel可能会提示宏被禁用,在选项有关可信文件的内容中将该文件加入到可信列表即可。 3.3 替换设备树文件 将生成的 Orin-jetson orin nano&nx pinmux hdmi-padvoltage-default.dtsi 复制一份,并分别改名为 tegra234-mb1-bct-pinmux-p3767-dp-a03.dtsi tegra234-mb1-bct-pinmux-p3767-hdmi-a03.dts 将 Orin-jetson orin nano&nx pinmux hdmi-pinmux.dtsi 也复制一份并分别改名为 tegra234-mb1-bct-padvoltage-p3767-hdmi-a03.dtsi tegra234-mb1-bct-padvoltage-p3767-pd-a03.dtsi 最后连同 Orin-jetson orin nano&nx pinmux hdmi-gpio-default.dtsi 一起五个文件复制到 ./Linux_for_Tegra/bootloader/t186ref/BCT 目录下 3.4 烧录新的Pinmux配置并开机验证 将开发板重启到恢复模式,执行下面指令刷入新的pinmux sudo ./flash.sh -c bootloader/t186ref/cfg/flash_t234_qspi.xml --no-systemimg -k A_MB1_BCT jetson-orin-nano-devkit nvme0n1p1   重启后上电验证31号引脚的电平,或者直接使用万用表测量。 gpioget $(gpiofind "PQ.06") 其他外设 1. UART接口 1.1使用 cutecom 操作UART cutecom 是一个 跨平台的串口终端程序 ,它提供了一个简洁直观的图形用户界面,允许用户通过串口接口发送和接收数据。运行以下命令以安装 cutecom sudo apt install cutecom  官方默认开启的UART接口为 ttyTHS1 即 40pin GPIO中的 pin8 (TX) 和 pin10( RX) 引脚。 使用一根条线短接8和10引脚 更改串口权限(临时授权) sudo chmod 777 /dev/ttyTHS1 运行如下语句将当前用户加入到用户组。(可选,永久授权) sudo usermod -aG dialout $USER 打开 cutecom ,选择 ttyTHS1 并打开。 输入文本并回车,可以看到下方接收区显示有内容。 1.2 使用 python 操作 UART  更改串口权限 sudo chmod 777 /dev/ttyTHS1 安装pyserial库 pip install pyserial 运行以下脚本进行测试 import serial import time PORT = "/dev/ttyTHS1" BAUDRATE = 115200 ENCODING = "UTF-8" MESSAGE = "hello,jetson\r\n" try: with serial.Serial(PORT, BAUDRATE, timeout=2) as se: print(f"Serial port {PORT} opened: {se.is_open}") while True: se.write(MESSAGE.encode(ENCODING)) print(f"Sent: {MESSAGE.strip()}") try: line = se.readline().decode(ENCODING).strip() if line: print(f"Received: {line}") except Exception as e: print(f"Read error: {e}") time.sleep(1) except serial.SerialException as e: print(f"Serial error: {e}") except KeyboardInterrupt: print("\nExit by user.") 2. SPI接口 查看开发板spi资源 jetson@ubuntu:~/Downloads$ lsmod | grep -i spi spidev                 28672  0 spi_tegra114           32768  0 2.1使用C/C++进行SPI通讯 以SPI0为例,使用条线短接19(),20号针脚 下载SPI例程 git clone https://github.com/rm-hull/spidev-test 编译源文件 cd spidev-test gcc spidev_test.c -o spidev_test 运行例程 sudo modprobe spidev #启动官方spi驱动 ./spidev_test -D /dev/spidev0.0 -s 100000 -p "\x11\x22\x33" -v 正确测试结果如下: jetson@ubuntu:~/spidev-test$ ./spidev_test -D /dev/spidev0.0 -s 100000 -p "\x11\x22\x33" -v spi mode: 0x0 bits per word: 8 max speed: 100000 Hz (100 KHz) TX | 11 22 33 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | ."3 RX | 11 22 33 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | ."3 2.1使用python进行SPI通讯 安装spidev库 pip install spidev 运行测试脚本 import spidev import time spi = spidev.SpiDev() spi.open(0, 0) spi.max_speed_hz = 1_000_000 spi.mode = 0 TEST_DATA = [   [11], [22], [33] ] for data in TEST_DATA:   resp = spi.xfer2(data)   print(f"recived:{resp}")   time.sleep(0.1) spi.close() 正确测试结果如下: (test) jetson@ubuntu:~/Downloads$ python test_spi.py recived:[11] recived:[22] recived:[33] 3. I 2 C接口 安装i2c工具 sudo apt install i2c-tools 查看开发板可用的i2c的总线: jetson@jetson-desktop:~$ i2cdetect -l i2c-0    i2c           3160000.i2c                         I2C adapter i2c-1    i2c           c240000.i2c                         I2C adapter i2c-2    i2c           3180000.i2c                         I2C adapter i2c-4    i2c           Tegra BPMP I2C adapter              I2C adapter i2c-5    i2c           31b0000.i2c                         I2C adapter i2c-7    i2c           c250000.i2c                         I2C adapter i2c-9    i2c           NVIDIA SOC i2c adapter 0            I2C adapter 查看连接到对应总线的i2c设备: jetson@jetson-desktop:~$ i2cdetect -y -r -a 7    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f 00: 00 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  正确接入i2c设备后: i2cdetect -y -r -a 7    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  4. CAN总线 C1901/C1902与C2401的连线形式不一样,请注意甄别。 C2401包括的部分为图示蓝框的部分,C1901/1902为红框所示的部分。 C1901/1902 未配置 CAN 收发芯片,仅输出CAN_TX, CAN_RX信号。 C2401设置有 CAN 收发芯片,通过总线通讯时,需要将 拨码开关1 调整至 ON  接入120Ω电阻,输出CAN_H, CAN_L信号。 CAN总线配置方法 1. 挂载相关内核模块 sudo modprobe can sudo modprobe can_raw sudo modprobe mttcan 2. 安装CAN工具进行收发操作 sudo apt-get install can-utils 3. 将CAN0 波特率 设置成10k sudo ip link set down can0 sudo ip link set can0 type can bitrate 10000 #每次调整波特率前都需要先关闭端口 sudo ip link set up can0 4. 发送数据 cansend can0 123#00.00.00.00.11.11.11.11 5. 接收数据 candump can0 & 查看can网络情况 jetson@jetson-desktop:~$ ifconfig can0: flags=193  mtu 16       unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 10  (UNSPEC)       RX packets 2  bytes 16 (16.0 B)       RX errors 0  dropped 0  overruns 0  frame 0       TX packets 0  bytes 0 (0.0 B)       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0       device interrupt 110   或者 jetson@jetson-desktop:~$ ip -d link show can0 9: can0: mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10   link/can  promiscuity 0 minmtu 0 maxmtu 0   can state ERROR-PASSIVE (berr-counter tx 128 rx 0) restart-ms 0 bitrate 10000 sample-point 0.875 tq 500 prop-seg 87 phase-seg1 87 phase-seg2 25 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  CAN 网络在协议层面有以下 3 种状态 : Error Active (主动错误) - [正常] 这是健康状态。节点可以正常收发数据,如果发现总线错误,会发送“主动错误帧”(破坏总线电平)来通知其他节点。 Error Passive (被动错误) - [警告] 当错误计数器(RX/TX Error Counter)超过 127 时进入此状态。 节点依然可以收发数据,但发送错误帧时是被动的,以此避免干扰总线上的健康节点。 Bus Off (总线关闭) - [严重] 当发送错误计数器超过 255 时进入此状态。 CAN 控制器会将自己从物理总线上 断开 ,彻底停止收发数据。 在 ifconfig 的表现 : 可能会看到 RUNNING 标志消失,或者只是发不出包。需要重启接口 ( down 然后 up ) 或配置自动重启 ( restart-ms ) 才能恢复。 5. RTC接口 实时时钟 (Real-Time Clock, RTC )是一种独立计时设备,可在系统断电或主电源关闭时持续提供精确的时间和日期信息。当开发板在​ ​离线环境​ ​下运行,并且​ ​断电后仍需保持时间同步​ ​时,就需要使用到RTC。 官方套件不支持RTC功能 载板RTC电池连接器型号为MX1.25-2P,使用电池时,请确认好极性,禁止接反电池 检查系统时间是否正确 timedatectl status 同步网络时间 sudo apt install ntpdate sudo ntpdate cn.pool.ntp.org 设置时区 sudo timedatectl set-timezone Asia/Shanghai 同步系统时间到RTC硬件 sudo hwclock --systohc --utc --rtc /dev/rtc0 --noadjfile 检查RTC硬件时间 sudo hwclock --show --utc --rtc /dev/rtc0 --noadjfile 设置开机自动同步RTC时间      1. 打开文件 sudo vi /lib/systemd/system/hwrtc.service      2.写入以下内容 [Unit] Description=Synchronise System clock to hardware RTC DefaultDependencies=no After=systemd-modules-load.service Before=systemd-journald.service systemd-fsck-root.service time-sync.target sysinit.target shutdown.target Conflicts=shutdown.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/sbin/hwclock --hctosys --utc --rtc /dev/rtc0 --noadjfile RestrictRealtime=yes [Install] WantedBy=sysinit.target      3.设置开机自启动服务 sudo systemctl enable hwrtc.service 手动RTC硬件同步到系统时间 sudo hwclock --hctosys --utc --rtc /dev/rtc0 --noadjfile 关闭网络同步时间 sudo timedatectl set-ntp false