使用命令行为自己的脚本启用和检查Raspberry Pi上的I2C
大多数人都知道,你可以用raspi-config来启用I2C端口。
raspi-config还提供了一个非交互式模式,你可以使用命令行参数来驱动它的功能。
读取Raspberry Pi上I2C端口的当前状态
下面是如何读取I2C端口的当前状态。
sudo raspi-config nonint get_i2c
该命令将返回。
- 如果端口被禁用,则为1
- 如果端口已启用,则为0
注意:在这种情况下,逻辑是bash脚本!"0表示真实或没有错误,所有其他数字表示错误代码"。这让我一开始就明白了!
注:nonint代表 "非交互式"。
使用一个简单的命令在Raspberry Pi上启用I2C
再次使用raspi-config我们可以设置I2C端口的状态。使用raspi-config的好处是它为你处理了许多额外的事情,而且应该是向上兼容的。在幕后,raspi-config将为你编辑/boot/config.txt,例如,还可以更新设备树。
下面是如何启用I2C端口。
sudo raspi-config nonint do_i2c 0
再次注意到, 0表示真实/在这里!
下面是禁用I2C端口的方法。
sudo raspi-config nonint do_i2c 1
1表示 "假 "或为此目的而关闭。
检查I2C是否被启用
非交互式模式下的raspi-config
如上所述,你可以用以下方法读取I2C端口的状态
sudo raspi-config nonint get_i2c
该截图显示了I2C端口启用时的输出(0 = true)。
I2C设备节点
当I2C在Raspberry Pi上被启用时,你也会看到它的/dev节点。
ls /dev/i2*
/dev/i2c-1
注意:在第一批Raspberry Pi模型上,暴露给用户的I2C端口是I2C 0,所以我们希望/dev/i2c-0
屏幕截图显示,i2c-1节点存在于/dev中。
gpio readall
这里有一个输出
sudo gpio readall
对于BCM 2和3,你可以在名称下看到 "SDA1"(I2C数据)和 "SCL1"(I2C时钟)。另外,模式是ALT0,它对应于这些特定引脚(GPIO2、GPIO3)的I2C功能。
请注意,BCM 2和3是Broadcom的编号,不是GPIO引脚的编号。GPIO引脚位置是 "物理 "中的第一列(引脚3和5)。
(你可以参考本文件,第102页如果你有兴趣的话,可以看一下不同的GPIO引脚模式的概述)
ǞǞǞ
lsmod将显示已加载的I2C模块。
lsmod | grep i2c
i2c_bcm2835 16384 0
i2c_dev 20480 0
所以禁用I2C没有区别。
i2cdetect:
最后一个测试是运行i2cdetect来扫描地址范围。对于现代Pis,你将需要指定1作为端口。
sudo i2cdetect -y 1
这将输出一个当前检测到的I2C设备的表格。
注:在我的情况下,由于没有连接I2C设备,所以没有I2C设备显示出来--这个输出是预期的。
检查I2C是否被禁用
非交互式模式下的raspi-config
如上所述,你可以用以下方法读取I2C端口的状态
sudo raspi-config nonint get_i2c
该截图显示了I2C端口被禁用时的输出(1=false)。
I2C设备节点
当Raspberry Pi上的I2C被禁用时,你将不会看到它的/dev节点。
ls /dev/i2*
ls: 无法访问'/dev/i2*'。没有这样的文件或目录
截图显示,/dev中不存在任何i2c节点。
gpio readall
这里有一个输出
sudo gpio readall
对于BCM 2和3,你可以在名称下看到 "SDA1"(I2C数据)和 "SCL1"(I2C时钟)。
然而,与启用的版本相比(见上文),模式是IN,该引脚现在是一个GPIO输入。
请注意,BCM 2和3是Broadcom的编号,而不是GPIO引脚布局。
(你可以参考本文件,第102页如果你有兴趣的话,可以看一下不同的GPIO引脚模式的概述)
ǞǞǞ
lsmod将显示已加载的I2C模块。
lsmod | grep i2c
i2c_bcm2835 16384 0
i2c_dev 20480 0
所以,启用I2C没有什么区别--你 不可能 将此作为一个测试。
i2cdetect:
最后一个测试是运行i2cdetect来扫描地址范围。对于现代Pis,你将需要指定1作为端口。
sudo i2cdetect -y 1
如果I2C被禁用,这将显示一个错误。
错误。无法打开文件`/dev/i2c-1′或`/dev/i2c/1′。没有这样的文件或目录
I2C端口的陷阱和问题,常见问题
要启用I2C端口,是否需要重新启动?
在我看来,重启是 不是 有必要。我看了一下raspi-config的代码,他们要求为其他端口(例如UART)重新启动,但没有要求为I2C端口重新启动。
另外,当动态切换I2C开/关状态时,你将能够验证设备节点是否被创建,并且可以使用i2cdetect扫描I2C范围,而无需重启。
然而,如果所有其他方法都失败了,请继续尝试重启--它可能对其他一些情况有帮助。
是否有更多的可能性来驱动raspi-config,例如UART和SPI端口,用于SSH,等等?
当然 - raspi-config在非交互式模式下支持广泛的不同选项。
所有这些命令的运行都使用
raspi-config nonint (可选参数)。
你可以看一下 raspi-config 源代码,或参考 在Raspberry Pi论坛上的这个有用的帖子.
再次,请注意(对某些开发者来说是混乱的)惯例,0=真/开,1=假/关。
i2cdetect无法扫描
如果你得到以下错误。
错误。无法打开文件`/dev/i2c-1′或`/dev/i2c/1′。没有这样的文件或目录
I2C很可能被禁用了。尝试启用它,使用本文中的方法或使用raspi-config,然后再次尝试扫描I2C端口。
你可以使用本文介绍的方法来验证你的Raspberry Pi上的I2C端口的状态。
gpio readall无法确定板卡类型
如果你在Raspberry Pi 4上试图运行gpio readall时得到这个消息。
13:01:19 pi@Avalon:/dev $ sudo gpio readall
哎呀--无法确定董事会的类型......模型。17
你必须安装作者提供的较新版本的wiringpi(它还没有在上游软件库中)。 这篇文章 描述了如何做到这一点。
这里是简短的版本。
cd /tmp
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb