基于I.MX25的GPIO模拟SCCB通信协议(简化的I2C协议)

原文地址:http://www.emsym.com/blog/?p=2147

由于我们使用的OV9650的摄像头使用的是SCCB协议,与I2C协议稍有不同:

        在写入寄存器时可以采用标准的I2C协议;

         而在读取寄存器时,要在标准I2C协议上加一个停止条件。为了给客户提供便利,在我们的开发板上,采用双协议模式,即标准的I2C协议与SCCB协议。

    由于标准的I2C协议不能读取OV9650的寄存器,这里,我们采用GPIO来模拟SCCB协议。

 

  

    首先,先对GPIO有关寄存器进行定义、设置:

                    定义通用的GPIO操作方式,如:CFG_READ(X)、CFG_WRITE(X),为后面写代码或者更换GPIO线提供方面。

    将有关寄存器定义完后,就是时序的模拟了。

  延时:在模拟时序时,延时程序是必不可少的,这里,定义长延时WAIT_STABLE()和短延时WAIT_CYCLE(),作为后面时序中延时的通用标准。

  WAIT_STABLE() 用于变换电平之后的稳定,即避免在上升沿和下降沿进行操作;

 WAIT_CYCLE()  用于时序的周期控制。这里用的是1:1高低电平比例。

  初始化:将两条GPIO线均配置成输出,并且是高电平。

开始信号:在CLK为高电平时,将DAT拉低,即表示数据传输开始。

写入时序:在START后,开始进行写入。在CLK由低到高期间判断要写入的数据电平(data&0x80总是判断第7位(从0开始)是否为1),为1,将DAT置高;为0,置低;

8为数据写完后,再填写一个时序,用来从总线上接受设备的应答信号。 (等待Don't care bit)

读出时序:同样的道理,可以模拟读出协议:这时,注意要将DAT配置成读取方式。

方法:在CLK由高到低电平变化时,判断DAT线上的电平变化,如果为高,则向DATA中写入1,否则写入0,并且左移一位,循环8次后,接受数据完成。

由主机向总线上发出NA信号,即向总线上写入1,表示一次读取完成。

停止信号:时序与标准的I2C停止信号完全相同。

三相写:使用SCCB协议时,常用三相写方式,写入数据,即第一相写入设备地址,第二相写入寄存器地址,第三相写入数据,即三相写。写完后,向总线上发送停止信号。

三相读:同上,首先写入设备地址,其次要读取的寄存器地址,然后是一个停止信号,图中用蓝色标出,这即是上文中的停止条件,而标准的I2C协议中没有这个停止条件,正是这一点区别,使得使用SCCB协议读取数据时,只能进行时序模拟。发送完停止信号后,发送开始信号,然后是读取的设备地址,一般而言写入地址为偶数,而读取地址为写入地址加1。这里,要写入的OV9650设备地址为0×60,而读取地址为0×61.

   以上就是SCCB模拟时序关键的步骤及代码。

 

你可能感兴趣的:(c)