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用的其实没几个。大部分引脚都绑定了特定的硬件功能。这一点,很多新手会踩坑。
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到40。
- SoC GPIO号:芯片内部定义的编号,比如GPIO12。
- 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死活拉不高。查了半天才发现是编号对不上。
# 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。如果没有,检查一下是不是引脚被其他功能占用了。
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基础与引脚定义,咱们就聊这么多。最后给你几个实用建议:
- 先看原理图,再动手接线。别信网上的“通用引脚图”,不同Jetson型号有差异。
- 用万用表测一下。每次上电前,先量一下电源引脚的对地电阻,确保没有短路。
- 做好电平转换。3.3V的Jetson,别直接怼5V设备。一个电平转换芯片才几块钱,烧一块Jetson可是上千块。
- 善用设备树覆盖。如果你需要自定义引脚功能,别直接改内核源码,用设备树覆盖(Device Tree Overlay)更安全。
下一章,咱们会深入讲GPIO的软件控制——用Python和C语言操作这些引脚,实现PWM、中断、输入输出等高级功能。到时候我会分享一个我实际项目中用过的电机控制代码,保证干货满满。