2、GPIO基础与引脚定义:Jetson 40Pin GPIO接口详解

好,咱们直接进入正题。Jetson开发板上那个40Pin的排针,你肯定不陌生。很多刚接触Jetson的朋友,第一反应就是:“这不跟树莓派的引脚一样吗?”嗯,外观确实很像,但千万别被表象骗了。我刚开始用Jetson Nano时也这么想过,结果差点把一块核心板烧了——原因就是没搞清楚引脚的电平标准。

今天我就带你把这40个引脚彻底吃透。从电源到地,从GPIO到I2C、SPI、UART,咱们一个一个捋清楚。

2.1 40Pin接口的物理布局

先看物理结构。Jetson的40Pin排针,分两列,每列20个引脚。从板子正面看,左上角是Pin 1,右上角是Pin 2。这个顺序跟树莓派完全一致,所以很多扩展板可以直接插上去用——但仅限于物理兼容。

我个人习惯把引脚分成几个功能区:

  • 电源与地:3.3V、5V、GND。这是系统的生命线。
  • 通用GPIO:可以独立控制高低电平的数字I/O。
  • 复用功能引脚:I2C、SPI、UART等通信接口。

你想想看,40个引脚里,真正能当普通GPIO用的其实没几个。大部分引脚都绑定了特定的硬件功能。这一点,很多新手会踩坑。

⚠️ 重要提醒:Jetson的40Pin接口,所有GPIO都是3.3V电平。千万别直接接5V设备!我曾经有个学员,直接把5V的舵机信号线怼到GPIO上,结果Jetson的GPIO口直接冒烟了。如果你必须接5V设备,记得用电平转换芯片,比如TXS0108E或74LVC245。

2.2 引脚功能分类详解

咱们按功能分类,逐个看。我整理了一张表,这是我在多个项目中反复验证过的,你直接拿去用。

功能类别 引脚编号 说明
电源 2, 4 (5V)
1, 17 (3.3V)
5V最大输出约2A(视型号而定)
3.3V最大输出约500mA
地 (GND) 6, 9, 14, 20, 25, 30, 34, 39 共8个GND引脚,建议都接上
GPIO 7, 11, 12, 13, 15, 16, 18, 22, 29, 31, 32, 33, 35, 36, 37, 38, 40 注意:部分引脚默认有复用功能
I2C 3 (SDA), 5 (SCL)
27 (SDA), 28 (SCL)
I2C总线0和总线1
SPI 19 (MOSI), 21 (MISO)
23 (SCLK), 24 (CE0), 26 (CE1)
SPI总线0
UART 8 (TX), 10 (RX)
29 (TX), 31 (RX)
UART0和UART1

嗯,这里要注意:引脚29和31,在Jetson Nano上默认是GPIO,但在Orin上可能被配置为UART。不同型号的Jetson,引脚复用表会有细微差别。我建议你每次拿到新板子,第一件事就是去NVIDIA官网下载对应的Pinmux配置表

2.3 引脚编号与系统映射关系

这是最容易搞混的地方。Jetson的引脚编号有三套系统:

  1. 物理引脚号:就是排针上的1到40。
  2. SoC GPIO号:芯片内部定义的编号,比如GPIO12。
  3. Linux GPIO号:在/sys/class/gpio里操作时用的数字。

举个例子。物理引脚7,在Jetson Nano上对应的SoC GPIO是GPIO216,而Linux GPIO号是216。但到了Jetson Orin上,同样的物理引脚7,SoC GPIO可能变成了GPIO_PH6,Linux GPIO号是422。

为什么会这样?因为NVIDIA每代芯片的GPIO控制器都在变。我刚开始做Orin项目时,按Nano的映射表写代码,结果GPIO死活拉不高。查了半天才发现是编号对不上。

💡 我的经验:写代码时,不要硬编码GPIO号。我习惯在程序开头定义一个映射表,像这样:
# Jetson Nano GPIO映射
GPIO_MAP = {
    7: 216,   # 物理引脚7 -> Linux GPIO 216
    11: 50,   # 物理引脚11 -> Linux GPIO 50
    12: 79,   # 物理引脚12 -> Linux GPIO 79
    13: 14,   # 物理引脚13 -> Linux GPIO 14
    # ... 完整映射见官方文档
}

def setup_gpio(physical_pin):
    linux_gpio = GPIO_MAP[physical_pin]
    # 然后操作 linux_gpio
这样换板子时,只需要改映射表,核心逻辑不用动。

2.4 实际操作:用命令行验证引脚

光说不练假把式。咱们直接上命令行,看看怎么确认引脚状态。

首先,查看当前GPIO的导出情况:

ls /sys/class/gpio/

你会看到类似这样的输出:

export  gpiochip0  gpiochip100  gpiochip216  unexport

这里的gpiochip216就代表一个GPIO控制器,起始编号是216。如果你想操作物理引脚7(对应Linux GPIO 216),可以这样:

echo 216 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio216/direction
echo 1 > /sys/class/gpio/gpio216/value

这时候,拿万用表量一下物理引脚7,应该能测到3.3V。如果没有,检查一下是不是引脚被其他功能占用了。

⚠️ 避坑指南:我曾经在调试一个电机驱动板时,发现GPIO输出正常,但电机就是不转。折腾了两小时,最后发现是GND没接全。Jetson的40Pin接口有8个GND引脚,我建议至少接2-3个。特别是驱动大电流设备时,地线回路阻抗会导致信号畸变。

2.5 常见复用功能冲突

Jetson的很多引脚是“身兼多职”的。比如物理引脚29,它可以是GPIO,也可以是UART1的TX。默认情况下,系统会把它配置成某个功能。如果你需要切换,就得改设备树。

我列几个常见的冲突场景:

  • 引脚29和31:默认是GPIO,但如果你启用了UART1,它们就变成TX/RX了。
  • 引脚3和5:默认是I2C0的SDA和SCL。如果你强行当GPIO用,可能会影响系统时钟芯片的通信。
  • 引脚19、21、23:SPI0的MOSI、MISO、SCLK。如果你接了SPI设备,这些引脚就不能当普通GPIO用了。

嗯,这里有个小技巧:在Jetson上,你可以通过jetson-io工具来查看和修改引脚复用配置。运行:

sudo jetson-io

它会弹出一个图形界面,列出所有可配置的引脚。你可以在这里把某个引脚从GPIO切换到UART或SPI。不过改完之后要重启才能生效。

2.6 总结与建议

好了,关于GPIO基础与引脚定义,咱们就聊这么多。最后给你几个实用建议:

  1. 先看原理图,再动手接线。别信网上的“通用引脚图”,不同Jetson型号有差异。
  2. 用万用表测一下。每次上电前,先量一下电源引脚的对地电阻,确保没有短路。
  3. 做好电平转换。3.3V的Jetson,别直接怼5V设备。一个电平转换芯片才几块钱,烧一块Jetson可是上千块。
  4. 善用设备树覆盖。如果你需要自定义引脚功能,别直接改内核源码,用设备树覆盖(Device Tree Overlay)更安全。

下一章,咱们会深入讲GPIO的软件控制——用Python和C语言操作这些引脚,实现PWM、中断、输入输出等高级功能。到时候我会分享一个我实际项目中用过的电机控制代码,保证干货满满。