Jetson Nano I2C 读写寄存器
1、Nano I2C 简介
写下这篇博文,只为记录下我调试I2C的过程及遇到的问题,算是笔记,也希望能给博友们提供一些帮助。
2、Nano I2C 硬件环境搭建
下图是Jetson Nano J41排针上的I2C引脚图示。
分别将PIN1 – 3V3,PIN3 – SDA,PIN5 – SCL,PIN6-- GND接到从设备对应引脚。
3、Nano I2C 软件环境搭建
3.1、安装I2C-Tools
开发板接上网线,输入如下指令。
nvidia@nvidia-desktop:~$ sudo apt-get update
nvidia@nvidia-desktop:~$ sudo apt-get install -y i2c-tools
安装完成后,检查是否安装成功。
nvidia@nvidia-desktop:~$ apt-cache policy i2c-tools
3.2、I2C-Tools使用
3.2.1、i2cdetect
【 i2cdetect】用于检测系统上的I2C总线情况。
列出所有安装的总线。
nvidia@nvidia-desktop:~$ sudo i2cdetect -F 2
Functionalities implemented by /dev/i2c-2:
I2C yes
SMBus Quick Command no
SMBus Send Byte yes
SMBus Receive Byte yes
SMBus Write Byte yes
SMBus Read Byte yes
SMBus Write Word yes
SMBus Read Word yes
SMBus Process Call yes
SMBus Block Write yes
SMBus Block Read no
SMBus Block Process Call no
SMBus PEC yes
I2C Block Write yes
I2C Block Read yes
nvidia@nvidia-desktop:~$ sudo i2cdetect -l
i2c-3 i2c 7000c700.i2c I2C adapter
i2c-1 i2c 7000c400.i2c I2C adapter
i2c-8 i2c i2c-6-mux (chan_id 1) I2C adapter
i2c-6 i2c Tegra I2C adapter I2C adapter
i2c-4 i2c 7000d000.i2c I2C adapter
i2c-2 i2c 7000c500.i2c I2C adapter
i2c-0 i2c 7000c000.i2c I2C adapter
i2c-7 i2c i2c-6-mux (chan_id 0) I2C adapter
i2c-5 i2c 7000d100.i2c I2C
扫描挂载在总线上的I2C设备
nvidia@nvidia-desktop:~$ sudo i2cdetect -y -r -a 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
10: 10 -- -- -- -- -- -- -- -- -- 1a -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
nvidia@nvidia-desktop:~$ sudo i2cdetect -y -r -a 2
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 -- -- -- -- -- -- 57 -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
有设备就会列出设备地址。如1号总线上接有0x10和0x1a两个从设备;2号总线上接有0x50和0x57两个从设备。
0x10和0x1a的寄存器地址是双字节,0x50和0x57寄存器地址是单字节。后面会讲到对单字节和双字节地址该如何操作。
说下0xUU。UU表示该地址被Kernel 使用,无法被用户扫描。
nvidia@nvidia-desktop:~$ sudo i2cdetect -y -r -a 6
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- 6a -- -- -- -- --
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
3.2.2、i2cdump
【i2cdump】用于查看设备寄存器的值。
i2cdump [-f] [-y] [-r first-last] I2CBUS ADDRESS [MODE [BANK [BANKREG]]]
例如:查看2号总线上设备0x50全部寄存器的值。
nvidia@nvidia-desktop:~$ sudo i2cdump -y 2 0x50
No size specified (using byte-data access)
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
20: 30 40 50 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
30: 56 57 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
40: 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ?...............
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
80: 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ?...............
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
3.2.3、i2cset
【i2cset】用于设置设备单个寄存器值(用于单字节寄存器)。
i2cset [-f] [-y] [-m MASK] [-r] I2CBUS CHIP-ADDRESS DATA-ADDRESS [VALUE] ... [MODE]
例如:设置地址为0x50设备里0x20寄存器的值为0x04。
nvidia@nvidia-desktop:~$ sudo i2cset -f -y 2 0x50 0x21 0x04
读出校验一下,0x21的值已修改成0x04。
nvidia@nvidia-desktop:~$ sudo i2cdump -y 2 0x50
No size specified (using byte-data access)
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
20: 30 04 50 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
30: 56 57 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
40: 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ?...............
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
80: 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ?...............
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
3.2.4、i2cget
【i2cget】用于查看设备单个寄存器值(用于单字节寄存器)。
i2cget [-f] [-y] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE]]
I2CBUS is an integer or an I2C bus name
ADDRESS is an integer (0x03 - 0x77)
MODE is one of:
b (byte, default)
w (word)
W (word on even register addresses)
s (SMBus block)
i (I2C block)
c (consecutive byte)
Append p for SMBus PEC
例如:读取地址为0x50设备里0x20寄存器的值。
nvidia@nvidia-desktop:~$ sudo i2cget -y 2 0x50 0x20
0x30
3.2.5、i2ctransfer
【i2ctransfer】用于读写设备寄存器值(可用于双字节寄存器)。
调试过程中发现,i2cget和i2cset 只支持0x03~0x77范围内的地址,是无法读/写16位地址寄存器的。当时也问了很多人,也找过亚博的技术大牛,都无法给出答案。山重水复疑无路,柳暗花明又一村。我居然发现了它–i2ctransfer。它不仅可以操作16位地址寄存器,还可以一次性读/写多个地址。当时那个心情啊!!!
sudo i2ctransfer -f -y [总线序号] w[待写入数据长度]@[设备地址] [寄存器地址高字节] [寄存器地址低字节] r[待读出数据长度]。
例如:向1号总线上,设备地址0x10,寄存器地址0x0101开始,读取长度为16个字节的数据。
nvidia@nvidia-desktop:~$ sudo i2ctransfer -f -y 1 w2@0x10 0x01 0x01 r16
0x80 0x80 0x00 0x08 0x10 0x1a 0x00 0x00 0x00 0x10 0x27 0x00 0x00 0x40 0x79 0x0d
例如:向1号总线上,设备地址0x10,寄存器地址0x0109开始,写入长度为1个字节的数据。写入0x20,然后读出校验。
nvidia@nvidia-desktop:~$ sudo i2ctransfer -f -y 1 w3@0x10 0x01 0x09 0x20
nvidia@nvidia-desktop:~$ sudo i2ctransfer -f -y 1 w2@0x10 0x01 0x01 r16
0x80 0x80 0x00 0x08 0x10 0x1a 0x00 0x00 0x00 0x20 0x27 0x00 0x00 0x40 0x79 0x0d
如读出一个字节可以这样。
nvidia@nvidia-desktop:~$ sudo i2ctransfer -f -y 1 w2@0x10 0x01 0x01 r1
0x80
4、总结
至此,Jetson Nano 通过I2C读写寄存器的调试就结束了。
当在某个思路上卡住的时候,思绪会不停地原地循环。这时候不妨跳出来,换个思维角度,或许可以看到不一样的风景。