嵌入式技术论坛
直播中

goodmbby

8年用户 1199经验值
擅长:处理器/DSP
私信 关注
[经验]

ART-PI camera摄像头调试遇到的问题及解决办法

camera调试笔记
调试遇到的问题
IIC读写没有NAK
原因:摄像头需要mclk, ov2640模组里面自带晶振不需要外部提供, gc0328c需要外部提供,否则不工作。
换有源晶振没有效果
原因:转接板虚焊(接触不良), 第二天换新板子解决。
RST/PWN
ov2640 与 gc0328c的pwn使能信号极性相反,需要做一定处理,pwn主要用来控制摄像头工作状态。
在摄像头上挥动画面有变化,但是出图只有纯色(色块)
原因:DCMI(DVP)与摄像头的 HSYNC与VSYNC没有匹配上,DCMI采图时摄像头并没有输出图像。
一直停留在上一次输出的最后一个点,因为pclk会一直输出,所以采集的图像只有一个点的颜色。

STM32h7 DCMI配置


static rt_err_t rt_hw_dcmi_init(DCMI_HandleTypeDef *device)

{

RT_ASSERT(device != RT_NULL);

device->Instance = DCMI;

device->Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;

device->Init.PCKPolarity = DCMI_PCKPOLARITY_RISING;

device->Init.VSPolarity = DCMI_VSPOLARITY_LOW; //数据无效时的电平

device->Init.HSPolarity = DCMI_HSPOLARITY_LOW; //数据无效时的电平

device->Init.CaptureRate = DCMI_CR_ALL_FRAME;

device->Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;

device->Init.JPEGMode = DCMI_JPEG_DISABLE;

device->Init.ByteSelectMode = DCMI_BSM_ALL;

device->Init.ByteSelectStart = DCMI_OEBS_ODD;

device->Init.LineSelectMode = DCMI_LSM_ALL;

device->Init.LineSelectStart = DCMI_OELS_ODD;

if (HAL_DCMI_Init(device) != HAL_OK)

{

LOG_E("dcmi init error!");

return RT_ERROR;

}

DCMI->IER = 0x0;

__HAL_DCMI_ENABLE_IT(device, DCMI_IT_FRAME);

__HAL_DCMI_ENABLE(device);

return RT_EOK;

}

ov2640正常出图逻辑分析仪时序图

gc0328c出现色块画面逻辑分析仪时序图

解决办法通过调整gc0328c寄存器将 HSYNC与 VSYNC 数据有效电平,与stm32h7 dcmi配置一致。
出图能看到运动的轮廓,但是颜色不对
原因:gc0328c输出rgb565时,大小端与主控的不匹配,通过修改摄像头寄存器翻转字节序后解决。

注意事项
摄像头需要MCLK,常用的是24M, 没有MCLK会不工作。
摄像头输出帧率由VSYNC控制,HSYNC与PCLK控制画面的长宽
PCLK一般是固定频率,会一直输出,不内部分频的情况下,跟MCLK一样,但是PCLK由摄像头输出给主控。
一般的摄像头不支持jpeg压缩输出,比如GC0328c,只能输出yuv或者RGB565格式。
stm32H7使用sdram作为DCMI缓冲区时,获取完一帧数据显示到lcd画面会撕裂,原因是sdram速度慢没有内部sram快。



原作者:小鳄鱼

回帖(2)

jf_46824434

2022-7-15 12:53:58
请教一下为什么用sdram接受dcmi传过来的数据,再显示到lcd会出现画面撕裂?
不是接收完一帧数据就会暂停dma,然后再读取呢?这样下一帧的数据和上一帧也不会串到一起呀?
举报

jf_46824434

2022-7-15 12:54:21
请教一下为什么用sdram接受dcmi传过来的数据,再显示到lcd会出现画面撕裂?
不是接收完一帧数据就会暂停dma,然后再读取呢?这样下一帧的数据和上一帧也不会串到一起呀?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分