打印
[STM32F4]

OV5640调试数据异常

[复制链接]
616|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 feiyinglala 于 2022-12-25 18:36 编辑

使用STM43F429驱动OV5640摄像头模块,目前在尝试通过串口输出摄像头数据,遇到2个问题,如图所示

1.每次得到的jpeg数据长度差别很大
2.上位机软件没有像素显示

目前开发主要参考了,正点原子的探索者的源码,主要处理流程如下,我想请教一下,我应该重点排查哪些地方。
①DCMI帧中断触发后,启动jpeg_data_process;
②jpeg_data_process中,根据当前数据状态,处理标志位jpeg_data_ok(0:数据未准备好;1:数据已准备好 未发送;2:数据发走 完成处理)
//处理JPEG数据,这个函数较为关键
//当采集完一帧JPEG数据后,调用此函数,切换JPEG BUF.开始下一帧采集.
void jpeg_data_process(void)
{
        if(jpeg_data_ok==0)        //jpeg数据还未采集完?
        {        
                DMA_Cmd(DMA2_Stream1, DISABLE);        //停止当前传输
                while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE){}//等待DMA2_Stream1可配置  
                jpeg_data_len=jpeg_buf_size-DMA_GetCurrDataCounter(DMA2_Stream1);//得到此次数据传输的长度
                        
                jpeg_data_ok=1;                                 //标记JPEG数据采集完按成,等待其他函数处理
        }
        if(jpeg_data_ok==2)        //上一次的jpeg数据已经被处理了
        {
                DMA2_Stream1->NDTR=jpeg_buf_size;                //更新DMA流结构体中数据量
                DMA_SetCurrDataCounter(DMA2_Stream1,jpeg_buf_size);//传输长度为jpeg_buf_size*4字节
                DMA_Cmd(DMA2_Stream1, ENABLE);                        //重新传输
                jpeg_data_ok=0;                                                        //标记数据未采集        
        }
}
③主函数中:
jpeg_data_ok=1 时,串口输出数据
//***************OV数据串口输出测试代码*********************
                if(jpeg_data_ok==1)        //已经采集完一帧图像了
                {  
                        OV_UART_p=(u8*)jpeg_buf;
                        CAMERA_DEBUG("jpeg_data_len:%d\r\n",jpeg_data_len*4);//
                        //LCD_ShowString(30,210,210,16,16,"Sending JPEG data..."); //提示正在传输数据
                        jpglen=0;        //设置jpg文件大小为0
                        headok=0;        //清除jpg头标记
                        for(OV_i=0;OV_i<jpeg_data_len*4;OV_i++)//查找0XFF,0XD8和0XFF,0XD9,获取jpg文件大小
                        {
                                if((OV_UART_p[OV_i]==0XFF)&&(OV_UART_p[OV_i+1]==0XD8))//找到FF D8
                                {
                                        jpgstart=OV_i;
                                        headok=1;        //标记找到jpg头(FF D8)
CAMERA_DEBUG("已匹配到jpg头标志FFD8\r\n");//调试输出
                                }
                                if((OV_UART_p[OV_i]==0XFF)&&(OV_UART_p[OV_i+1]==0XD9)&&headok)//找到头以后,再找FF D9
                                {
CAMERA_DEBUG("已匹配到jpg尾标志FFD9\r\n");//调试输出                                
                                        jpglen=OV_i-jpgstart+2;
                                        break;
                                }
                        }
                        if(jpglen)        //正常的jpeg数据
                        {
CAMERA_DEBUG("jpg文件数据长为:%d\r\n",jpglen);//                        
                                OV_UART_p+=jpgstart;                        //偏移到0XFF,0XD8处(头)
                                for(OV_i=0;OV_i<jpglen;OV_i++)        //发送整个jpg文件
                                {
                                        while((UART7->SR&0X40)==0);        //循环发送,直到发送完毕   
                                        UART7->DR=OV_UART_p[OV_i];  
                                }  
                        }
                        jpeg_data_ok=2;        //标记jpeg数据处理完了,可以让DMA去采集下一帧了.
                }//if(jpeg_data_ok==1)        //已经采集完一帧图像了


使用特权

评论回复
沙发
feiyinglala|  楼主 | 2022-12-26 01:07 | 只看该作者
调了一晚上,JPEG数据初步出现了规律,但是上位机软件还是没有显示,文本截图如下





使用特权

评论回复
板凳
feiyinglala|  楼主 | 2022-12-29 18:05 | 只看该作者
自己结贴了,折腾几天,分析了一下现象:数据局部有重复、错误等现象,我最开始怀疑是串口输出的问题,但是在仿真中发现数据也还是会存在这个问题,后来我想起,在调试OV模块时,HSE未能正确使用,然后就排查电路板,HSE对应的25M晶振就一直没正常工作,所以就把晶振换了,问题迎刃而解。
摄像头折腾挺久的,第一次看到自己控制的摄像头输出画面,还是超级开心的。
结论:数据局部错误较多,是因为驱动OV5640的时钟源选择的是HSI,精度不足,排除晶振问题后,HSE正常启用,选用12M晶振经过2分频为OV5640提供时钟,调通。

使用特权

评论回复
地板
Bowclad| | 2023-1-1 17:03 | 只看该作者
内部时钟不够精确

使用特权

评论回复
5
feiyinglala|  楼主 | 2023-1-1 19:03 | 只看该作者
Bowclad 发表于 2023-1-1 17:03
内部时钟不够精确

没错,这个是自己给自己埋的坑,后边一定要注意。

使用特权

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

本版积分规则

21

主题

224

帖子

1

粉丝