打印
[51单片机]

TI的CC2530驱动OV7670成功

[复制链接]
4639|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 myl593799546 于 2014-7-2 09:19 编辑



如图,图像分成好几块,都不完整,拍的是天花板。

带FIFO的OV7670,单片机CC2530;
串口上传到上位机显示的,已经做了灰度图处理,去掉了UV数据,只取Y数据,也就是灰度图


连接图如下





求助大家帮忙分析下原因!!!!感激不尽

最后问题自己解决了,特此分享一下,希望对大家有用,另外,我吐槽下,本论坛人气有点低下啊,发帖询问都没人搭理的。

以下直接调试RGB成功,器件弄错了RGB的输出顺序,浪费了好长时间。处理部分代码如下,其他SCCB部分我就不上代码了,就是个IIC协议而已。

寄存器设置,网上现成别人调试OK的你拿来就行,调试OK了再去分析寄存器设置,不然100多的寄存器真会搞疯人的。

    if(VsyncCnt == 2)//一幅图像已经送入FIFO
    {
      HAL_DISABLE_INTERRUPTS();    //1.此时,关闭场中断
      FIFO_WEN_L;                  //2.拉低WEN电平,防止摄像头数据再次写入FIFO
      FIFO_PREPARE;                //  FIFO准备(重复两个读时钟)
      FIFO_OE_L;                   //  使能FIFO输出

      for(iw = 0; iw < 240; iw ++) //3.然后开始读数据
      {
        for(ik = 0; ik < 320; ik ++)
        {
          //开始是按照高位在前读取,图像颜色偏差,后来改了好多寄存器不凑效才想到改成地位在前
          READ_FIFO_PIXEL(Camera_Data);

          UART_Transmit_16(Camera_Data);
        }
      }
    }

相关帖子

沙发
myl593799546|  楼主 | 2014-5-21 14:59 | 只看该作者
寄存器设置程序如下:
只列出部分寄存器设置,其他寄存器均为网上摘录的,也就不列出来了
  //配置为YUV格式关键寄存器配置
  Write_OV7670_REG(0x67, 0xaa);        //固定U值 寄存器TSLB[4]=1时有效
  Write_OV7670_REG(0x68, 0x55);        //固定V值 寄存器TSLB[4]=1时有效
  Write_OV7670_REG(0x3a, 0x14);        //0x14 YUV输出顺序(由TSLB[3](0x3A)和寄存器COM13[0](0x3D)一起决定)
   
  Write_OV7670_REG(0x40, 0xC0);        //输出范围:[00]到[FF],这个寄存器必须设置
  Write_OV7670_REG(0x12, 0x10);        //QVGA YUV
  
  //分辨率配置
  Write_OV7670_REG(0x32, 0x80); //HREF   HREF控制 位[7:6]:HREF沿距数据输出的偏移/位[5:3]:HREF结束的低3位(高8位在HSTOP)
  Write_OV7670_REG(0x17, 0x16); //HSTART 输出格式-行频开始高八位(低三位在HREF[2:0])
  Write_OV7670_REG(0x18, 0x04); //HSTOP  输出格式-行频结束高八位(低三位在HREF[5:3])
  Write_OV7670_REG(0x19, 0x02); //VSTRT  输出格式-场频开始高八位(低二位在VREF[1:0])
  Write_OV7670_REG(0x1a, 0x7b); //VSTOP  输出格式-场频结束高八位(低二位在VREF[3:2])
  Write_OV7670_REG(0x03, 0x06); //VREF   帧竖直方向控制 位[3:2]VREF 结束的低两位(高八位见VSTOP[7:0]/位[1:0]VREF 开始的低两位(高八位见VSTOP[7:0]

读取图像数据程序如下:
用的是中断法读取,VSYNC接在中断口,触发中断后INT4即变成1
    if (INT4)//(~VSYNC & HREF)//用中断也可以,主要就是要检测到VSYNC的电平信号,VSYNC和HREF/HSYNC其实可以接到同个IO口
    {
      INT4 = 0;
      Vsync_Flag++;   
      if (Vsync_Flag == 1)         //Vsync_Flag=1:VSYNC第一次到来,先复位一下写指针,目前正在往FIFO里面写数据
      {
        FIFO_WRST = 1;
        FIFO_WRST = 0;             //复位写指针
        MicroWait(100);
        FIFO_WRST = 1;
        FIFO_WR = 1;               //允许写入FIFO
      }
      
      if (Vsync_Flag == 2)         //Vsync_Flag=2:VSYNC第二次到来,表明一帧数据存储完毕,此时我们设置WREN为0,禁止再往FIFO写入数据
      {
        HAL_DISABLE_INTERRUPTS();  //禁止中断,准备读取数据

        FIFO_WR = 0;               //禁止写入FIFO
        FIFO_RRST = 0;             //复位读指针
      
        FIFO_RCK = 0;              //at least one RCK clock is needed to make sure
        asm("NOP");
        FIFO_RCK = 1;
        asm("NOP");
        FIFO_RCK = 0;
        asm("NOP");
        FIFO_RCK = 1;
        asm("NOP");
      
        FIFO_RRST = 1;
        
        FIFO_OE=0;                   //允许FIFO输出
        
        //HAL_Send_Uart0(&fcs,1);//UartSend(&fcs,1);          //串口工具发送行起始标志位
        //asm("NOP");
        for (ik = 0;ik ++ < 320;)//数据量320*240*2 QVGA format,240 lines;320dots every line,153600  8bit data
        {
          for (iw = 0;iw ++ < 240;)
          {
          FIFO_RCK = 0;
          asm("NOP");
          FIFO_RCK = 1;
          asm("NOP");
          CAM_DH = (0x00ff & DOUT);
         
          FIFO_RCK = 0;
          asm("NOP");
          FIFO_RCK = 1;
          asm("NOP");
          CAM_DL = (0x00ff & DOUT);
         
          HAL_Send_Uart0(&CAM_DH,1);//UartSend(&CAM_DH,1);//高位为Y数据
//          UartSend(&CAM_DL,1);//低位为U或V,不输出即人为去除
          }
        }
        FIFO_OE = 1;                    //禁止FIFO输出
        FIFO_WR = 0;
        Vsync_Flag = 0;             //设置为0,则开启下一轮FIFO数据存储
        //HAL_ENABLE_INTERRUPTS();
      }
    }

使用特权

评论回复
板凳
myl593799546|  楼主 | 2014-5-22 09:20 | 只看该作者
自己顶!!!!

使用特权

评论回复
地板
myl593799546|  楼主 | 2014-5-22 14:05 | 只看该作者
顶贴,这论坛怎么都没人回答问题了呢,纠结啊

使用特权

评论回复
5
myl593799546|  楼主 | 2014-5-23 17:41 | 只看该作者
自己顶贴!!!!!!

使用特权

评论回复
6
myl593799546|  楼主 | 2014-5-26 17:04 | 只看该作者
自己顶贴!!!!!!

使用特权

评论回复
7
myl593799546|  楼主 | 2014-5-27 09:20 | 只看该作者
自己顶贴!!!!!!

使用特权

评论回复
8
Solemnysw| | 2014-6-26 10:15 | 只看该作者
请问你一下啊,菜鸟刚学习,你这个摄像头接了哪些管脚啊???

特别想问的是,VSYNC和HERF都需要接么?我用DSP读取图像,用CCS软件调试,需要用到SIO_C和SIO_D吗?

VSYNC是自动输出高低电平信号吗?

谢谢回答

使用特权

评论回复
9
myl593799546|  楼主 | 2014-6-27 09:16 | 只看该作者
Solemnysw 发表于 2014-6-26 10:15
请问你一下啊,菜鸟刚学习,你这个摄像头接了哪些管脚啊???

特别想问的是,VSYNC和HERF都需要接么?我 ...

那两个相当于IIC,当然要接啊

使用特权

评论回复
10
Solemnysw| | 2014-6-27 22:57 | 只看该作者
// 一条串行数据线(SDA)和一条串行时钟线(SCL)
// GPIO6--SIO_C, GPIO7--SIO_D
//        GPIO_RSET(IODIR,0xFF);          //  GPIO0-GPIO7 输出 写操作
//        GPIO_pinWrite(GPIO_PIN7,1);            //  GPIO7--SIO_D
//        GPIO_pinWrite(GPIO_PIN6,1);            //  GPIO6--SIO_C

void InitIIC(void)
{
        GPIO_RSET(IODIR,0xFF);          //  GPIO0-GPIO7 输出 写操作
        GPIO_pinWrite(GPIO_PIN6,0);            //  GPIO6--SIO_C--scl=0
        GPIO_pinWrite(GPIO_PIN7,0);            //  GPIO7--SIO_D--sda=0
}

你看看我的这个初始化设置,可以吗???

但是运行出来的图像,
                                // 读取摄像头FIFO数据
                                for(j=0; j<9600; j++)     // VIDEOHEIGHT
                                {
                                        for(i=0; i<8; i++)   // VIDEOWIDTH
                                        {
                                                GPIO_pinWrite(AGPIO_PIN11,0);     //FIFO_RCK  = 0;  A11
                                                GPIO_pinWrite(AGPIO_PIN11,1);     //FIFO_RCK  = 1;  A11
                                                data = (GPIO_RGET(AGPIODATA)&0x00FF);
                                                y[j*VIDEOWIDTH+i]=data;                       
                                        }
                                }


SOI_C我接的是IO6口,SOI_D我接的是IO6口,能写能读的,移植51单片机,并对照着STM32,怎么采集图像还是不得行呢?
HREF和STROBE,我腾空了,没接线
能解释一下么?


QQ图片20140627225606.jpg (66.05 KB )

采集的 图像

采集的 图像

使用特权

评论回复
11
Solemnysw| | 2014-6-27 22:58 | 只看该作者
SOI_C我接的是GPIO6口,SOI_D我接的是GPIO7口,

使用特权

评论回复
12
hjh2008303| | 2014-6-28 00:37 | 只看该作者
读数据或者传输到pc的时候把像素坐标弄乱了吧

使用特权

评论回复
13
Solemnysw| | 2014-6-28 10:52 | 只看该作者
hjh2008303 发表于 2014-6-28 00:37
读数据或者传输到pc的时候把像素坐标弄乱了吧

#define SDA_IN0()                {P0MDOUT= 0X00;}
#define SDA_OUT0()                {P0MDOUT= 0XFF;}


sbit I2C_SCL0=P0^2;
sbit I2C_SDA0=P0^1;
sbit SDA_STATE0=P0^1;


void InitI2C0(void)
{
        P0MDIN |= 0X06;
        P0MDOUT|= 0X06;
}

以上是51的源程序,I2C的初始化程序,而我的程序直接是SDA=0,SCL=0,可行吗?

像素坐标弄乱了?何解?

我用y数组保存的啊,然后自动显示的时候,能切换数据维数的啊,9600*8 = 240*320啊



使用特权

评论回复
14
myl593799546|  楼主 | 2014-7-2 09:11 | 只看该作者
Solemnysw 发表于 2014-6-27 22:57
// 一条串行数据线(SDA)和一条串行时钟线(SCL)
// GPIO6--SIO_C, GPIO7--SIO_D
//        GPIO_RSET(IODIR,0xFF);  ...

HREF可以不接,但是VSYNC一定得接,另外注意你的RGB的顺序,我已经调试OK了,也是51单片机

使用特权

评论回复
15
sdgor| | 2015-10-21 12:23 | 只看该作者
我也在用cc2530驱动ov7670,估计是iic协议问题导致花屏。楼主可以发一份程序给我吗?谢谢。tmpboxprt@163.com

使用特权

评论回复
16
15289453240| | 2015-11-7 14:25 | 只看该作者
楼主能不能把你的代码发给小弟,谢谢1448400326@qq.com

使用特权

评论回复
17
好are哟| | 2016-1-2 11:14 | 只看该作者
楼主能不能把程序发给我,谢谢  1172120251

使用特权

评论回复
18
shopxyy| | 2016-1-26 13:53 | 只看该作者
你好楼主,请问可不可以分享下程序文件,以及OV7670和CC2530的接线图,万分感谢。QQ380541505

使用特权

评论回复
19
海不盗的天空| | 2016-5-9 17:33 | 只看该作者
楼主你好,可以把你的上位机发给我吗,最近在做毕业设计,万分感谢    1124685756@qq.com

使用特权

评论回复
20
emmmmm| | 2020-5-9 19:37 | 只看该作者
你好,楼主,看了你的关于cc2530与OV7670的帖子,发现了一个comtransferpic串口可以接RGB565的软件,找了好久,可以发下给我吗?我的邮箱是983833702@qq.com

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

256

帖子

4

粉丝