Linux I2C通信问题

时间:2019-01-08 13:04:15

标签: 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个从设备,处理器是唯一的主设备),控制器出现以下错误:

[ 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总线控制器。

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

谢谢!

干杯

丹尼尔

1 个答案:

答案 0 :(得分:0)

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

无论如何,它现在都可以按预期运行!