DSP

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

2019-07-13 16:31发布

原文地址:http://www.emsym.com/blog/?p=2147 由于我们使用的OV9650的摄像头使用的是SCCB协议,与I2C协议稍有不同:         在写入寄存器时可以采用标准的I2C协议;          而在读取寄存器时,要在标准I2C协议上加一个停止条件。为了给客户提供便利,在我们的开发板上,采用双协议模式,即标准的I2C协议与SCCB协议。     由于标准的I2C协议不能读取OV9650的寄存器,这里,我们采用GPIO来模拟SCCB协议。   1       首先,先对GPIO有关寄存器进行定义、设置:                     定义通用的GPIO操作方式,如:CFG_READ(X)、CFG_WRITE(X),为后面写代码或者更换GPIO线提供方面。     将有关寄存器定义完后,就是时序的模拟了。 1   延时:在模拟时序时,延时程序是必不可少的,这里,定义长延时WAIT_STABLE()和短延时WAIT_CYCLE(),作为后面时序中延时的通用标准。   WAIT_STABLE() 用于变换电平之后的稳定,即避免在上升沿和下降沿进行操作;  WAIT_CYCLE()  用于时序的周期控制。这里用的是1:1高低电平比例。 1   初始化:将两条GPIO线均配置成输出,并且是高电平。 1 开始信号:在CLK为高电平时,将DAT拉低,即表示数据传输开始。 1 写入时序:在START后,开始进行写入。在CLK由低到高期间判断要写入的数据电平(data&0x80总是判断第7位(从0开始)是否为1),为1,将DAT置高;为0,置低; 8为数据写完后,再填写一个时序,用来从总线上接受设备的应答信号。 (等待Don't care bit) 1 读出时序:同样的道理,可以模拟读出协议:这时,注意要将DAT配置成读取方式。 方法:在CLK由高到低电平变化时,判断DAT线上的电平变化,如果为高,则向DATA中写入1,否则写入0,并且左移一位,循环8次后,接受数据完成。 由主机向总线上发出NA信号,即向总线上写入1,表示一次读取完成。 1 停止信号:时序与标准的I2C停止信号完全相同。 1 三相写:使用SCCB协议时,常用三相写方式,写入数据,即第一相写入设备地址,第二相写入寄存器地址,第三相写入数据,即三相写。写完后,向总线上发送停止信号。 1 三相读:同上,首先写入设备地址,其次要读取的寄存器地址,然后是一个停止信号,图中用蓝 {MOD}标出,这即是上文中的停止条件,而标准的I2C协议中没有这个停止条件,正是这一点区别,使得使用SCCB协议读取数据时,只能进行时序模拟。发送完停止信号后,发送开始信号,然后是读取的设备地址,一般而言写入地址为偶数,而读取地址为写入地址加1。这里,要写入的OV9650设备地址为0×60,而读取地址为0×61.    以上就是SCCB模拟时序关键的步骤及代码。