在 Jetson-Nano 上启用 SPI 接口
介绍
Jetson Nano 具有两个与 GPIO 复用的 SPI 接口,但默认情况下 SPI 未启用。与其他 Jetson 系列(如 Orin)不同,后者支持通过配置工具 /opt/nvidia/jetson-io/jetson-io.py
启用 SPI,但这种方法不适用于 Jetson Nano。
本节以 SPI1 控制器为例,提供了在 Jetson Nano 上启用 SPI 功能的方法。请注意,此方法必须在将镜像刷写到 Jetson 设备之前应用。
本教程的方法必须在将镜像刷写到 Jetson 设备之前应用。
修改 spi 并刷写
首先,您需要将 Jetson Nano 上的 REC
引脚和 GND
引脚短接,以进入恢复模式。然后,在您的主机 PC 上,准备您打算刷写的镜像。但是,在完成 SPI 修改之前,不要将其刷写到 Jetson Nano。
您可以参考 J101 刷写 JetPack 教程,并确保仅使用命令行方法。
从 NIVIDIA DEVELOPER 下载您选择的版本,包括 BSP 和 Simple Root Filesystem。 在本指南中,我们以 L4T 32.7.2 为例。

将 BSP 和 Simple Root Filesystem 放在同一目录中,然后按照以下说明提取它们并运行 apply_binaries.sh
:
tar xf Jetson-210_Linux_R32.7.2_aarch64.tbz2
cd Linux_for_Tegra/rootfs/
sudo tar xpf ../../Tegra_Linux_Sample-Root-Filesystem_R32.7.2_aarch64.tbz2
cd ..
sudo ./apply_binaries.sh
在 Linux_for_Tegra 目录中创建一个新的 .sh
文件,并运行该脚本。脚本内容如下:
modify_spi.sh
#!/bin/bash
set -e
cd "$(dirname "$0")"
cd kernel/dtb
DTS=tegra210-p3448-0002-p3449-0000-b00.dts
DTB=tegra210-p3448-0002-p3449-0000-b00.dtb
echo "📥 Decompiling $DTB to $DTS..."
sudo dtc -I dtb -O dts -o "$DTS" "$DTB"
fix_spi_node() {
local node=$1
if grep -A5 "$node {" "$DTS" | grep -q 'status'; then
sudo sed -i "/$node {/,/spi-max-frequency/ s/status = \".*\";/status = \"okay\";/" "$DTS"
else
sudo sed -i "/$node {/,/spi-max-frequency/ s/compatible = \"tegra-spidev\";/&\n\t\tstatus = \"okay\";/" "$DTS"
fi
}
echo "🔧 Enabling spi@0 and spi@1..."
fix_spi_node "spi@0"
fix_spi_node "spi@1"
patch_pin() {
local pin=$1
sudo sed -i "/${pin} {/,/nvidia,enable-input/ {
s/nvidia,function = \"rsvd1\"/nvidia,function = \"spi1\"/
s/nvidia,tristate = <0x01>/nvidia,tristate = <0x00>/
s/nvidia,enable-input = <0x00>/nvidia,enable-input = <0x01>/
}" "$DTS"
}
echo "🔧 Patching pinmux blocks..."
for pin in spi1_mosi_pc0 spi1_miso_pc1 spi1_sck_pc2 spi1_cs0_pc3 spi1_cs1_pc4; do
patch_pin "$pin"
done
echo "🔧 Fixing tristate and input-enable for SPI1 pins..."
fix_pinmux_field() {
local pin=$1
awk -v pin="$pin" '
BEGIN { in_block = 0 }
{
if ($0 ~ pin " {") {
in_block = 1
}
if (in_block && /nvidia,tristate =/) {
sub(/<0x1>/, "<0x0>")
}
if (in_block && /nvidia,enable-input =/) {
sub(/<0x0>/, "<0x1>")
}
print
if (in_block && /}/) {
in_block = 0
}
}' "$DTS" | sudo tee "$DTS.fixed" > /dev/null && sudo mv "$DTS.fixed" "$DTS"
}
fix_pinmux_field "spi1_mosi_pc0"
fix_pinmux_field "spi1_miso_pc1"
fix_pinmux_field "spi1_sck_pc2"
fix_pinmux_field "spi1_cs0_pc3"
fix_pinmux_field "spi1_cs1_pc4"
echo "📦 Recompiling DTS to $DTB..."
sudo dtc -I dts -O dtb -o "$DTB" "$DTS"
echo "✅ SPI DTS patch applied and DTB regenerated successfully."
sudo bash modify_spi.sh
运行 modify_spi.sh
后。此脚本将更新设备树中的 SPI1 配置,重新编译它,并覆盖旧的配置。如果您想启用 SPI2,只需在 modify_spi.sh
脚本中将关键字 spi1
替换为 spi2
。
修改设备树后,将镜像刷写到 Jetson-Nano:
sudo ./flash.sh jetson-nano-emmc mmcblk0p1

重启后,40针接头上的 SPI0_MOSI
、SPI0_MISO
、SPI0_CS0
和 SPI0_CS1
引脚将可供使用。
在 Jetson-nano 上测试 SPI1
短接引脚 19 和引脚 21,它们分别对应 SPI0_MOSI
和 SPI0_MISO
,使用 SPI1 控制器执行环回测试。
Jetson-Nano 数据手册可以在这里下载和查看,特别是第 6 页。

物理连接图如下所示:

加载 SPI 驱动模块,然后下载并编译测试程序:
sudo modprobe spidev
git clone https://github.com/rm-hull/spidev-test
cd spidev-test/
gcc spidev_test.c -o spidev_test
运行测试程序并指定spidev0.0
(对应于SPI1):
./spidev_test -v -D /dev/spidev0.0 -p "Test"
测试结果如下所示,表明 SPI1 已成功完成环回传输。您也可以运行 ls /dev/spidev*
来检查可用的 SPI 控制器。

技术支持与产品讨论
感谢您选择我们的产品!我们在这里为您提供不同的支持,以确保您使用我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。