如图,花屏了,并且读取寄存器id不正确,估计是i2c有问题,但是i2c的程序是借鉴的例程应该没问题啊
附i2c程序:
void startSCCB(void)
{
SIOD_on;
delay(dtime);
SIOC_on;
delay(dtime);
SIOD_off;
delay(dtime);
SIOC_off;
delay(dtime);
}
void stopSCCB(void)
{
SIOD_off;
delay(dtime);
SIOC_on;
delay(dtime);
SIOD_on;
delay(dtime);
}
void noAck(void)
{
SIOD_on;
delay(dtime);
SIOC_on;
delay(dtime);
SIOC_off;
delay(dtime);
SIOD_off;
delay(dtime);
}
unsigned char SCCBwriteByte(unsigned char m_data)
{
unsigned char j,tem;
for(j=0;j<8;j++)
{
if(m_data&0x80)
{
SIOD_on;
}
else
{
SIOD_off;
}
m_data=m_data<<1;
delay(dtime);
SIOC_on;
delay(dtime);
SIOC_off;
delay(dtime);
}
SIOD_on;
delay(dtime);
SIOD_in
delay(dtime);
SIOC_on;
delay(dtime);
if(SIOD_get){tem=0;}
else {tem=1;}
SIOC_off;
delay(dtime);
SIOD_out
return (tem);
}
unsigned char SCCBreadByte(void)
{
unsigned char read,j;
read=0x00;
SIOD_in
delay(dtime);
for(j=8;j>0;j--)
{
delay(dtime);
SIOC_on;
delay(dtime);
read=read<<1;
if(SIOD_get)
{
read=read+1;
}
SIOC_off;
delay(dtime);
}
SIOD_out
return(read);
}
unsigned char wrOV7670Reg(unsigned char regID, unsigned char regDat)
{
startSCCB();
if(SCCBwriteByte(0x42)==0)
{
stopSCCB();
return(0);
}
delay(dtime);
if(SCCBwriteByte(regID)==0)
{
stopSCCB();
return(0);
}
delay(dtime);
if(SCCBwriteByte(regDat)==0)
{
stopSCCB();
return(0);
}
stopSCCB();
return(1);
}
unsigned char rdOV7670Reg(unsigned char regID, unsigned char *regDat)
{
startSCCB();
if(SCCBwriteByte(0x42)==0)
{
stopSCCB();
return(0);
}
delay(dtime);
if(SCCBwriteByte(regID)==0)
{
stopSCCB();
return(0);
}
stopSCCB();
delay(dtime);
startSCCB();
if(SCCBwriteByte(0x43)==0)
{
stopSCCB();
return(0);
}
delay(dtime);
*regDat=SCCBreadByte();
noAck();
stopSCCB();
return(1);
}
|