前言
最近在进行一个STM32和OV2640摄像头的项目,在项目最刚开始读取设备ID的初始阶段,读出来的ID始终是0x00,这个问题困扰了我3天,经过不懈努力,终于读出正确的ID号:0x26,在此记录以下我的调试历程。
硬件资源
极客STM32F429IGTB6开发版一块,该模块可以通过usb 5v供电,也可以通过3.3V直接供电,问题其实就出在这里,后面会详细解释,极客OV2640扩展版一块。ov2640通过杜邦线从开发板上供电,开发板通过ST-Link3.3V供电。
bug现象
STM32与OV2640是通过I2C协议进行通信的,最刚开始用的是STM32的硬件IIC去配置和读取OV2640寄存器信息。但是在写命令时,始终卡在EV6也就是这一句上while(!I2C_CheckEvent(CAMERA_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
,后来改为软件模拟IIC,不管主机发送什么,从机都应答0,正常情况下,如果没有这个地址,主机寻址,从机是不会应答的。
解决过程
再三确认我的软件模拟IIC过程是没有问题的,因此问题可能出在OV2640硬件扩展板上,一是扩展版电路问题,二是OV2640本身就坏了,先换了一个OV2640,发现不管用,那扩展版电路问题比较大。
于是查看扩展版电路,这是我的OV2640扩展版电路图
这个电路很简单,3.3V经过两个降压电路降到2.8V,和1.5V给OV2640供电,再就是一个晶振电路了。最初怀疑晶振坏了或者虚焊等,用电压表的蜂鸣档去量四个角,至少连接是正常的,没有虚焊,电压也正常。
在量电压过程中,突然发现,本应该供电3.3V,这时候只有3.0v左右,突发奇想是不是电压太低了供电不行,于是量了4引脚和10引脚,分别是2.6V,1.1-1.2V,再查OV2640的数据手册找到了如下的电路要求
10号引脚最低电压是1.24,这里的供电电压只有1.1不到1.2,有没有可能是这里电压太低了,导致芯片无法正常启动!
果断换到USB口5V供电,再次读取ID
已经能正确读出0x26的设备ID了!!,也就是说,问题出在供电电压上。
另外改换成硬件IIC去通信,发现还是卡在EV6那里,这里也证实了STM32 硬件IIC确实有BUG,还是用软件模拟更靠谱一点。