passjordan 发表于 2010-12-17 09:25:30

求助: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的.
搞了兩天沒搞好.求各位大大幫下....

passjordan 发表于 2010-12-18 08:26:56

頂,,,求助ing...

passjordan 发表于 2010-12-18 15:52:07

继续求助。。。

passjordan 发表于 2010-12-19 23:40:33

兄弟们,,,还是不行,,,
重新按照你们的程序再搞两天还是没东西出来。。。
万能的坛啊。。。HELP一下吧。。。

passjordan 发表于 2010-12-20 16:41:23

Can someone tell me what it happens?
Waiting reply online...

kai102910202 发表于 2010-12-21 15:25:19

回复【4楼】passjordan
-----------------------------------------------------------------------

这样,你先仿真一下,看看究竟卡在哪里,应该不是你所说的TFTWriteStringH(3,0,"Why3",YELLOW,BLACK);里,因为这是LCD的函数,你仔细看看是不是卡在写字节或是读字节的函数里面

passjordan 发表于 2010-12-21 23:24:39

//========== 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

passjordan 发表于 2010-12-21 23:33:45

写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);
}

kai102910202 发表于 2010-12-23 10:25:01

回复【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);
}

passjordan 发表于 2010-12-23 14:01:53

回复【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);
}

kai102910202 发表于 2011-1-3 09:39:15

回复【9楼】passjordan
-----------------------------------------------------------------------

留个方式,QQ联系
691543037

passjordan 发表于 2011-1-5 15:27:24

謝了,樓上...

還有DX出手幫一下么?

tobe1989 发表于 2011-10-24 11:17:40

我现在也卡在那里啦~~LZ你的可以了吗 是什么问题啊??

mdq123 发表于 2012-12-29 14:25:22

我觉得读回来的ASK不是ov7670的ask,是最后一位数据。
页: [1]
查看完整版本: 求助:OV7660初始化的問題.用SCCB的時序,硬件M16+ILI9325的TFT屏