芯片支持压缩数据格式和原始数据格式,本文主要解释如何实现这两种数据格式的接收配置。
CH565评估板摄像头购买适配:/bbs/thread-98402-1.html
这里不涉及实际sensor的功能配置,sensor输出格式配置请具体参考对应手册!!!
在此建议将CH565手册12章通读一次!
芯片支持压缩数据格式和原始数据格式,本文主要解释如何实现这两种数据格式的接收配置。
CH565评估板摄像头购买适配:/bbs/thread-98402-1.html
这里不涉及实际sensor的功能配置,sensor输出格式配置请具体参考对应手册!!!
在此建议将CH565手册12章通读一次!
直接运行EVT中DVP例程:
首先我们需要知道,DVP接口上主要存在两种数据流格式:压缩数据和非压缩数据。这也影响CH565的配置方式。这两种格式最大的差距就是一帧图像的数据长度,其中压缩数据会因为不同图像,每帧图像的数据长度(byte)都是不定的。非压缩数据格式,每帧图像数据长度(byte)都是固定的,通常是分辨率的倍数。
因为CH565的DVP接口是接收的一方,同时clk是连续送出的,所以要尽可能利用好接口上各种信号和数据格式特点,来完成每一帧图像的接收,确保数据无误。(DVP接口是没有校验机制的,也即允许存在一定程度的误码)
摘抄手册中对DVP接口时序的描述:
其中我们需要关注PCLK、HSYNC、VSYNC。
JPEG模式:
jpeg格式输出的特点是不定长,且数据经过算法压缩,一张图片数据本身已经不包含了行、列的概念,所以我们在接收数据时,关注VSYNC提供的帧起始、帧结束信号即可:
1、首先应当正确配置R8_DVP_CR0寄存器中的数据模式,这个比较直观。
2、根据实际使用的sensor输出极性,正确配置RB_DVP_V_POLAR.
3、同时根据实际情况配置R8_DVP_CR0中的数据位宽、剩余信号线的有效极性。
4、配置R16_DVP_COL_NUM,因为jpeg失去了行列概念,但是我们又需要约束DMA传输的长度,所以配置该寄存器实际配置的是DMA长度,双缓冲机制DMA,会在数据接收长度达到该寄存器定义值之后自动切换到另一缓冲区,并产生行中断。
5、因为CH565作为数据接收方,DVP接口是被动的,且接口上的clk是连续的,但数据又需要及时处理或者转发走,存在访问冲突,所以DVP接口是强制使用双缓冲,正确配置双缓冲地址:(注意地址对齐)
6、使能中断,DVP是必须使用中断的,否则很容易丢数据,必须需要使用到:
行结束中断(指示一次DMA传输完成)
帧结束中断STP_FRM(指示一帧的结束,此时通常存在末尾数据,这部分数据又不足以触发行结束中断)
帧开始中断不是必须的,这取决于应用上
7、使能DMA、使能DVP
中断服务函数处理:
当中断源是ROW_DONE行结束时,则表示前面配置的R16_DVP_COL_NUM长度达到,此时有该长度的数据已经在ram中,可以被处理或者转发。且此时双缓冲进行切换。
当中断源时STP_FRM时,表示一帧图像结束,此时末尾部分数据也已经保存在ram中,但此可能长度没有达到R16_DVP_COL_NUM的配置值,通过读取R16_DVP_COL_CNT,减去之前的 行数量*R16_DVP_COL_NUM即可准确得出末尾数据长度。
前面提到的帧起始中断,不是必须的,因为只要有帧起始,前面必然会有帧结束,因为CH565使能DVP的时候,sensor通常已经在连续输出数据了,且不能保证使能瞬间,sensor输出的正好是一帧起始,所以,代码逻辑中,始终应该结束帧结束来刷新某些变量。
不清楚能不能用dvp接口连接并行adc?我看好像有用stm32的dcmi接口实现的
我也关注这个问题,想接20MHz左右的并口ADC,例如AD9235,不知是否能这样用?
CH569的DVP接口类似DCMI,驱动OV2640这样的摄像头模块是没有问题的,但目前还没有应用于ADC方面的测试。您可以考虑找一些DCMI实现的方式,分享一下看看能否适用。
我仔细看了下,有个不确定的地方
在DVP接口中,如果传输的是JPEG格式的格式数据,它是只关注场信号,如果场信号一直有效,DVP的DMA是不是会一直传输下去??
(如果DMA不停的话,貌似就能用MCO作为采集频率,用DVP直接采集并口ADC了。)
还有CH32V307和569的DVP是一样的吧?