热度 19
2015-6-27 12:17
2725 次阅读|
0 个评论
接上一篇。 这一篇文章介绍测试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 = 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