How to configure CX3 MIPI interface?

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
chhe_4303246
Level 2
Level 2

你好:

     我使用denebola RDK并且尝试在640x480分辨率下,做了如下配置

pastedImage_0.png

生成的:

/* ov5640_YUY2_VGA :  */

CyU3PMipicsiCfg_t ov5640_YUY2_VGA = 

{

    CY_U3P_CSI_DF_YUV422_8_2,  /* CyU3PMipicsiDataFormat_t dataFormat */

    1,                          /* uint8_t numDataLanes */

    1, /* uint8_t pllPrd */

    90, /* uint16_t pllFbd */

    CY_U3P_CSI_PLL_FRS_250_500M, /* CyU3PMipicsiPllClkFrs_t pllFrs */ 

    CY_U3P_CSI_PLL_CLK_DIV_4, /* CyU3PMipicsiPllClkDiv_t csiRxClkDiv */

    CY_U3P_CSI_PLL_CLK_DIV_8, /* CyU3PMipicsiPllClkDiv_t parClkDiv */

    0,                 /* uint16_t mClkCtl */

    CY_U3P_CSI_PLL_CLK_DIV_2, /* CyU3PMipicsiPllClkDiv_t mClkRefDiv */

    640,         /* uint16_t hResolution */

    100                         /* uint16_t fifoDelay */

};

替换之前的配置:

/* Configuration parameters for VGA for the OV5640 sensor */

CyU3PMipicsiCfg_t cfgUvcVgaNoMclk =  {

    CY_U3P_CSI_DF_YUV422_8_2,       /* dataFormat   */   

    1,                            /* numDataLanes */   

    0x1,                          /* pllPrd       */   

    90,                           /* pllFbd       */   

    CY_U3P_CSI_PLL_FRS_125_250M,   /* pllFrs      */           

    CY_U3P_CSI_PLL_CLK_DIV_2,     /* csiRxClkDiv  */   

    CY_U3P_CSI_PLL_CLK_DIV_8,     /* parClkDiv    */   

    0x00,                         /* mclkCtl      */   

    CY_U3P_CSI_PLL_CLK_DIV_8,     /* mClkRefDiv   */   

    640,                          /* hResolution  */   

    0x01                          /* fifoDelay    */   

};

然后重新编译,运行,发现USB摄像头不能传送图片。串口终端循环打印:

DMA RESET

AplnStrt:SMState = 0x1

DMA RESET

AplnStrt:SMState = 0x1

请问我使用cx3 configuration工具配置的方法有什么问题吗?

0 Likes
1 Solution

这个也是正常的。具体到你的问题,结论是:你所做的修改,使得 CX3 不能够正确地解析出行场信号,从而内部的状态机不能够正确跳转。

你可以在 Demo 板上用示波器测量得到这个结果。

对于 在 UVC 应用中的sensor来说,即使同样的分辨率、帧率、格式,不同的人配出的参数也不是 每个寄存器都是一样的。在满足 输出格式、分辨率以及帧率要求的前提下,也可以对部分寄存器进行微调。

对于 CX3 部分也是一样,你在 配置工具中看到的参数,也可以进行调整(在一定的区间内)。这里所说的 sensor 和 CX3 某些寄存器调整,涉及到 MIPI CSI 和 UVC 协议的了解。

这个配置工具存在的意义,是可以帮助用户在不了解 MIPI CSI 和 UVC 协议的背景下,快速搭一个 Demo出来,同时也可以用作 参数验证。我这里说的验证,指的是它可以帮助用户剔除肯定不能work的参数。而不是说,工具没有报错的参数就100%一定能够work(这个可能也是很难做到的)。在实际项目中,还需要 debug 过程。这其中就需要对 协议的了解 和经验,根据现象去调整。

再回到你所做的修改,和你所希望的“修改帧率或分辨率”并没有什么关系。因为要实现这个需求,你需要

1、 修改 sensor 配置以输出相应的分辨率或帧率。

2、 修改Frame descriptor 以及 probe structure

3、 利用工具检验参数

4、 Debug,根据现象做调整。

在这里你只修改了CX3 的PLL参数,没有修改其他地方,为什么认为一定会work呢?

我们前面说到,工具里给出的参数和实际的不一致(这一点是一个问题),所以,当你只 修改了 CX3 的PLL后,将会导致工具按照你看到的参数验证,给出通过的结果。而实际上,新的CX3 PLL参数已经和实际的sensor参数不匹配了。

这是有可能的。

要确认这一点的话,你可以尝试找出实际的sensor配置参数,用工具去验证下,看行不行。

View solution in original post

0 Likes
21 Replies
chhe_4303246
Level 2
Level 2

请问CSI clock是否指的就是MIPI clock,就是MCP和MCN差分时钟呢?

0 Likes

还有,怎么计算CSI clock呢?是否这样子:

CSI clock=Htotal x VTotal X BPP(bit per Pixel) X frame rate / mipi data lane?

但是好像我这样子算出来的又不对

0 Likes

chummy he 撰写:

还有,怎么计算CSI clock呢?是否这样子:

CSI clock=Htotal x VTotal X BPP(bit per Pixel) X frame rate / mipi data lane?

但是好像我这样子算出来的又不对

你可以参考如下文档

CX3 视频时间参数解析 – KBA226779 (ZH)

0 Likes

chummy he 撰写:

你好:

     我使用denebola RDK并且尝试在640x480分辨率下,做了如下配置

pastedImage_0.png

生成的:

/* ov5640_YUY2_VGA :  */

CyU3PMipicsiCfg_t ov5640_YUY2_VGA =

{

    CY_U3P_CSI_DF_YUV422_8_2,  /* CyU3PMipicsiDataFormat_t dataFormat */

    1,                          /* uint8_t numDataLanes */

    1, /* uint8_t pllPrd */

    90, /* uint16_t pllFbd */

    CY_U3P_CSI_PLL_FRS_250_500M, /* CyU3PMipicsiPllClkFrs_t pllFrs */

    CY_U3P_CSI_PLL_CLK_DIV_4, /* CyU3PMipicsiPllClkDiv_t csiRxClkDiv */

    CY_U3P_CSI_PLL_CLK_DIV_8, /* CyU3PMipicsiPllClkDiv_t parClkDiv */

    0,                 /* uint16_t mClkCtl */

    CY_U3P_CSI_PLL_CLK_DIV_2, /* CyU3PMipicsiPllClkDiv_t mClkRefDiv */

    640,         /* uint16_t hResolution */

    100                         /* uint16_t fifoDelay */

};

替换之前的配置:

/* Configuration parameters for VGA for the OV5640 sensor */

CyU3PMipicsiCfg_t cfgUvcVgaNoMclk =  {

    CY_U3P_CSI_DF_YUV422_8_2,       /* dataFormat   */  

    1,                            /* numDataLanes */  

    0x1,                          /* pllPrd       */  

    90,                           /* pllFbd       */  

    CY_U3P_CSI_PLL_FRS_125_250M,   /* pllFrs      */          

    CY_U3P_CSI_PLL_CLK_DIV_2,     /* csiRxClkDiv  */  

    CY_U3P_CSI_PLL_CLK_DIV_8,     /* parClkDiv    */  

    0x00,                         /* mclkCtl      */  

    CY_U3P_CSI_PLL_CLK_DIV_8,     /* mClkRefDiv   */  

    640,                          /* hResolution  */  

    0x01                          /* fifoDelay    */  

};

然后重新编译,运行,发现USB摄像头不能传送图片。串口终端循环打印:

DMA RESET

AplnStrt:SMState = 0x1

DMA RESET

AplnStrt:SMState = 0x1

请问我使用cx3 configuration工具配置的方法有什么问题吗?

你是在Demo 工程的基础上,只修改了这个 structure 是吗?

是的,只改了这个structure,还是按照cx3 configration tool生成的值改的

0 Likes

如果CSI clock就是差分时钟的话,我感觉你们cypress sdk自带的那个yuv422_ov5640.cycx,CSI clock应该不是实际的mipi时钟,因为我看到从分辨率5MP到VGA你们的CSI clock都是一样的,还有Hblank和Vblank也都是一样的,我觉得是不对的

0 Likes

你好:

     Yang,能抽空回我一下吗?谢谢!

0 Likes

你好:

     Yang。我在工具下面只改了framerate参数

VGA 30fps

pastedImage_0.png

VGA 15fps

pastedImage_1.png

可以看到2者生成的数据完全一样,实际上在生成的C代码中也可以看到,确实完全一样

工具本身也没有提示什么错误,请问这个正常吗?我的SDK suite是1.3.4最新版本的,windows上运行

                    谢谢!

0 Likes

chummy he 撰写:

你好:

     Yang。我在工具下面只改了framerate参数

VGA 30fps

pastedImage_0.png

VGA 15fps

pastedImage_1.png

可以看到2者生成的数据完全一样,实际上在生成的C代码中也可以看到,确实完全一样

工具本身也没有提示什么错误,请问这个正常吗?我的SDK suite是1.3.4最新版本的,windows上运行

                    谢谢!

这两种配置生成的代码当然 是不一样的,frame descriptor 中需要写 Max bits/s 、Min bits/s 和 frame interval,还需要向host

返回不同的 probe structure ,怎么能一样?

另外,MIPI CSI Input 部分的参数需要按照 SDK 中的 Demo 工程一样做配置,Demo里面 VGA 是配置的 1 Lane,你这里为什么写了 2 lane?

0 Likes

你好:

     好像frame descriptor和probe structure中的数据真不重要,我把这2个结构体当中的数据改成30桢/15桢其它不改,VGA分辨率下可以看到你们的CX3同样可以返回60fps的图像数据,没有任何问题。看起来好像真正需要改的就只有CyU3PMipicsiCfg_t 结构中的数据,而上面你也看到了,30fps和15fps,你们的工具生成的数据都一样,这就让我很迷糊了。而且上面我也我试过60fps@VGA下面,修改上面这些PLL divder值,配置工具没有报错,只替换这个结构体的值,denebola不能出图像,测试hsync/vsync没有信号输出,终端循环报DMA reset错误。感觉你们的工具还没有完全完善

0 Likes

CSI clock应该不是实际的mipi时钟,因为我看到从分辨率5MP到VGA你们的CSI clock都是一样的,还有Hblank和Vblank也都是一样的,我觉得是不对的

这个想法没有什么道理。为什么不同分辨率不能使用同样的 CSI 时钟?不能使用同样的 H_blank 和 V_blank 值?

在VGA@60fps分辨率下,通过在i2c接口加打印输出,我看到你们的denebola给ov5640配置的i2c寄存器值htotal=0x768=1894

vtotal=0x3d8=984

所以实际上应该是,hblank=1894-640=1254

vblank=984-480=504

而且参考ominivision的数据手册上的设置,5mp和VGA分辨率的CSI clock还有hblank,vblank就是不一样的

以下是打印出来的i2c配置值:

  {0x3808, 0x2},

  {0x3809, 0x80},

  {0x380A, 0x1},

  {0x380B, 0xE0},

  {0x380C, 0x7},

  {0x380D, 0x68},

  {0x380E, 0x3},

  {0x380F, 0xD8},

0 Likes

另外还有,根据ov5640数据手册计算方法,denebola VGA@60fps的mipi时钟计算应该是:

24M/3*0x6f/2/2=222M才对,为什么工具当中配置的是315M呢?

0 Likes

我没有看过具体配置的参数,我这边拿 Demo 板测试看看。

0 Likes

另外还有,根据ov5640数据手册计算方法,denebola VGA@60fps的mipi时钟计算应该是:

24M/3*0x6f/2/2=222M才对,为什么工具当中配置的是315M呢?

我这里检查了1080P 下的配置参数,虽然和你 的 VGA 不一样,但是问题的本质应该是一样的。

从 示波器上来看,1080P时CX3 的MIPI CLOCK引脚上的时钟频率是 ~336 MHz(见下图)

1080p.bmp

另外抓取 I2C接口上的波形,获得PLL 相关寄存器的配置值,按照手册对输出的 MIPI CLOCK进行计算,得到的结果是:

1080P下的时钟频率 = 24/3*84/1/1/2 =336 MHz。

示波器测量到的 clock时钟和计算得到的理论输出吻合。所以,的确是工具中配置参数和板上实际参数不一致。

从个人角度来推测,这可能是模板工程没有更新。当用户使用 EZ-USB SDK 的配置向导生成新建工程时,可以选择基于配置模板生成。

后续我们这边会内部沟通解决这个问题,避免造成误解。

Update:

配置工具将在下一个版本SDK中一同更新,预计在下一quarter 前完成。

0 Likes

关键是你们官方给的配置通过configuration tool生成的2个配置值,一个能运行,一个不能运行(参考上面提出的问题里有)。这个让我们用户很迷茫,我这里只是想把ov5640的分辨率或者帧率降一下,无论如何都行不通

0 Likes

这个也是正常的。具体到你的问题,结论是:你所做的修改,使得 CX3 不能够正确地解析出行场信号,从而内部的状态机不能够正确跳转。

你可以在 Demo 板上用示波器测量得到这个结果。

对于 在 UVC 应用中的sensor来说,即使同样的分辨率、帧率、格式,不同的人配出的参数也不是 每个寄存器都是一样的。在满足 输出格式、分辨率以及帧率要求的前提下,也可以对部分寄存器进行微调。

对于 CX3 部分也是一样,你在 配置工具中看到的参数,也可以进行调整(在一定的区间内)。这里所说的 sensor 和 CX3 某些寄存器调整,涉及到 MIPI CSI 和 UVC 协议的了解。

这个配置工具存在的意义,是可以帮助用户在不了解 MIPI CSI 和 UVC 协议的背景下,快速搭一个 Demo出来,同时也可以用作 参数验证。我这里说的验证,指的是它可以帮助用户剔除肯定不能work的参数。而不是说,工具没有报错的参数就100%一定能够work(这个可能也是很难做到的)。在实际项目中,还需要 debug 过程。这其中就需要对 协议的了解 和经验,根据现象去调整。

再回到你所做的修改,和你所希望的“修改帧率或分辨率”并没有什么关系。因为要实现这个需求,你需要

1、 修改 sensor 配置以输出相应的分辨率或帧率。

2、 修改Frame descriptor 以及 probe structure

3、 利用工具检验参数

4、 Debug,根据现象做调整。

在这里你只修改了CX3 的PLL参数,没有修改其他地方,为什么认为一定会work呢?

我们前面说到,工具里给出的参数和实际的不一致(这一点是一个问题),所以,当你只 修改了 CX3 的PLL后,将会导致工具按照你看到的参数验证,给出通过的结果。而实际上,新的CX3 PLL参数已经和实际的sensor参数不匹配了。

这是有可能的。

要确认这一点的话,你可以尝试找出实际的sensor配置参数,用工具去验证下,看行不行。

0 Likes

我感觉你们的开发工具对我们这些初次接触MIPI摄像头并且没有sensor厂商的技术支持的学习者来说太残酷了,我也不确定我改过某些参数(比如sensor的PLL)之后sensor是否按照我的设定输出图像了,也不确定是否是CX3那里MIPI参数是否配置正确,这个完全没法进行下去了。另外,你们sdk自带的yuv422_ov5640.cycx那些csi clock/hblank/vblank参数值看起来就是随便给的,这个给我也带来不少的困惑

0 Likes

我感觉你们的开发工具对我们这些初次接触MIPI摄像头并且没有sensor厂商的技术支持的学习者来说太残酷了,

这个是你的主观感受,我这里就不评价了。不过,如果你是想学习使用 CX3,或者说 MIPI CSI 接口,或者说 UVC 设备开发,我可以给你些建议。你是可以将Denebola 板作为入手平台,先熟悉固件的流程,再熟悉 UVC协议等,后续再熟悉 MIPI 协议。涉及到 sensor 配置这一块,你不能期望Cypress 的工具替代 Sensor 厂商的职责,毕竟这是 NDA 的信息。

另外,你们sdk自带的yuv422_ov5640.cycx那些csi clock/hblank/vblank参数值看起来就是随便给的,这个给我也带来不少的困惑。

工具里的参数是和实际不一致,但是是不是“随便给的”有待确定。因为,对于1080P来说,按照那一套参数配出来的工程,的确是可以work的(参见 基于CX3的UVC摄像头应用学习笔记-二(建立工程模板) )。

顺便,很抱歉给你带来的困惑。如我前面所说,后面我们也会修复这个问题并进一步改进工具。

0 Likes

最终回复你的问题:

最近我腾出时间重新校正了前面所说的参数不一致的问题,下面截图所显示的是正确的sensor 参数(CX3 MIPI接口的参数不需要改变)。

所有参数我已经全部在 Demo 板上测试过,都没有问题。

Snipaste_2019-08-29_10-44-26.png

回到你对 VGA 所做的修改,可以看到你问题描述里的配置,FIFO delay 设置的太小了,改成大一些的值,就没有错误。

Snipaste_2019-08-29_10-46-05.png

Snipaste_2019-08-29_10-47-14.png

编译工程后下载固件到Demo板,经测试出图正常。

至此,此帖问题完全解决。

0 Likes

CSI clock应该不是实际的mipi时钟,因为我看到从分辨率5MP到VGA你们的CSI clock都是一样的,还有Hblank和Vblank也都是一样的,我觉得是不对的

这个想法没有什么道理。为什么不同分辨率不能使用同样的 CSI 时钟?不能使用同样的 H_blank 和 V_blank 值?

0 Likes

chummy he 撰写:

请问CSI clock是否指的就是MIPI clock,就是MCP和MCN差分时钟呢?

是的。

0 Likes
YangyangC_06
Employee
Employee
750 replies posted 500 replies posted 250 replies posted

chummy he 撰写:

你好:

     我使用denebola RDK并且尝试在640x480分辨率下,做了如下配置

pastedImage_0.png

生成的:

/* ov5640_YUY2_VGA :  */

CyU3PMipicsiCfg_t ov5640_YUY2_VGA = 

{

    CY_U3P_CSI_DF_YUV422_8_2,  /* CyU3PMipicsiDataFormat_t dataFormat */

    1,                          /* uint8_t numDataLanes */

    1, /* uint8_t pllPrd */

    90, /* uint16_t pllFbd */

    CY_U3P_CSI_PLL_FRS_250_500M, /* CyU3PMipicsiPllClkFrs_t pllFrs */ 

    CY_U3P_CSI_PLL_CLK_DIV_4, /* CyU3PMipicsiPllClkDiv_t csiRxClkDiv */

    CY_U3P_CSI_PLL_CLK_DIV_8, /* CyU3PMipicsiPllClkDiv_t parClkDiv */

    0,                 /* uint16_t mClkCtl */

    CY_U3P_CSI_PLL_CLK_DIV_2, /* CyU3PMipicsiPllClkDiv_t mClkRefDiv */

    640,         /* uint16_t hResolution */

    100                         /* uint16_t fifoDelay */

};

替换之前的配置:

/* Configuration parameters for VGA for the OV5640 sensor */

CyU3PMipicsiCfg_t cfgUvcVgaNoMclk =  {

    CY_U3P_CSI_DF_YUV422_8_2,       /* dataFormat   */   

    1,                            /* numDataLanes */   

    0x1,                          /* pllPrd       */   

    90,                           /* pllFbd       */   

    CY_U3P_CSI_PLL_FRS_125_250M,   /* pllFrs      */           

    CY_U3P_CSI_PLL_CLK_DIV_2,     /* csiRxClkDiv  */   

    CY_U3P_CSI_PLL_CLK_DIV_8,     /* parClkDiv    */   

    0x00,                         /* mclkCtl      */   

    CY_U3P_CSI_PLL_CLK_DIV_8,     /* mClkRefDiv   */   

    640,                          /* hResolution  */   

    0x01                          /* fifoDelay    */   

};

然后重新编译,运行,发现USB摄像头不能传送图片。串口终端循环打印:

DMA RESET

AplnStrt:SMState = 0x1

DMA RESET

AplnStrt:SMState = 0x1

请问我使用cx3 configuration工具配置的方法有什么问题吗?

你是在Demo 工程的基础上,只修改了这个 structure 是吗?

0 Likes