I2c不通


[DESCRIPTION]

在camera porting的过程中,有很多原因会导致Camera I2C不通


此篇FAQ的目的是为camera i2c没通的情况,提供一个大概的思路


 


[SOLUTION]


I2C不通,有两种原因,一种是device端(也就是我们的camera sensor)本身就没有回ACK,另一中就是在master端(也就是我们的baseband端),如果我们的,master端就本身异常。那么I2C不通就不足为奇了


 


我们可以从kernel log里面搜索I2C的关键字,无非是“I2C_TIMEOUT”和“I2C_ACKERR”。。


如果您搜索到了I2C_ACKERR,那么问题多半在slave端,您需要检查您的上电时需是否符合sensor spec的规范,和模组厂的工程师或者sensor厂的工程师一起修改sensor的上电时需,


如果您搜索到的是I2C_TIMEOUT,那么问题多半在master端,您可以参考FAQ07666


P.S I2C_TIMEOUT的原因有多种,


[SOLUTION]


 从上图所示,在开机过程中因为I2C_TIMEOUT,就浪费了4s多的时间


 至于是代码的那个地方造成的I2C_TIMEOUT,我们得根据具体问题具体分析,


 但是,我们只需要把握一点,就是出现I2C_TIMEOUT的rootcause来推测这个问题,我们的问题就迎刃而解


在I2C bus上没有电的情况下去操作I2C,就会出现timeout


Camera Power On --> Write/Read I2C ---> Camera Power Off


  在下面的follow下,就会有I2C timeout: Camera Power Off --> Write/Read I2C


 我们根据上述条件,通过代码和log去跟踪camera  power on/off和write/read I2C的follow,找出异常点,那么这个问题就迎刃而解


 


P.S I2C timeraout的root cause有很多,但是在I2C bus上没有电的情况下去操作I2C是最常见的,如果您遇见了I2C_TIMEOUT,而当时I2C_BUS上是有电的,那么就请您提交e_service来和mtk一起来分析这个问题吧。




一、DM642的I2C接口及I2C协议简单介绍

     TMS320DM642片上带有一个I2C接口SDA(D3)和SCL(E4),DM642通过I2C接口与外部I2C外设通信,如I2C EEPROM、I2C视频解/编码器等。I2C通信的数据传输率一般包括100k和400k两种,支持多机通信,但同一时刻只允许存在一个主控设备,被控设备均使用唯一的地址标识符,I2C通信具有完备的通信协议,发送START起始位启动通信,获得总线控制权,发送STOP位结束通信,释放总线控制权。


     发送START位后再发送被控设备的地址,其中高7位为地址码,第0位为读/写控制标志RW,RW=0表示向被控设备写数据,RW=1表示从被控设备读数据。


     I2C协议的读写操作可以概括如下步骤:


     写操作:


     1.当主控设备检测到I2C总线处于空闲状态时,首先发送S位获得I2C总线控制权;


     2.发送寻址字节(7位地址位+1位读写控制位0);


     3.主控设备等待被控设备发送应答位(ACK);


     4.主控设备接收到ACK位后开始发送第1个数据字节;


     5.主控设备等待被控设备发送的应答位,如果应答位是ACK,则继续发送数据,如果应答位是NACK,停止发送数据;


     6.主控设备发送完全部数据后,发送一个STOP停止位,接收I2C通信释放总线控制权。


     读操作:


     1.主控设备检测到I2C总线空闲时,发送S起始位;


     2.发送地址字节(7位地址位+1位读写控制位1);


     3.被寻址的设备发送应答信号ACK;


     4.主控设备接收到ACK后释放数据总线,开始接收第1个数据字节;


     5.主控设备接收到数据后,发送ACK应答信号表示继续传送数据,发送NACK信号表示传送数据结束;


     6.主控设备接收完全部数据后,发送一个STOP停止位,接收I2C通信。


     二、分析视频解码芯片TVP5150A和视频编码芯片SAA7121H的设备地址


     1.TVP5150A的设备地址由I2CSEL引脚所接的上拉电阻或下拉电阻确定,I2CSEL引脚的状态与设备地址的映射关系如下:


     引脚状态                            写操作                                 读操作


        0                                       0xB8                                     0xB9


        1                                       0xBA                                     0xBB


     2.SAA7121H的设备地址由SA引脚确定,该引脚为低电平时,设备地址为0x88,该引脚为高电平时,设备地址为0x8C。


     由TVP5150A和SAA7121H设备地址可以知道,当I2CSEL或SA引脚电平确定时,设备的地址是唯一确定的!SAA7121H比较好理解唯一确定的含义,对于TVP5150A来说,若I2CSEL=1,则该设备地址可以理解为0x1011101(7位寻址模式),而写操作时最后加一位bit0=0即0x10111010=0xBA,读操作时bit0=1即0x10111011=0xBB,这就好理解为什么写操作和读操作时设备地址看起来不同了。同理,因为SAA7121H芯片,对于主机DM642来说,只有写操作,所以设备地址的最后一位bit0始终为0(8=1000和C=1100),这也是符合I2C写操作协议规定的。


     三、分析开发板对应例程代码中,表示I2C设备地址时右移一位的情况(如,addrI2C=0xBA>>1)之原因


     

在阅读开发板例程代码时,之前一直有个疑问,为什么表示I2C设备地址时一定要右移一位?可以不右移这一位吗?


     查阅TMS320C6000 DSP Inter-Integrated Circuit(I2C)Module Reference Guide,8.9中有介绍I2C模式寄存器I2CMDR,第8字段扩展地址使能位,当XA=0时为7位寻址模式且地址由I2CSAR的低7位确定,当XA=1时为10位寻址模式这时地址由I2CSAR的低10位确定。默认情况下,XA=0,所以代码中addI2C=0xBA>>1右移一位是必须的,不然不能正常寻址从设备。