Jetson Nano I2C 读写寄存器

1、Nano I2C 简介

写下这篇博文,只为记录下我调试I2C的过程及遇到的问题,算是笔记,也希望能给博友们提供一些帮助。

2、Nano I2C 硬件环境搭建

下图是Jetson Nano J41排针上的I2C引脚图示。
分别将PIN1 – 3V3,PIN3 – SDA,PIN5 – SCL,PIN6-- GND接到从设备对应引脚。
Jetson Nano J41排针
在这里插入图片描述

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读写寄存器的调试就结束了。
当在某个思路上卡住的时候,思绪会不停地原地循环。这时候不妨跳出来,换个思维角度,或许可以看到不一样的风景。

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值