OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3631|回复: 13

ov7670摄像头问题

[复制链接]

7

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-6-2
在线时间
6 小时
发表于 2016-1-8 13:47:20 | 显示全部楼层 |阅读模式
1金钱
买了一块zet6的最小系统和原子哥的ov7670模块,没有买LCD,直接读FIFO然后保存到SD卡(SDIO方式),最后得到的相片只有一种颜色,晕,跪求各位大神给点意见
最后的图片。。。
IMG0001.jpg

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-1-8 16:38:04 | 显示全部楼层
一部分一部分的查呗,硬件连接,镜头初始化,数据传输,数据保存
回复

使用道具 举报

7

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-6-2
在线时间
6 小时
 楼主| 发表于 2016-1-8 16:43:38 | 显示全部楼层
ricefat 发表于 2016-1-8 16:38
一部分一部分的查呗,硬件连接,镜头初始化,数据传输,数据保存

硬件连接检查了几次了,初始化我都设了循环,如果没初始化成功就死循环的,另外我单步调试发觉摄像头的D0~D7总是输出0x7f,所以用winhex查看后面那些全部是7f7f7f7f7f7f7f......什么情况导致这样的?
回复

使用道具 举报

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
发表于 2016-1-8 18:26:15 | 显示全部楼层
调摄像头如果是第一次觉得还是要加个屏好调试一点~~
我是菜鸟
回复

使用道具 举报

7

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-6-2
在线时间
6 小时
 楼主| 发表于 2016-1-8 19:13:57 | 显示全部楼层
[mw_shl_code=c,true]         
        if(ov_sta==2)
        {
                OV7670_RRST=0;                                //开始复位读指针
                OV7670_RCK=0;
                OV7670_RCK=1;
                OV7670_RCK=0;
                OV7670_RRST=1;                                //复位读指针结束
                OV7670_RCK=1;  
                for(j=0;j<101376;j++)
                {          
                        OV7670_RCK=0;
                        color=GPIOC->IDR&0XFF;        //读数据
                               
                        OV7670_RCK=1;
                                   buffera[1]=(unsigned char)color;
                        color<<=8;  
                        OV7670_RCK=0;
                        color|=GPIOC->IDR&0XFF;        //读数据  
                        OV7670_RCK=1;  
                                           buffera[0]=(unsigned char)color;
                        res = f_write(&fsrca, buffera,2, &bw);   //前面定义了unsigned char buffera[2];
                }
                f_close(&fsrca);                                                           
                EXTI_ClearITPendingBit(EXTI_Line8);  //清除LINE8上的中断标志位
                ov_sta=0;                                        //开始下一次采集
        //        ov_frame++;
        }                                                          
               
        } [/mw_shl_code]

各位大神看看有什么问题不?现在的图片变成C:\Users\cool\Desktop\IMG0002.jpg
回复

使用道具 举报

7

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-6-2
在线时间
6 小时
 楼主| 发表于 2016-1-8 19:21:30 | 显示全部楼层
负西弱 发表于 2016-1-8 18:26
调摄像头如果是第一次觉得还是要加个屏好调试一点~~

没屏,现在的图片变成了 IMG0002.jpg
各位能看出什么原因吗?我是用杜邦线的,别说是杜邦线的问题啊
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-1-9 09:53:28 | 显示全部楼层
zsycool 发表于 2016-1-8 16:43
硬件连接检查了几次了,初始化我都设了循环,如果没初始化成功就死循环的,另外我单步调试发觉摄像头的D0 ...

0x7f
换成二进制就是01111111,你确定线路没问题?
回复

使用道具 举报

7

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-6-2
在线时间
6 小时
 楼主| 发表于 2016-1-9 13:49:42 | 显示全部楼层
ricefat 发表于 2016-1-9 09:53
0x7f
换成二进制就是01111111,你确定线路没问题?

之前的0x7f是我的一个失误,现在我调的结果变成这样了,有谁可以解释下吗?总是不成像 捕获.JPG
回复

使用道具 举报

7

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-6-2
在线时间
6 小时
 楼主| 发表于 2016-1-9 14:16:51 | 显示全部楼层
ricefat 发表于 2016-1-9 09:53
0x7f
换成二进制就是01111111,你确定线路没问题?

[mw_shl_code=c,true]
///////////直接读FIFO缓存直接写进SD卡/////////////////////
void camera_refresh(void)
{
        u32 j;        u8 res;
        u16 color;         
        if(ov_sta==2)
        {
//                LCD_Scan_Dir(U2D_L2R);                //从上到下,从左到右
//                LCD_SetCursor(0x00,0x0000);        //设置光标位置
//                LCD_WriteRAM_Prepare();     //开始写入GRAM       
                OV7670_RRST=0;                                //开始复位读指针
                OV7670_RCK=0;
                OV7670_RCK=1;
                OV7670_RCK=0;
                OV7670_RRST=1;                                //复位读指针结束
                OV7670_RCK=1;  
                for(j=0;j<76800;j++)
                {
                        OV7670_RCK=0;
                        color=GPIOC->IDR&0XFF;        //读数据
                        OV7670_RCK=1;
                        buffera[0]=(unsigned char)color;
                        color<<=8;  
                        OV7670_RCK=0;
                        color|=GPIOC->IDR&0XFF;        //读数据
                        OV7670_RCK=1;
                //        LCD->LCD_RAM=color;
                        buffera[1]=(unsigned char)color;
                         res=f_write(ftemp, buffera,2, &bw); //前面定义了unsigned char buffera[2];
                }
                res=f_close(ftemp);                                                           
                EXTI_ClearITPendingBit(EXTI_Line8);  //清除EXTI8线路挂起位       
                ov_sta=0;                                        //开始下一次采集
                ov_frame++;
        }
}


///////////////////////这里是BMP生成函数,被我改为在这里只写进BMP文件头了(因为没有LCD,所以读不了LCD的图片信息),然后在上面那个函数写进BMP数据区//////////
u8 bmp_encode(u8 *filename,u16 width,u16 height,u8 mode)
{                               
//        FIL* f_bmp;
        u16 bmpheadsize;                        //bmp头大小                  
        BITMAPINFO hbmp;                        //bmp头         
        u8 res=0;
        bmpheadsize=sizeof(hbmp);//得到bmp文件头的大小   
        mymemset((u8*)&hbmp,0,sizeof(hbmp));//置零空申请到的内存.            
        hbmp.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);//信息头大小
        hbmp.bmiHeader.biWidth=width;                 //bmp的宽度
        hbmp.bmiHeader.biHeight=height;         //bmp的高度
        hbmp.bmiHeader.biPlanes=1;                         //恒为1
        hbmp.bmiHeader.biBitCount=16;                 //bmp为16位色bmp
        hbmp.bmiHeader.biCompression=BI_BITFIELDS;//每个象素的比特由指定的掩码决定。
        hbmp.bmiHeader.biSizeImage=hbmp.bmiHeader.biHeight*hbmp.bmiHeader.biWidth*hbmp.bmiHeader.biBitCount/8;//bmp数据区大小
                                  
        hbmp.bmfHeader.bfType=((u16)'M'<<8)+'B';//BM格式标志
        hbmp.bmfHeader.bfSize=bmpheadsize+hbmp.bmiHeader.biSizeImage;//整个bmp的大小
           hbmp.bmfHeader.bfOffBits=bmpheadsize;//到数据区的偏移

        hbmp.RGB_MASK[0]=0X00F800;                         //红色掩码
        hbmp.RGB_MASK[1]=0X0007E0;                         //绿色掩码
        hbmp.RGB_MASK[2]=0X00001F;                         //蓝色掩码

        if(mode==1)res=f_open(ftemp,(const TCHAR*)filename,FA_READ|FA_WRITE);//尝试打开之前的文件
        if(mode==0||res==0x04)res=f_open(ftemp,(const TCHAR*)filename,FA_WRITE|FA_CREATE_NEW);//模式0,或者尝试打开失败,则创建新文件       
        if(res==FR_OK)//创建成功
        {
                res=f_write(ftemp,(u8*)&hbmp,bmpheadsize,&bw);//写入BMP首部
                }
        return res;
}
[/mw_shl_code]


经过单步调试,SD卡、ov7670等是初始化成功,没问题的,SD卡写进去也没问题。。。。。
各位大佬,请不吝赐教,谢谢!!!!
一下是现在拍到的相片!!!
捕获.JPG
回复

使用道具 举报

11

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
493
金钱
493
注册时间
2013-11-26
在线时间
113 小时
发表于 2016-1-10 11:01:55 | 显示全部楼层
先用串口把数据读出来看看是不是正确吧  不用忙着显示  先把数据弄正确了再检查编码问题  其实有没有屏差不多的
回复

使用道具 举报

7

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-11-16
在线时间
2 小时
发表于 2016-1-10 18:19:56 | 显示全部楼层
你用的什么格式的呢,jpg还是rgb?另外你往sd卡存或者是用串口发送,你确定发送的是完整的数据么?你要看下存储速率。如果都没有错误,有可能是7670寄存器的配置问题了。
回复

使用道具 举报

7

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-11-16
在线时间
2 小时
发表于 2016-1-10 18:20:58 | 显示全部楼层
最好再买个lcd,尺寸小的就可以,也不贵,方便调试
回复

使用道具 举报

7

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-6-2
在线时间
6 小时
 楼主| 发表于 2016-1-10 18:41:05 | 显示全部楼层
philip5966 发表于 2016-1-10 18:19
你用的什么格式的呢,jpg还是rgb?另外你往sd卡存或者是用串口发送,你确定发送的是完整的数据么?你要看下 ...

我是存储为bmp格式的,直接存在SD卡里,我是用原子哥的例程,除了上面我贴出的代码修改了,其他的没怎么改动,我基本就改了上面两个函数,一个是直接读FIFO缓存直接保存到SD卡的,一个是只写进BMP头的函数,我上面贴着代码
回复

使用道具 举报

32

主题

223

帖子

0

精华

高级会员

Rank: 4

积分
695
金钱
695
注册时间
2015-9-23
在线时间
120 小时
发表于 2016-1-10 21:22:09 | 显示全部楼层
每次存储的时候把第一幅图滤掉。试试。
先调试彩带。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 22:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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