使用命令行为自己的脚本启用和检查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

形象