OpenEdv-开源电子网

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

原子哥求助 !!! 关于0V7670摄像头采集的一帧数据,直接通过串口发送出来

[复制链接]

1

主题

9

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2017-7-19
在线时间
6 小时
发表于 2017-8-1 19:09:04 | 显示全部楼层 |阅读模式
  最近在调试0V7670采集一帧的数据,然后通过串口发出来,在一帧数据发送到串口之前,我已经将BMP文件的文件头先发送到串口了,然后再发送一帧的图片数据,在串口助手上可以看到发过来的数据,但是保存为BMP的文件格式之后,再电脑上打开,并不能显示出。关键的代码如下 : 求原子哥帮帮忙void camera_refresh(void){
        u16 i;
        u32 j;
        u16 color;
        u16 bmpheadsize;                                  
        BITMAPINFO hbmp;               
        u16 *databuf;                                                  
        u16 pixcnt=0;               
        bmpheadsize=sizeof(hbmp);
        mymemset((u8*)&hbmp,0,sizeof(hbmp));   
        hbmp.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
        hbmp.bmiHeader.biWidth=320;                
        hbmp.bmiHeader.biHeight=240;        
        hbmp.bmiHeader.biPlanes=1;                        
        hbmp.bmiHeader.biBitCount=16;                
        hbmp.bmiHeader.biCompression=BI_BITFIELDS;
        hbmp.bmiHeader.biSizeImage=hbmp.bmiHeader.biHeight*hbmp.bmiHeader.biWidth*hbmp.bmiHeader.biBitCount/8;//bmpêy¾YÇø′óD¡                          
        hbmp.bmfHeader.bfType=((u16)'M'<<8)+'B';//BM&#184;&#241;ê&#189;±ê&#214;&#190;
        hbmp.bmfHeader.bfSize=bmpheadsize+hbmp.bmiHeader.biSizeImage;//&#213;&#251;&#184;&#246;bmpμ&#196;′óD&#161;
  hbmp.bmfHeader.bfOffBits=bmpheadsize;//μ&#189;êy&#190;Y&#199;&#248;μ&#196;&#198;&#171;ò&#198;
        hbmp.RGB_MASK[0]=0X00F800;                         //oìé&#171;&#209;ú&#194;&#235;
        hbmp.RGB_MASK[1]=0X0007E0;                         //&#194;ìé&#171;&#209;ú&#194;&#235;
        hbmp.RGB_MASK[2]=0X00001F;                         //à&#182;é&#171;&#209;ú&#194;&#235;
  for(i=0; i<sizeof(hbmp);i++)  //í¨1y′&#174;&#191;ú·¢&#203;í&#189;á11ì&#229;
        {
  USART_SendData(USART1,*((u8*)&hbmp+i));
        while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);
   delay_ms(1);
        }               
        if(ov_sta)
        {
                OV7670_RRST=0;                                //&#191;aê&#188;&#184;′&#206;&#187;&#182;á&#214;&#184;&#213;&#235;
                OV7670_RCK_L;
                OV7670_RCK_H;
                OV7670_RCK_L;
                OV7670_RRST=1;                                //&#184;′&#206;&#187;&#182;á&#214;&#184;&#213;&#235;&#189;áê&#248;
                OV7670_RCK_H;
                for(j=0;j<76800;j++)
                {
                        OV7670_RCK_L;
                        color=GPIOC->IDR&0XFF;        //&#182;áêy&#190;Y
                        OV7670_RCK_H;
                        color<<=8;  
                        OV7670_RCK_L;
                        color|=GPIOC->IDR&0XFF;        //&#182;áêy&#190;Y
                        OV7670_RCK_H;


       USART1->DR=color;
                   while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);       
                }  
  while(1);               

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

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2017-7-19
在线时间
6 小时
 楼主| 发表于 2017-8-2 09:27:26 | 显示全部楼层
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2017-7-19
在线时间
6 小时
 楼主| 发表于 2017-8-2 10:32:50 | 显示全部楼层
大致已经找到问题了 ,OV7670代码里面输出的是RGB565的格式就是说输出的来的是16为的数据,FIFO是以8个字节8字节输出的 所以程序里接收数据的时候color左移的8位,如果把color里面的数据直接送到串口,串口只能接收8为的数据,例外的8为数据会丢失,解决办法是有三个,第一种 改变OV7670的初始化序列,让ov7670输出8位的数据(具体是什么格式,我还要看看说明书),第二种,直接把color16位的数据保存到SD卡,自己填写BMP报头,保存之后图片会在SD卡里面 ,还有一种就是直接把接收数据的循环体代码改下,接收76800*2个数据,此时不要把COLOR进行移位操作,串口就是一个fifi的桥梁。然后在上位机上处理数据。。。
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-8-5
在线时间
3 小时
发表于 2017-8-7 17:47:55 | 显示全部楼层
楼主调好了吗,最近在用瑞萨驱动7670,遇到了问题。我是一个字节一个字节将数据发到调试助手的,然后是一个像素丢一个字节,只上发一个字节的数据,也能凑合出来图,但是在窗口设置上卡壳了,那个12 和176 随便一改就花屏了,请问楼主会设置窗口吗
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 04:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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