接上一篇。
这一篇文章介绍测试AN75779的I2C通信功能,读回摄像头MT9M001的ID。
AN75779提供了95%的源程序,仅是没有包括与摄像头相关的初始代码,但提供了I2C读写的函数,分别是一字节读写和二字节读写。打开文件sensor.c,可以找到4个函数,分别是:
1、CyU3PReturnStatus_t SensorWrite2B(uint8_t slaveAddr, uint8_t highAddr,
uint8_t lowAddr, uint8_t highData, uint8_t lowData)
2、CyU3PReturnStatus_t SensorWrite(uint8_t slaveAddr, uint8_t highAddr,
uint8_t lowAddr, uint8_t count, uint8_t *buf)
3、CyU3PReturnStatus_t SensorRead2B(uint8_t slaveAddr, uint8_t highAddr,
uint8_t lowAddr, uint8_t *buf)
4、CyU3PReturnStatus_t SensorRead(uint8_t slaveAddr, uint8_t highAddr,
uint8_t lowAddr, uint8_t count, uint8_t *buf)
这4个函数,都提供了源代码,用户可以仔细看一下。既然有现成的函数,我们直接用就好了。还有就是最基本的I2C读写函数,官方也提供了API函数,分别是CyU3PI2cReceiveBytes()和CyU3PI2cTransmitBytes(),分别对应一收一发。
I2C读写函数有了,我们再查一下摄像头MT9M001的地址,ID对应的寄存器地址及正确的ID值是多少。仔细查阅MT9M001的数据手册,可以找到器件地址是0xBA,ID对应的寄存器地址是0x00,正确的ID值应该是0x8431,如下图所示:
注意到寄存器地址是一字节的,值是是二字节的。这与前面的4个I2C读写函数都不太相同。前面的4个读写函数,寄存器的地址都是双字节的,看来需要我们修改这几个函数。先统一一下函数名称,前面4个I2C读写函数,结合MT9M001的特点,可以只使用2个,函数名称统一为:SensorWrite1A2B(参数),SensorRead1A2B(参数)。其中的1A代表地址是1字节的,2B代表寄存器的值是2个字节的。以函数SensorWrite1A2B()为例,修改成如下:
CyU3PReturnStatus_t SensorWrite1A2B(uint8_t slaveAddr, uint8_t OneAddr,uint16_t RegisterValue)
其中第一个参数为MT9M001的器件地址,第二个参数是寄存器的地址,是8位的一个字节,第三个参数是要写入寄存器的值,是16位的两个字节。接下来验证这个函数的正确性,按MT9M001数据手册里提供的验证,手册中的如下:
实现以上功能的函数就是:glDebugRspBuffer[0] = SensorWrite1A2B (SENSOR_ADDR_WR, 0x09, 0x0284);
按照之前测试摄像头复位的方法,将SensorWrite1A2B()插入到SensorReset()后,输入的指令也一样。采集后的I2C波形如下:
上图用红线分隔成4部分,每一部分为一字节,左数第一部分为MT9M001的器件地址,十进制为186,16进制为0xBA,第二部分为寄存器地址,16进制为0x09,第三部分为寄存器值的高位,十进制的02,16进制也为0x02,第四部分是寄存器值的低为,16进制的0x84。可以看到,和数据手册描述的一样,成功验证了I2C的写操作。
未完待续,,,,。
(另公布一群号178338109,CYUSB3014开发专业讨论区)
淘宝店铺:http://liangziusb.taobao.com
良子.2015年 承接USB开发工程
QQ:2687652834
文章评论(0条评论)
登录后参与讨论