关于ESP在I2C Camer从机模式下FIFO 模式的请教

wulin76
Posts: 7
Joined: Mon Jan 23, 2023 7:39 am

关于ESP在I2C Camer从机模式下FIFO 模式的请教

Postby wulin76 » Tue Jan 31, 2023 12:48 pm

学习ESP32摄像头的样例,例子跑通,但对于ll_cam.c(components\esp32-camera\target\esp32)中FIFO模式,确有不解,希望有人能帮忙解释

Code: Select all

typedef enum {
    /* camera sends byte sequence: s1, s2, s3, s4, ...
     * fifo receives: 00 s1 00 s2, 00 s2 00 s3, 00 s3 00 s4, ...
     */
    SM_0A0B_0B0C = 0,
    /* camera sends byte sequence: s1, s2, s3, s4, ...
     * fifo receives: 00 s1 00 s2, 00 s3 00 s4, ...
     */
    SM_0A0B_0C0D = 1,
    /* camera sends byte sequence: s1, s2, s3, s4, ...
     * fifo receives: 00 s1 00 00, 00 s2 00 00, 00 s3 00 00, ...
     */
    SM_0A00_0B00 = 3,
} i2s_sampling_mode_t;
参考代码和esp32_technical_reference_manual_cn.pdf,大致知道上述3个枚举对应FIFO 模式(I2S_RX_FIFO_MOD[2:0])中的3种。

对于样例中设置FIFO模式的函数ll_cam_set_sample_mode,确实不甚明了,该函数根据下面两个参考因素,确定使用哪种模式
1.摄像头的型号
2.摄像头输入的时钟频率(XCLK)

摄像头型号可能可以理解,因为不同摄像头可能时序不同,但和时钟频率是什么关系呢?

little_z
Posts: 1
Joined: Wed Jan 03, 2024 5:04 pm

Re: 关于ESP在I2C Camer从机模式下FIFO 模式的请教

Postby little_z » Wed Jan 03, 2024 5:28 pm

我用的ESP32,我猜测,应该是因为,esp32 camera组件是用I2S总线来接收摄像头数据的,本质上应该是移花接木,因此摄像头的时序和I2S的时序存在一定偏差,需要进行手动调整,可以看到函数里,根据速率不同使用了不同的dma filter函数,我猜测,应该是因为当时钟xclk>10M后,获得的数据时序将会和I2S形成另一种适配方式,因此有两种取样模式,对应两种dma filter函数,从取样的方式也能大概看出这一点,当高速模式时,四字节中取样一次,低速时,两字节中取样一次
同时,也能看出这里的一些可能出现的问题。也就是摄像头最终输出的数据时钟应该和dma filter相适应,因为xclk只是摄像头的系统时钟,并不是最终输出的像素时钟,根据不同的分辨率和要求,同样的xclk会有不同的输出时钟,当不适配时就可能出现bug,实际上应该已经有类似topic关注这个问题了,我刚开始用camera组件时也遇到了这个问题,经过一些乱七八糟的时序调整,消除了bug,现在看应该就是这里的原因

Who is online

Users browsing this forum: Bing [Bot] and 33 guests