- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
你好:
我使用denebola RDK并且尝试在640x480分辨率下,做了如下配置
生成的:
/* 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工具配置的方法有什么问题吗?
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
这个也是正常的。具体到你的问题,结论是:你所做的修改,使得 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配置参数,用工具去验证下,看行不行。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
请问CSI clock是否指的就是MIPI clock,就是MCP和MCN差分时钟呢?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
还有,怎么计算CSI clock呢?是否这样子:
CSI clock=Htotal x VTotal X BPP(bit per Pixel) X frame rate / mipi data lane?
但是好像我这样子算出来的又不对
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
chummy he 撰写:
还有,怎么计算CSI clock呢?是否这样子:
CSI clock=Htotal x VTotal X BPP(bit per Pixel) X frame rate / mipi data lane?
但是好像我这样子算出来的又不对
你可以参考如下文档
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
chummy he 撰写:
你好:
我使用denebola RDK并且尝试在640x480分辨率下,做了如下配置
生成的:
/* 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生成的值改的
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
如果CSI clock就是差分时钟的话,我感觉你们cypress sdk自带的那个yuv422_ov5640.cycx,CSI clock应该不是实际的mipi时钟,因为我看到从分辨率5MP到VGA你们的CSI clock都是一样的,还有Hblank和Vblank也都是一样的,我觉得是不对的
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
你好:
Yang,能抽空回我一下吗?谢谢!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
你好:
Yang。我在工具下面只改了framerate参数
VGA 30fps
VGA 15fps
可以看到2者生成的数据完全一样,实际上在生成的C代码中也可以看到,确实完全一样
工具本身也没有提示什么错误,请问这个正常吗?我的SDK suite是1.3.4最新版本的,windows上运行
谢谢!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
chummy he 撰写:
你好:
Yang。我在工具下面只改了framerate参数
VGA 30fps
VGA 15fps
可以看到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?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
你好:
好像frame descriptor和probe structure中的数据真不重要,我把这2个结构体当中的数据改成30桢/15桢其它不改,VGA分辨率下可以看到你们的CX3同样可以返回60fps的图像数据,没有任何问题。看起来好像真正需要改的就只有CyU3PMipicsiCfg_t 结构中的数据,而上面你也看到了,30fps和15fps,你们的工具生成的数据都一样,这就让我很迷糊了。而且上面我也我试过60fps@VGA下面,修改上面这些PLL divder值,配置工具没有报错,只替换这个结构体的值,denebola不能出图像,测试hsync/vsync没有信号输出,终端循环报DMA reset错误。感觉你们的工具还没有完全完善
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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},
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
另外还有,根据ov5640数据手册计算方法,denebola VGA@60fps的mipi时钟计算应该是:
24M/3*0x6f/2/2=222M才对,为什么工具当中配置的是315M呢?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
我没有看过具体配置的参数,我这边拿 Demo 板测试看看。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
另外还有,根据ov5640数据手册计算方法,denebola VGA@60fps的mipi时钟计算应该是:
24M/3*0x6f/2/2=222M才对,为什么工具当中配置的是315M呢?
我这里检查了1080P 下的配置参数,虽然和你 的 VGA 不一样,但是问题的本质应该是一样的。
从 示波器上来看,1080P时CX3 的MIPI CLOCK引脚上的时钟频率是 ~336 MHz(见下图)
另外抓取 I2C接口上的波形,获得PLL 相关寄存器的配置值,按照手册对输出的 MIPI CLOCK进行计算,得到的结果是:
1080P下的时钟频率 = 24/3*84/1/1/2 =336 MHz。
示波器测量到的 clock时钟和计算得到的理论输出吻合。所以,的确是工具中配置参数和板上实际参数不一致。
从个人角度来推测,这可能是模板工程没有更新。当用户使用 EZ-USB SDK 的配置向导生成新建工程时,可以选择基于配置模板生成。
后续我们这边会内部沟通解决这个问题,避免造成误解。
Update:
配置工具将在下一个版本SDK中一同更新,预计在下一quarter 前完成。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
关键是你们官方给的配置通过configuration tool生成的2个配置值,一个能运行,一个不能运行(参考上面提出的问题里有)。这个让我们用户很迷茫,我这里只是想把ov5640的分辨率或者帧率降一下,无论如何都行不通
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
这个也是正常的。具体到你的问题,结论是:你所做的修改,使得 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配置参数,用工具去验证下,看行不行。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
我感觉你们的开发工具对我们这些初次接触MIPI摄像头并且没有sensor厂商的技术支持的学习者来说太残酷了,我也不确定我改过某些参数(比如sensor的PLL)之后sensor是否按照我的设定输出图像了,也不确定是否是CX3那里MIPI参数是否配置正确,这个完全没法进行下去了。另外,你们sdk自带的yuv422_ov5640.cycx那些csi clock/hblank/vblank参数值看起来就是随便给的,这个给我也带来不少的困惑
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
我感觉你们的开发工具对我们这些初次接触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摄像头应用学习笔记-二(建立工程模板) )。
顺便,很抱歉给你带来的困惑。如我前面所说,后面我们也会修复这个问题并进一步改进工具。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
最终回复你的问题:
最近我腾出时间重新校正了前面所说的参数不一致的问题,下面截图所显示的是正确的sensor 参数(CX3 MIPI接口的参数不需要改变)。
所有参数我已经全部在 Demo 板上测试过,都没有问题。
回到你对 VGA 所做的修改,可以看到你问题描述里的配置,FIFO delay 设置的太小了,改成大一些的值,就没有错误。
编译工程后下载固件到Demo板,经测试出图正常。
至此,此帖问题完全解决。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
CSI clock应该不是实际的mipi时钟,因为我看到从分辨率5MP到VGA你们的CSI clock都是一样的,还有Hblank和Vblank也都是一样的,我觉得是不对的
这个想法没有什么道理。为什么不同分辨率不能使用同样的 CSI 时钟?不能使用同样的 H_blank 和 V_blank 值?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
chummy he 撰写:
请问CSI clock是否指的就是MIPI clock,就是MCP和MCN差分时钟呢?
是的。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
chummy he 撰写:
你好:
我使用denebola RDK并且尝试在640x480分辨率下,做了如下配置
生成的:
/* 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 是吗?