STM32F103驱动OV7670,无法初始化
SIOC-PA6 SIOD-PA7
XCLK-PA8 VSYNC-PB15
HREF-PC6 PCLK-PC7 reset根据硬件模组使用说明,接了5K左右的电阻到3.3V,PWDN直接接了GND。
参考的别人的程序,初始化几乎没动,但是不能成功,读出7670ID高字节是00。
我使用的晶振是8M,OV7670不带晶振,不带FIFO。XCLK选择的是PLL时钟2分频,36MHZ。在RCC里,PLL时钟是72M。
SCCB总线复位这,根据程序仿真看,应该是复位成功了。SIOC,SIOD电平根据程序有变化。3.27及3.03V。
u8 rdOV7660Reg(u8 regID, u8 *regDat)
{
//通过写操作设置寄存器地址
startSCCB();
if(0==SCCBwriteByte(0x42))
{
stopSCCB();
return(0);
}
DelaySCCB(1000);
if(0==SCCBwriteByte(regID))
{
stopSCCB();
return(0);
}
stopSCCB();
DelaySCCB(1000);
//设置寄存器地址后,才是读
startSCCB();
if(0==SCCBwriteByte(0x43))
{
stopSCCB();
return(0);
}
DelaySCCB(1000);
*regDat=SCCBreadByte();
noAck();
stopSCCB();
return(1);
}
读ID这一段,SCCBreadByte()函数里,
SCCB_SID_IN;/*设置SDA为输入*/
DelaySCCB(1500);
for(j=8;j>0;j--) //循环8次接收数据
{
DelaySCCB(1500);
SCCB_SIC_H();
DelaySCCB(1500);
read=read<<1;
if(SCCB_SID_STATE)
{
read=read+1;
}
SCCB_SIC_L();
DelaySCCB(1500);
}
/*重新配置输出*/
SCCB_SID_OUT;/*设置SDA为输出*/
return(read);
头文件里#define SCCB_SID_STATE GPIOA->IDR&0x80,仿真时候看,IDR07也就是PA7(SIOD)端口位输入从来没变过,导致SCCB_SID_STATE始终是0.用PA7控制小灯,没问题。造成问题无法解决的另一原因是我看了很久的SCCB总线时序,也没看明白。有做过的,了解的,指点下。谢谢。 STM32?OV7670?SCCB
[解决办法]