尽管 i2cDetect 确实检测到目标,但我的 Raspberry Pi 4 Model B 上的 I2C 总线无法正常工作。
我尝试使用 Raspberry Pi Sense HAT 和 SSD1306 OLED 显示屏以及带有 I2C 总线的 PCA9685 伺服驱动器。一切正常。我不知道为什么现在 I2C 总线不工作。然后我不确定其中一台设备是否有缺陷。OLED 显示屏有时会显示“雪花”。因此可能存在信号损坏。
然后我在没有 Sense HAT 的情况下测试了 Raspberry Pi。也许 Sense HAT 可能存在缺陷。没有任何帮助。然后我拔掉了OLED显示屏,但没有成功。之后将 PCA9685 插入 OLED 显示屏。现在 OLED 显示屏显示了正确的结果。我用伺服检查器测试了连接到 PCA9685 的三个伺服系统,幸运的是我发现它们没有缺陷。所以我再次连接了 PCA9685,但我无法向我的伺服系统发送 PWM 信号。之后,我移除了插入 PCA9685 和 OLED 显示屏的 I2C 集线器,以再次测试 Raspberry Pi Sense HAT。这不起作用。之后,我在较旧的 Raspberry Pi 3 Model B+ 上尝试了 Sense HAT,并且可以正确使用它。
所以我的想法是 Raspberry Pi 的 I2C 总线配置有问题。然后我进入 raspi-config 并停用 I2C 接口选项,重新启动 Pi 并再次启用此选项。没有任何帮助。
我无法使用 PCA9685 和伺服系统,也无法使用 Raspberry Pi Sense HAT,也无法使用 OLED 显示屏。使用 i2cDetect 我可以检测地址。
这就是我得到的:
python imu.py
Traceback (most recent call last):
File "imu.py", line 3, in <module>
sense = SenseHat()
File "/usr/lib/python3/dist-packages/sense_hat/sense_hat.py", line 39, in __init__
raise OSError('Cannot detect %s device' % self.SENSE_HAT_FB_NAME)
OSError: Cannot detect RPi-Sense FB device
Run Code Online (Sandbox Code Playgroud)
它可以是 Sense HAT 的任何 python 测试程序。两天前。一切正常...我可以毫无错误地运行伺服系统程序,但现在伺服系统不执行任何操作。所以他们得不到 PWM 信号。现在我测试了OLED显示程序,它可以工作。但文本不是静态显示而是闪烁。也许这是因为 I2C 总线无法正常工作。
sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- 1c -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- 5c -- -- 5f
60: -- -- -- -- -- -- -- -- -- -- 6a -- -- -- -- --
70: 70 -- -- -- -- -- -- --
Run Code Online (Sandbox Code Playgroud)
1c、3c、5c、5f 和 6a 应该是 Sense HAT...40 OLED 显示屏,70 PCA9685。
dmesg | grep i2c
[ 2.434699] i2c /dev entries driver
cat /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
i2c-dev
i2c-bcm2708
spi-bcm2835
spi-bcm2708
snd-bcm2835
Run Code Online (Sandbox Code Playgroud)
cat /etc/modprobe.d/raspi-blacklist.conf 为空
sudo i2cdetect -y 0
Error: Could not open file `/dev/i2c-0' or `/dev/i2c/0': No such file or directory
Run Code Online (Sandbox Code Playgroud)
在 /boot/config.txt 中,两行均已启用:
dtparam=i2c1=on
dtparam=i2c_arm=on
Run Code Online (Sandbox Code Playgroud)
我无法说出导致错误的原因以及错误到底是什么。两天前一切正常,但现在不行了。在 PCA9685 上,我测量了引脚上的电压,它们没有缺陷。
此外,在 /boot/config.txt 中启用了 dtoverlay=rpi-sense。
raspi-gpio get
BANK0 (GPIO 0 to 27):
GPIO 0: level=1 fsel=0 func=INPUT pull=UP
GPIO 1: level=1 fsel=0 func=INPUT pull=UP
GPIO 2: level=1 fsel=4 alt=0 func=SDA1 pull=UP
GPIO 3: level=1 fsel=4 alt=0 func=SCL1 pull=UP
GPIO 4: level=0 fsel=0 func=INPUT pull=UP
GPIO 5: level=0 fsel=0 func=INPUT pull=UP
GPIO 6: level=1 fsel=0 func=INPUT pull=UP
GPIO 7: level=1 fsel=1 func=OUTPUT pull=UP
GPIO 8: level=1 fsel=1 func=OUTPUT pull=UP
GPIO 9: level=0 fsel=4 alt=0 func=SPI0_MISO pull=DOWN
GPIO 10: level=0 fsel=4 alt=0 func=SPI0_MOSI pull=DOWN
GPIO 11: level=0 fsel=4 alt=0 func=SPI0_SCLK pull=DOWN
GPIO 12: level=0 fsel=0 func=INPUT pull=DOWN
GPIO 13: level=0 fsel=0 func=INPUT pull=DOWN
GPIO 14: level=1 fsel=2 alt=5 func=TXD1 pull=NONE
GPIO 15: level=1 fsel=2 alt=5 func=RXD1 pull=UP
GPIO 16: level=0 fsel=0 func=INPUT pull=DOWN
GPIO 17: level=0 fsel=0 func=INPUT pull=DOWN
GPIO 18: level=0 fsel=0 func=INPUT pull=DOWN
GPIO 19: level=0 fsel=0 func=INPUT pull=DOWN
GPIO 20: level=0 fsel=0 func=INPUT pull=DOWN
GPIO 21: level=0 fsel=0 func=INPUT pull=DOWN
GPIO 22: level=0 fsel=0 func=INPUT pull=DOWN
GPIO 23: level=0 fsel=0 func=INPUT pull=DOWN
GPIO 24: level=0 fsel=0 func=INPUT pull=DOWN
GPIO 25: level=0 fsel=0 func=INPUT pull=DOWN
GPIO 26: level=0 fsel=0 func=INPUT pull=DOWN
GPIO 27: level=0 fsel=0 func=INPUT pull=DOWN
BANK1 (GPIO 28 to 45):
GPIO 28: level=1 fsel=2 alt=5 func=RGMII_MDIO pull=UP
GPIO 29: level=0 fsel=2 alt=5 func=RGMII_MDC pull=DOWN
GPIO 30: level=0 fsel=7 alt=3 func=CTS0 pull=UP
GPIO 31: level=0 fsel=7 alt=3 func=RTS0 pull=NONE
GPIO 32: level=1 fsel=7 alt=3 func=TXD0 pull=NONE
GPIO 33: level=1 fsel=7 alt=3 func=RXD0 pull=UP
GPIO 34: level=1 fsel=7 alt=3 func=SD1_CLK pull=NONE
GPIO 35: level=1 fsel=7 alt=3 func=SD1_CMD pull=UP
GPIO 36: level=1 fsel=7 alt=3 func=SD1_DAT0 pull=UP
GPIO 37: level=1 fsel=7 alt=3 func=SD1_DAT1 pull=UP
GPIO 38: level=1 fsel=7 alt=3 func=SD1_DAT2 pull=UP
GPIO 39: level=1 fsel=7 alt=3 func=SD1_DAT3 pull=UP
GPIO 40: level=0 fsel=4 alt=0 func=PWM1_0 pull=NONE
GPIO 41: level=0 fsel=4 alt=0 func=PWM1_1 pull=NONE
GPIO 42: level=0 fsel=1 func=OUTPUT pull=UP
GPIO 43: level=1 fsel=0 func=INPUT pull=UP
GPIO 44: level=1 fsel=5 alt=1 func=SDA0 pull=UP
GPIO 45: level=1 fsel=5 alt=1 func=SCL0 pull=UP
BANK2 (GPIO 46 to 53):
GPIO 46: level=0 fsel=0 func=INPUT pull=DOWN
GPIO 47: level=0 fsel=0 func=INPUT pull=DOWN
GPIO 48: level=0 fsel=0 func=INPUT pull=DOWN
GPIO 49: level=0 fsel=0 func=INPUT pull=DOWN
GPIO 50: level=0 fsel=0 func=INPUT pull=DOWN
GPIO 51: level=0 fsel=0 func=INPUT pull=DOWN
GPIO 52: level=0 fsel=0 func=INPUT pull=DOWN
GPIO 53: level=0 fsel=0 func=INPUT pull=DOWN
Run Code Online (Sandbox Code Playgroud)
我不确定在哪里可以搜索错误,因为我的硬件可以在较旧的 Raspberry Pi 上运行。希望有一个人可以帮助我。提前致谢。
问题
问题的简短描述
OP 的 I2C 总线可以工作,但只是间歇性地工作。
配置
OP正在使用Rpi4B。他正在测试以下 I2C 设备:
1. Sense HAT
2. SSD1306 OLED display and
3. PCA9685 PWM Controller/Servo Driver, connected to up to 3 servos.
Run Code Online (Sandbox Code Playgroud)
OP测试结果总结
一开始,I2C总线可以毫无问题地检测到I2C设备(一个接一个)。
I2C集线器(注1)被移除并恢复后,错误开始出现,所有检测HAT、OLED显示器、PWM控制器不工作,或者不能正常工作。
此时,i2cdetect -y 1 仍然可以正常工作。
问题的可能原因及解决建议
1. I2C总线可能过载。
I2C 总线有最大阻抗限制,约为 400pF。因此,如果在同一总线上放置太多 I2C 设备,总电容会增加,并且 I/O 错误 121 开始出现,并且性能不再稳定。当我添加越来越多的 I2C 设备时,尤其是具有相同的 I2C 地址时,我通常会发现 I2C 总线不稳定。例如,我可以在同一总线上添加三个或四个不同的I2C设备,发现没有问题,但是当我尝试添加越来越多的相同类型的I2C设备(我的实验中是MCP23017)时,系统变得不稳定,I/O错误变得频繁。我的结论是,即使我最多添加8个MCP23017,仍然可以被检测到,但系统很不稳定,通常两个MCP23017是稳定运行的极限。
2、接线可能太长
当布线太长时,电容/阻抗迟早会达到 400pF 的极限。我通常从 30 厘米开始,通过反复试验,延伸到大约两米,这时问题开始出现。一个快速但肮脏的解决方案是使用电平转换器(例如 TBX0102),情况会有所改善。我曾经尝试使用硬件I2C扩展器和缓冲芯片,但发现结果并不令人印象深刻。我也尝试过使用双绞线 CAT5 电缆,但仍然不能走太长。
3.I2C速度太高
对于 Rpi4B,我们可以调整 I2C 速度,低至 10kHz,高达 500kHz。较低的速度会降低 I2C 总线阻抗,从而减少信号失真和错误。
4. PCA9685 PWM控制器板噪音太大
这块PCB板有一个空间可以插入一个“大”电容器,以稳定本地电源。我忘记了100uF是否是推荐值,但是贪心的我通常使用1000uF或更多。我从不使用 Rpi 的 5V 电源轨来驱动伺服/直流电机。我总是使用外部电源(6 ~ 7.5V,3A+)。此外,始终尝试将 PWM 信号应用到“不同步”的伺服系统,以减少可能反馈到 Rpi 并导致故障的尖峰和毛刺。
5. 使用多条 I2C 总线,以免单条总线过载
对于 Rpi4B,您可以使用 5 个单板 I2C 总线。因此,OP 可能希望将负载分散到三个总线,尤其是使用单个总线来解决 PCA9685 PWM/伺服控制器可能出现的问题。
下面的 penzu 实验室报告展示了如何为多个 I2C 总线配置 Rpi,以及使用 3 个 ADXL345 用于三个独立总线的示例(简要描述了 PCA9685)。
Appendix A - /boot/config.txt tlfong01 2020mar04
# /boot/config.txt 2020feb0801 tlfong01
# last update 2020mar04hkt1830
# *** Display ***
disable_overscan=1
dtoverlay=vc4-fkms-v3d
max_framebuffers=2
# *** Audio ***
dtparam=audio=on
# *** UART ***
enable_uart=1
# *** I2C ***
# *** Changingspeed***
# dtparam=i2c_arm=on,i2c_arm_baudrate=50000
# dtparam=i2c_arm=on,i2c_arm_baudrate=100000
# dtparam=i2c_arm=on,i2c_arm_baudrate=400000
dtparam=i2c_arm=on,i2c_arm_baudrate=1000000
# *** Configuring two I2 buses ***
dtoverlay=i2c1,pins_2_3 (board pins 3, 5)
dtoverlay=i2c3,pins_4_5 (board pins 7, 29)
# dtoverlay=i2c4,pins_6_7 (board pins 31, 26)
# dtoverlay=i2c5,pins_12_13 (board pins 32, 33)
# dtoverlay=i2c6,pins_22_23 (board pins 15, 16)
# *** SPI ***
dtparam=spi=on
dtoverlay=spi1-3cs
# *** End of config.txt ***
Run Code Online (Sandbox Code Playgroud)
/ 接着说, ...
小智 5
试试这个/boot/config.txt
#dtparam=i2c_arm=on
dtoverlay=i2c-gpio,i2c_gpio_sda=2,i2c_gpio_scl=3,i2c_gpio_delay_us=2,bus=1
Run Code Online (Sandbox Code Playgroud)
为我工作(RPi4 客户端,Arduino 作为 I2C 服务器)100khz 标准 I2C 10k 上拉电阻
| 归档时间: |
|
| 查看次数: |
19483 次 |
| 最近记录: |