本帖最后由 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) //已经采集完一帧图像了
|