linux-kernel - Linux I2C通信问题

标签 linux-kernel embedded-linux i2c imx6 nxp-microcontroller

我正在开发一个基于 iMX6Q 处理器的定制板,该处理器使用 linux-imx 内核 4.9.11 ( http://git.freescale.com/git/cgit.cgi/imx/linux-imx.git/?h=imx_4.9.11_1.0.0_ga )。但是,当我向其中一个外设发送 I2C 消息时(我在 i2c-2 总线上有 4 个从设备,处理器是唯一的主设备), Controller 会出现以下错误:

[ 82.972843] i2c i2c-2: ioctl, cmd=0x703, arg=0x5c
[ 82.972854] i2c i2c-2: ioctl, cmd=0x720, arg=0x7ec06bbc
[ 82.972865] i2c i2c-2: master_xfer[0] R, addr=0x5c, len=1
[ 82.972871] i2c i2c-2: <i2c_imx_xfer>
[ 82.972877] i2c i2c-2: <i2c_imx_start>
[ 82.973053] i2c i2c-2: <i2c_imx_bus_busy>
[ 83.482804] i2c i2c-2: <i2c_imx_bus_busy> I2C bus is busy
[ 83.482810] i2c i2c-2: Trying i2c bus recovery
[ 83.482854] i2c i2c-2: <i2c_imx_start>
[ 83.483029] i2c i2c-2: <i2c_imx_bus_busy>
[ 83.992804] i2c i2c-2: <i2c_imx_bus_busy> I2C bus is busy
[ 83.992816] i2c i2c-2: <i2c_imx_xfer> exit with: error: -110

用示波器查看,我可以看到总线在空闲状态时处于高电平(正如预期的那样)。然而,当我尝试开始传输时,主机在总线上设置启动条件,然后总线保持低电平(SDA 和 SCL),直到传输超时并且驱动程序警告总线正忙并出现超时错误(尽管事实并非如此!)。我知道这不是硬件问题/错误,因为我可以通过 U-Boot(以及较旧的内核版本,例如 4.1.15)设法通过 I2C 进行通信。

我已经检查了I2C内核配置,看起来没问题。此外,I2C 总线 Controller 已在设备树中正确配置。

PD:默认内核配置 (imx_v7_defconfig) 不起作用。

谢谢!

干杯,

丹尼尔

最佳答案

问题已经解决了。我只需将 i2c 引脚配置(在设备树中)从 0x1b8b0 更改为 0x4001b8b1...这仍然很奇怪,因为这些位(掩码 0xFFFE0000)在 iMX.6Q 引用手册中被标记为保留,尽管它们似乎不那么保留...此外,相同的设备树文件在旧内核版本上运行没有问题...

无论如何,它现在正在按预期工作!

关于linux-kernel - Linux I2C通信问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54092447/

相关文章:

c - kfree 函数调用时发生了什么

c - 使用pmap分析进程的内存映射。 [堆栈]

c - 是什么让 SPI 比 I2C 协议(protocol)更快

c - 从不同的 UART 驱动读取数据

linux - netcat 和 videolan

linux - Linux 内核中的 I2C 写确认轮询

linux - 如何将 IOCTL 从 i2c-dev.c 转发到适配器驱动程序 (i2c-rt3352.c)

c - 如何在内核模块中使用 do_mmap()

linux - xfrm_replay_state_esn 字段是什么意思?

database - 在高输入频率应用程序中保留磁盘空间的策略