搜索
bottom↓
回复: 14

求助:OV7660初始化的問題.用SCCB的時序,硬件M16+ILI9325的TFT屏

[复制链接]

出0入0汤圆

发表于 2010-12-17 09:25:30 | 显示全部楼层 |阅读模式
前段時間開始搞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[0],change_reg[1]) == 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的.
搞了兩天沒搞好.求各位大大幫下....

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2010-12-18 08:26:56 | 显示全部楼层
頂,,,求助ing...

出0入0汤圆

 楼主| 发表于 2010-12-18 15:52:07 | 显示全部楼层
继续求助。。。

出0入0汤圆

 楼主| 发表于 2010-12-19 23:40:33 | 显示全部楼层
兄弟们,,,还是不行,,,
重新按照你们的程序再搞两天还是没东西出来。。。
万能的坛啊。。。HELP一下吧。。。

出0入0汤圆

 楼主| 发表于 2010-12-20 16:41:23 | 显示全部楼层
Can someone tell me what it happens?
Waiting reply online...

出0入0汤圆

发表于 2010-12-21 15:25:19 | 显示全部楼层
回复【4楼】passjordan
-----------------------------------------------------------------------

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

出0入0汤圆

 楼主| 发表于 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

出0入0汤圆

 楼主| 发表于 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);
}

出0入0汤圆

发表于 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);
}

出0入0汤圆

 楼主| 发表于 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);
}

出0入0汤圆

发表于 2011-1-3 09:39:15 | 显示全部楼层
回复【9楼】passjordan
-----------------------------------------------------------------------

留个方式,QQ联系
691543037

出0入0汤圆

 楼主| 发表于 2011-1-5 15:27:24 | 显示全部楼层
謝了,樓上...

還有DX出手幫一下么?

出0入0汤圆

发表于 2011-10-24 11:17:40 | 显示全部楼层
我现在也卡在那里啦~~  LZ你的可以了吗 是什么问题啊??

出0入0汤圆

发表于 2012-12-29 14:25:22 | 显示全部楼层
我觉得读回来的ASK不是ov7670的ask,是最后一位数据。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 06:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表