Raspberry Pi 4 I2C 总线无法正常工作

2023-12-02

尽管 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

它可以是 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 -- -- -- -- -- -- -- 

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

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

在 /boot/config.txt 中,两行均已启用:

dtparam=i2c1=on
dtparam=i2c_arm=on

我无法说出导致错误的原因以及错误到底是什么。两天前一切正常,但现在不行了。在 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

我不确定在哪里可以搜索错误,因为我的硬件可以在较旧的 Raspberry Pi 上运行。希望有一个人可以帮助我。提前致谢。


Question

问题的简短描述

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.

OP测试结果总结

  1. 一开始,I2C总线可以毫无问题地检测到I2C设备(一个接一个)。

  2. I2C集线器(注1)被移除并恢复后,错误开始出现,所有检测HAT、OLED显示器、PWM控制器不工作,或者不能正常工作。

  3. 此时,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)。

配置和使用Rpi4B的5条I2C总线

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 ***

/ 接着说, ...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Raspberry Pi 4 I2C 总线无法正常工作 的相关文章

  • I2C读取IST8310

    文章目录 I2C简介I2C传输过程I2C仲裁IST8310磁力计Cube配置相关函数HAL I2C Mem Read函数HAL I2C Mem Write函数IST8310的初始化 程序流程代码编写 I2C简介 2C是一种半双工双向二线制的
  • Linux 下 i2c switch(选路芯片mux) — pca9548

    作者 xff1a 韩大卫 64 吉林师范大学 现有的关于i2c switch 资料非常少 即使阅读完官方的datasheet 也不能写出完全正确的操作 因为内核中的驱动本身不是那么完善的 还有一些资料是单片机编程的 xff0c 可惜在lin
  • 树莓派 I2C通信,控制多个I2C从设备

    1 需要安装 i2c tools工具 在黑框输入 xff1a sudo apt get install i2c tools 2 后续编程使用python库 在黑框输入 xff1a sudo apt get install python sm
  • 十九、I2C驱动及应用

    一 概述 1 Linux主机驱动和外设驱动分离思想 外设驱动 API 主机驱动 板级逻辑 具体的i2c设备 xff08 camera xff0c ts xff0c eeprom等等 xff09 主机驱动 xff1a 根据控制器硬件手册 xf
  • I2C slave address

    1 同一 I2C bus device 之 I2C slaver address 不可一样 2 检查 这些 devices 是否可以变更 I2C slaver address hardware pin control or software
  • 串口通信协议【I2C、SPI、UART、RS232、RS422、RS485、CAN、TTL、USB】

    xff08 1 xff09 I2C 集成电路互连总线接口 Inter IC xff1a 同步串行半双工传输总线 xff0c 连接嵌入式处理器及其外围器件 支持器件 xff1a LCD驱动器 Flash存储器 特点 有两根传输线 xff08
  • AM2322温湿度传感器(地址0XB8)---I2C总结(I2C_ModBus协议)

  • I2C总线和SPI总线

    I2C串行总线一般有两根信号线 xff0c 一根是双向的数据线SDA xff0c 另一根是时钟线SCL I2C协议 2条双向串行线 xff0c 一条数据线SDA xff0c 一条时钟线SCL SDA传输数据是 大端传输 xff08 字节高位
  • Linux控制I2C/SMBus设备

    平台 xff1a 树莓派 bcm2835 Raspberry Pi 3 Model B Rev 1 2 I2C是Philips开发的一种两线通信协议 xff0c 常用于一些对速度要求不高的小型器件上 SMBus是系统管理总线 xff0c 基
  • DAC MCP4725 i2c 驱动(linux)

    mcp4725是一款低功耗 高精度 单通道 拥有EEPROM的12位的dac 由于最近项目中使用到了该芯片所以贴出来给大家参考 步进电机电机芯片半流锁定 本贴呢非项目中使用的平台 主要是想在linux 下实现对该器件的使用 实现一个简单的i
  • STM32基础---BH1750 硬件 IIC 驱动程序+ 测试demo

    STM32基础 BH1750 硬件 IIC 驱动程序 测试demo STM32CudeMx MDK ARM BH1750 简介 产品介绍 产品特点 测量程序步骤 指令集合结构 从 写指示 到 读出测量结果 的测量时序实例 STM32Cube
  • STM32设置为I2C从机模式(HAL库版本)

    STM32设置为I2C从机模式 HAL库版本 目录 STM32设置为I2C从机模式 HAL库版本 前言 1 硬件连接 2 软件编程 2 1 步骤分解 2 2 测试用例 3 运行测试 3 1 I2C连续写入 3 2 I2C连续读取 3 3 I
  • 【总线】I2C 通信协议

    目录 I2C 总线协议概述 参数总结 I2C 的工作原理 寻址 读 写位 数据帧 I2C数据传输的步骤 具有多个从机的单个主机 具有多个从机的多个主机 I2C的优缺点 优点 缺点 文章参考 I2C 总线协议概述 I2C 总线广泛应用在 OL
  • 在树莓派中安装QtVirtualkeyboard?

    我尝试在 Raspberry pi 中实现 Qt Virtualkeyboard 使用PyQt5 显示虚拟键盘但我没有找到它的前缀路径 bin plugin等文件夹 实际上整个Qt文件夹不存在 In 我之前的解决方案我使用了官方提供的 Qt
  • 在 Raspberry Pi 4 上安装 Java 16

    我尝试过多个版本here https github com AdoptOpenJDK openjdk16 binaries releases tag jdk16u 2021 05 08 12 45 using sudo i cd usr l
  • C/C++ MPI 加速未达到预期

    我正在尝试编写一个 MPI 应用程序来通过计算机集群加速数学算法 但在此之前我正在做某种基准测试 但最初的结果并不像预期的那么好 测试应用程序在 4 核时具有线性加速 但 5 6 核并未加速应用程序 我正在使用 Odroid N2 平台进行
  • 如何将 I2C 地址传递给 Adafruit CircuitPython 代码? (运行 ADS1115)

    我正在尝试使用两个 I2C 地址 0x48 0x49 在一个 Raspberry Pi 上运行两个 Adafruit ADS1115 每个设备的地址可以通过将 ADDR 引脚连接为高电平 0x49 或使其悬空 默认为 0x48 来设置 我已
  • 如何使用 gstreamer 在两个不同的显示器上同时播放两个不同的视频

    我在用 Raspberry Pi 4 B 型 有 2 个 HDMI 端口 Gstreamer 1 0 我有两个视频保存在存储卡中 我想将两个视频驱动到两个不同的 HDMI 端口 并同时在两个不同的显示器上播放视频 我想知道 Gstreame
  • Microk8s、MetalLB、ingress-nginx - 如何路由外部流量?

    Kubernetes Ubuntu 新手来了 我正在使用单个 Raspberry Pi 设置 k8s 集群 希望将来有更多 我用的是microk8sv1 18 8和 Ubuntu 服务器20 04 1 LTS GNU Linux 5 4 0
  • Linux、ARM:为什么仅当启动时存在 I2C GPIO 扩展器时才创建 gpiochip

    在 imx6sx 硬件平台 NXP 嵌入式 ARM 上使用 Linux 3 14 52 问题是设备树中指定的 PCF8575 I2C GPIO 扩展器不会实例化为 sys class gpio 结构中的设备 除非它们在内核启动期间存在 这些

随机推荐