myl593799546 发表于 2014-5-21 14:55

TI的CC2530驱动OV7670成功

本帖最后由 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=1时有效
Write_OV7670_REG(0x68, 0x55);      //固定V值 寄存器TSLB=1时有效
Write_OV7670_REG(0x3a, 0x14);      //0x14 YUV输出顺序(由TSLB(0x3A)和寄存器COM13(0x3D)一起决定)
   
Write_OV7670_REG(0x40, 0xC0);      //输出范围:到,这个寄存器必须设置
Write_OV7670_REG(0x12, 0x10);      //QVGA YUV

//分辨率配置
Write_OV7670_REG(0x32, 0x80); //HREF   HREF控制 位:HREF沿距数据输出的偏移/位:HREF结束的低3位(高8位在HSTOP)
Write_OV7670_REG(0x17, 0x16); //HSTART 输出格式-行频开始高八位(低三位在HREF)
Write_OV7670_REG(0x18, 0x04); //HSTOP输出格式-行频结束高八位(低三位在HREF)
Write_OV7670_REG(0x19, 0x02); //VSTRT输出格式-场频开始高八位(低二位在VREF)
Write_OV7670_REG(0x1a, 0x7b); //VSTOP输出格式-场频结束高八位(低二位在VREF)
Write_OV7670_REG(0x03, 0x06); //VREF   帧竖直方向控制 位VREF 结束的低两位(高八位见VSTOP/位VREF 开始的低两位(高八位见VSTOP

读取图像数据程序如下:
用的是中断法读取,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,1536008bit 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

顶贴,这论坛怎么都没人回答问题了呢,纠结啊

myl593799546 发表于 2014-5-23 17:41

自己顶贴!!!!!!

myl593799546 发表于 2014-5-26 17:04

自己顶贴!!!!!!

myl593799546 发表于 2014-5-27 09:20

自己顶贴!!!!!!

Solemnysw 发表于 2014-6-26 10:15

请问你一下啊,菜鸟刚学习,你这个摄像头接了哪些管脚啊???

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

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

谢谢回答

myl593799546 发表于 2014-6-27 09:16

Solemnysw 发表于 2014-6-26 10:15 static/image/common/back.gif
请问你一下啊,菜鸟刚学习,你这个摄像头接了哪些管脚啊???

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

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

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=data;                       
                                        }
                                }


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


Solemnysw 发表于 2014-6-27 22:58

SOI_C我接的是GPIO6口,SOI_D我接的是GPIO7口,

hjh2008303 发表于 2014-6-28 00:37

读数据或者传输到pc的时候把像素坐标弄乱了吧

Solemnysw 发表于 2014-6-28 10:52

hjh2008303 发表于 2014-6-28 00:37 static/image/common/back.gif
读数据或者传输到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啊



myl593799546 发表于 2014-7-2 09:11

Solemnysw 发表于 2014-6-27 22:57 static/image/common/back.gif
// 一条串行数据线(SDA)和一条串行时钟线(SCL)
// GPIO6--SIO_C, GPIO7--SIO_D
//        GPIO_RSET(IODIR,0xFF);...

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

sdgor 发表于 2015-10-21 12:23

我也在用cc2530驱动ov7670,估计是iic协议问题导致花屏。楼主可以发一份程序给我吗?谢谢。tmpboxprt@163.com

15289453240 发表于 2015-11-7 14:25

楼主能不能把你的代码发给小弟,谢谢1448400326@qq.com

好are哟 发表于 2016-1-2 11:14

楼主能不能把程序发给我,谢谢1172120251

shopxyy 发表于 2016-1-26 13:53

你好楼主,请问可不可以分享下程序文件,以及OV7670和CC2530的接线图,万分感谢。QQ380541505

海不盗的天空 发表于 2016-5-9 17:33

楼主你好,可以把你的上位机发给我吗,最近在做毕业设计,万分感谢    1124685756@qq.com

emmmmm 发表于 2020-5-9 19:37

你好,楼主,看了你的关于cc2530与OV7670的帖子,发现了一个comtransferpic串口可以接RGB565的软件,找了好久,可以发下给我吗?我的邮箱是983833702@qq.com
页: [1]
查看完整版本: TI的CC2530驱动OV7670成功