求助:OV7660初始化的問題.用SCCB的時序,硬件M16+ILI9325的TFT屏
前段時間開始搞TFT的屏,用了一段時間就發現初始化好了,后面就跟12864的差不多了,最多改一下寄存器.現在顯示部分跟觸摸屏都搞好了,開始弄攝像頭,發現老是卡在一個地方了,所以上來求助了.
我是參照:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3401782&bbs_page_no=1&search_mode=1&search_text=ov7660&bbs_id=1000
這個貼子做的,就是修改了一下IO口.
//==============================Read ov7660 register==================================
uchar ReadOV7660A(uchar reg, uchar *data)
{
//========== Set register ==========
StartSCCB();
if(0 == SCCBWriteChar(0x42))
{
StopSCCB();
TFTWriteStringH(3,0,"Why1",YELLOW,BLACK);
return 0;
}
NOACK();
//DelaySCCB();
if(0 == SCCBWriteChar(reg))
{
StopSCCB();
TFTWriteStringH(3,0,"Why2",YELLOW,BLACK);
return 0;
}
StopSCCB();
NOACK();
//DelaySCCB();
//========== Read from register ==========
StartSCCB();
if(0 == SCCBWriteChar(0x43))
{
StopSCCB();
TFTWriteStringH(3,0,"Why3",YELLOW,BLACK);
return 0;
}
DelaySCCB();
*data = SCCBReadChar();
NOACK();
StopSCCB();
return 1;
}
就是卡在TFTWriteStringH(3,0,"Why3",YELLOW,BLACK);這里.
這段函數是在OV7660初始化調用的.
//==============================OV7660 initialize=====================================
uchar OV7660Init(void)
{
uchar temp = 0x80,i;
uchar msb = 0,lsb = 0;
InitSCCB();
if(WriteOV7660(0x12,temp) == 0) //Reset SCCB
{
return 0;
}
_delay_ms(250);
ReadOV7660A(0x0a,&msb);
if(msb != 0x76) //Why not msb = 0x76
{
TFTWriteStringH(3,1,"MSB is incorrect",YELLOW,BLACK);
return 0;
}
ReadOV7660A(0x0b,&lsb);
if(lsb != 0x60) //Why not lsb = 0x60
{
TFTWriteStringH(3,2,"LSB is incorrect",YELLOW,BLACK);
return 0;
}
for(i=0;i<14;i ++)
{
if(WriteOV7660(change_reg,change_reg) == 0)
{
return 0;
}
}
TFTWriteStringH(3,3,"Config now......",YELLOW,BLACK);
OV7660Config(272,16,320,240); //Set 320 * 240
_delay_ms(250);
_delay_ms(250);
TFTWriteChar(3,4,"OV7660 Initial OK!",YELLOW,BLACK);
return 0x01;
}
發現初始化里面的msb和lsb老是不對,然后對了接線沒發現問題,msb和lsb每次都不一樣,原來沒讀到ov7660的.
搞了兩天沒搞好.求各位大大幫下.... 頂,,,求助ing... 继续求助。。。 兄弟们,,,还是不行,,,
重新按照你们的程序再搞两天还是没东西出来。。。
万能的坛啊。。。HELP一下吧。。。 Can someone tell me what it happens?
Waiting reply online... 回复【4楼】passjordan
-----------------------------------------------------------------------
这样,你先仿真一下,看看究竟卡在哪里,应该不是你所说的TFTWriteStringH(3,0,"Why3",YELLOW,BLACK);里,因为这是LCD的函数,你仔细看看是不是卡在写字节或是读字节的函数里面 //========== Read from register ==========
StartSCCB();
if(0 == SCCBWriteChar(0x43))
{
StopSCCB();
TFTWriteStringH(3,0,"Why3",YELLOW,BLACK);
return 0;
}
DelaySCCB();
*data = SCCBReadChar();
NOACK();
StopSCCB();
return 1;
}
谢谢楼上回答。。。
我知道不是TFTWriteStringH(3,0,"Why3",YELLOW,BLACK); 这里。。。
我这里是标记他出错在这里。。。
就是说“if(0 == SCCBWriteChar(0x43)) ”这个条件不符合了。。。
就是写到OV7660的0X43这个寄存器不行,,,
所以我读了好多次OV7660的ID(寄存器0X0A,0X0B)都不是0X76,0X60。。。
所以求助大家是不是那里错了???
SCCB的时序我都是一模一样按你们的例子写的。。。
THANKS 写SCCB的程序如下。。。
应该没问题啊。。。
就是不知道为什么写0X43不行,,,
//==============================Write a char to SCCB==================================
uchar SCCBWriteChar(uchar data)
{
uchar i,temp;
for(i=0;i<8;i ++)
{
if((data << i) & 0x80)
{
SIO_D_1;
}
else
{
SIO_D_0;
}
DelaySCCB();
SIO_C_1;
DelaySCCB();
SIO_C_0;
DelaySCCB();
}
DelaySCCB();
SIO_D_IN;
DelaySCCB();
SIO_C_1;
DelaySCCB();
DelaySCCB();
DelaySCCB();
if(SIO_D_State)
{
temp = 0;
}
else
{
temp = 1;
}
SIO_C_0;
DelaySCCB();
SIO_D_OUT;
return (temp);
} 回复【7楼】passjordan
-----------------------------------------------------------------------
这些都是没有问题的,你试一试把SCCB的管脚都设置成上拉,这样初始化就应该通过了
void InitSCCB(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin =(1<<SCCB_SIO_C) | (1<<SCCB_SIO_D);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIOA->BSRR =((1<<SCCB_SIO_D) | (1<<SCCB_SIO_C));
}
void SCCB_SID_GPIO_INPUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = 1<<SCCB_SIO_D;//GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
} 回复【8楼】kai102910202
-----------------------------------------------------------------------
This is my code of SCCB initialize as below.
And I followed your suggestion that pull up the IO of SIO_C & SIO_D.
But it doesn't work.
However, thak you all the same.
//==============================SCCB initialize=======================================
void InitSCCB(void)
{
SCCB_DDR |= (1 << SIO_D) | (1 << SIO_C);
SCCB_PORT |= (1 << SIO_D) | (1 << SIO_C);
} 回复【9楼】passjordan
-----------------------------------------------------------------------
留个方式,QQ联系
691543037 謝了,樓上...
還有DX出手幫一下么? 我现在也卡在那里啦~~LZ你的可以了吗 是什么问题啊?? 我觉得读回来的ASK不是ov7670的ask,是最后一位数据。
页:
[1]