背景:zynq7020 按照1KHz i2c 读取iam20680的数据。
异常结果:
cdns-i2c e0004000.i2c: timeout waiting on completion
Unable to handle kernel paging request at virtual address 6e1247a0
pgd = c7cb0000[6e1247a0] *pgd=00000000
Internal error: Oops - BUG: 80000005 [#1] PREEMPT SMP ARM
Modules linked in: dma_proxy(O)
解决方案:
1 . 将i2c重复读取次数及超时时间加大
ret=ioctl(fd_i2c0, I2C_TIMEOUT, 5); // 设置超时
ioctl(fd_i2c0, I2C_RETRIES, 5); // 设置重试次数
2 . 此时还是会出现崩溃的现象,则需要查看硬件电路,IIC总线上的上拉电阻是否合适,如果时钟低于10KHz,则总线上的上拉电阻最大为10K;如果低于400KHz的,则上拉电阻为4.7KHz , 400KHz以上的为2.2K; 该值只是建议值,有具体的计算公式。总线的上拉电阻与信号线(SCL,SDA)的寄生电容,组成了RC电路,对于高频的时钟数据变化,如果RC 值过大造成高电平识别异常,导致无法正确识别高电平,故超时。
将上拉电阻更换为2K后,再次运行系统,则正常了。