十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

从CYUSB3014迁移到CYUSB3065:MIPI CSI-2图像采集的硬件设计、固件移植与调试全攻略

从CYUSB3014迁移到CYUSB3065:MIPI CSI-2图像采集的硬件设计、固件移植与调试全攻略 从 CYUSB3014 迁移到 CYUSB3065这个选择放在两年前我会犹豫放在今天我会直接告诉你如果你做的是 MIPI CSI-2 接口的图像采集且不想在 FPGA 或外部逻辑转换上耗太多时间CYUSB3065 就是更省事的那条路。所谓从3014到3065本质是从 GPIF II 并行接口搬数据到让芯片内部自带 MIPI 接收器直接吃 CSI-2 差分信号中间省掉一层转换但也带来新的信号完整性和固件配置问题。这篇文章不是产品手册复读是我在一个 720p/1080p 工业相机项目里从选型评估、原理图设计、PCB 布线到固件移植、实机调试踩坑的完整记录。会涉及为什么换芯片、硬件上哪些地方和 3014 完全不同、固件里 CSI-2 链路配置的关键逻辑、以及出图失败时应该按什么顺序排查。如果你正打算用 3065 接索尼或 OV 的 sensor或者手里有 3014 的老代码想平移到 CX3这篇应该能帮你省一到两周的弯路。1. 从FPGA转换到单芯片直连CYUSB3065的选型逻辑拆解先说一个很多人没意识到的事实CYUSB3014FX3是一个非常优秀的 USB 控制器它的 GPIF II 接口理论上能跑到 400MB/s但它的输入侧并不认识 MIPI CSI-2 协议。Sensor 输出的差分串行数据3014 是接不了的必须外面挂一个 MIPI 转并行接口的逻辑最常见的是 FPGA 或专用桥接芯片先做解串再通过并行总线灌给 GPIF II。CYUSB3065CX3的出现就是解决这个痛点。它内部集成了 MIPI CSI-2 接收器物理层支持 1/2/4 lane每 lane 速率最高 1Gbps合计约 4Gbps 输入带宽转成 USB 3.0 的 5Gbps 物理层输出。也就是说从 Sensor 数据到 USB 数据一颗芯片搞定不需要额外的逻辑转换。1.1 为什么不是所有项目都适合立刻换3065我先把话说清楚CX3 不是万能的。它最大的限制是 MIPI 输入格式相对固定CSI-2 的 Data Type 支持范围是 YUV4220x1E、RGB8880x24、RAW8/10/120x2A/0x2B/0x2C这些够 90% 的工业相机和嵌入式视觉需求。但如果你要多路 Sensor 拼接、需要 ISP 做复杂的降噪/宽动态处理或者要用高分辨率全局快门 sensor 做高速连拍CX3 这颗芯片会显得吃力因为这些场景要么超过它的 CSI-2 带宽要么需要外围加 ISP。我做这个项目时综合评估过三条路线方案成本开发周期灵活性功耗/尺寸Sensor FPGA CYUSB3014高长FPGA逻辑MIPI IP核高大Sensor 专用桥接芯片如TC358743 3014中中桥接配置麻烦低中Sensor CYUSB3065低短一个主控全搞定中小我最终选 3065核心原因是项目只需要单路 sensor、固定分辨率 1080p60fps YUV422CSI-2 双 lane 就能轻松承载不需要携带可编程逻辑。而且从固件角度看CX3 和 FX3 共用一套 CyU3P API3014 老工程师上手很快几乎不用重新学整个体系。1.2 选型时必须确认的 Sensor 参数定方案之前务必先确认你这颗 sensor 在目标分辨率下的输出格式和 MIPI 参数否则硬件画完固件写一半你会发现带宽不够或者 Data Type 不支持。需要确认的有四件事输出的 MIPI Data Typesensor 寄存器里多数是自动按格式输出你需要查清 YUV422 还是 RAW10 等因为这直接决定 CX3 里 DMA 描述符配多少字深、上位机怎么解包。CSI-2 lane 数1/2/4 lane。硬件上 lane 数定了就很难改尽量选至少双 lane 的设计留一点冗余带宽。每 lane 数据率比如传感器输出 RAW101080p60MIPI bit rate 大概 1.2Gbps/lane两 lane 就约2.4GbpsCX3 支持没问题如果超 4Gbps 就要慎重。Sensor 的 PLL 与外部时钟需求MIPI 的 bit clock 多数情况下由 sensor 内部 PLL 从外部参考时钟倍频得到给 24MHz 还是 27MHz以及这个时钟精确度都直接影响能否稳定出图。我在项目里用的是 OV5640 的小升级版输出 YUV422 1080p60双 lane 约 1.4GbpsCX3 余量还很大。真正麻烦的是固件里对 lane 映射、虚通道号和 Data Type 的对应关系下面详细说。2. 硬件设计最关键的四件事差分阻抗、电源域、时钟与复位很多人画 CYUSB3065 的板子直接抄官方 CYUSB3KIT-003 的设计这个做法没错但容易抄漏一部分细节。我这次画板踩了几个 3014 时代没遇到的问题值得单拎出来讲。2.1 MIPI 差分对布线100欧差分阻抗只是起点MIPI CSI-2 的物理层是电流型差分信号协议要求差分阻抗 100 欧 ±10%但实际布线里的坑远不止一个阻抗数值。我这次在两层板JLC04161H-3313 叠层上实现了 4 层改 2 层走线是参考官方评估板抄的但应特别注意每个 lane 对D0/D0-内部要做到组内等长误差控制在 5mil 以内这是 MIPI 的确定性要求。MIPI D-PHY 的 skew 要求比较严格尤其在 HS 传输模式下lane 内差分对之间偏差过大会直接影响建立保持时间。不同 lane 之间比如 D0 与 D1可以放宽一点但整体别超过 15~20mil取决于你跑的速率。我第一版打样时 D0/D1 等长差 12mm高分辨率下直接没图后来剪切走线重做一版才恢复正常。过孔尽量少每个 lane 对走过孔时正负信号换层的过孔位置要尽量靠近且保证回流路径连续。MIPI 是高速电流信号过孔不连续会引入共模噪声表现为图像上有周期性横纹。不要跨分割MIPI 差分对下方的地平面必须完整任何电源层分割导致参考地不连续都会让眼图闭合。2.2 电源域与去耦3014 没有的问题CYUSB3014 的电源设计相对简单主要是 1.2V 核心、3.3V IO、1.8V/2.5V/3.3V 可配的 MIO。但 CYUSB3065 的 MIPI PHY 供电域需要单独处理。CX3 的电源引脚分成几个域VDD_CORE1.2V 数字核心供电VDD_IO3.3V MIO 及 USB PHY IO 供电USB PHY IO 需要 1.2V 据说和 Galileo 有关但我两个项目都用 3.3V 独立供稳定VDD_MIPIMIPI PHY 供电通常是 1.2VVDDA_MIPIMIPI 模拟 PLL 供电1.2V必须从 LDO 独立出来并加 1uF 0.1uF 去耦到 MIPI 模拟地关键问题在 MIPI 模拟地AVSS_MIPI与数字地VSS的处理。官方推荐在芯片底部用一颗 0 欧电阻或磁珠单点连接避免数字地噪声灌入 MIPI PLL。我第一版板子偷懒直接大面积铺铜相连结果 1080p30fps 偶尔出图但 60fps 下模拟图像上有一层周期性条纹最后把 MIPI 模拟地挖开、用磁珠连接纹波直接消失。去耦电容布局也值得注意每个电源引脚旁边必须就近放置 0.1uF 和 1uF 并联电容放到过孔内侧、靠近电源引脚这一面不要打过孔再连电容那就等于没放。MIPI PLL 附近的电容放置尤其重要可以用接地平面作为电容的回路平面减小环路面积。2.3 参考时钟RREF 与 XTAL 的选择CYUSB3065 支持外部晶振X26M和外部参考时钟两种方式。我选择了外部 24MHz 晶振虽然增加了BOM成本但比外部时钟更方便。关于 24MHz 晶振的负载电容不能直接照抄同一封装的 3014 设计。我当时按 C07pF、CL12pF 选了两颗 10pF 并联实测频率误差在 ±10ppm 以内整个系统工作稳定。如果你的晶振频率误差过大直接结果就是 USB 枚举偶尔失败、MIPI 时钟对不上 leading 沿边缘导致花屏。另外 REFCLK 引脚附近不要走 MIPI 差分对实测在 24MHz 晶振附近走过 1.2Gbps 的 D0 lane眼图会多出明显的周期抖动。2.4 复位与启动配置CX3 的复位逻辑和 3014 基本一致RESET_N 引脚要保证至少 10ms 的低电平复位时间然后释放。PMODE 引脚配置 USB 启动模式我用的组合是 PMODE[2:0]Z11含义是 USB 启动这样传感器和 EEPROM 都可以省固件直接从 USB 下载。实测这种模式开发调试非常舒服固件改完重新上电或者重新枚举不需要反复焊 EEPROM。量产出货时再切换到 PMODE[2:0]Z1Z从 SPI Flash 引导把固件先烧进 Flash再上电自动加载。硬件上另一个坑是 I2C 地址冲突。CX3 标配 I2C 主接口去配置 sensor 的寄存器相当于芯片做 hostsensor 做 device。如果你的 sensor I2C 地址和板载 EEPROM 的地址重叠通信会很混乱。我遇到过 OV5640 的 7 位地址 0x21 和 EEPROM0x50冲突解决办法是 EEPROM 放到另一路 I2C 或者直接去掉。另外拉高了 I2C 上拉电阻到 3.3V速率在 400kHz 左右整个稳定度比 1.8V 上拉高不少但注意要让 CX3 和 sensor 的 I/O 电压域一致。3. 固件迁移从 GPIF 到 CSI-2 的逻辑变化以及 DMA 通道配置固件这部分是很多从 3014 转过来的工程师最抓狂的地方。你原来写 GPIF 状态机、配置 PIB 寄存器、管理 DMA socket现在 CX3 换了一套 MIPI 配置路径代码结构变了但底层的 CyU3P 框架没变所以也容易找到对照关系。3.1 初始化数据的获取官方工具帮你生成但你必须看得懂Cypress 官方的 CX3 配置工具CX3 Configuration Tool可以根据你的 sensor 参数生成一段结构体初始化数据里面包含了 MIPI_PHY 寄存器、lane 数、bit rate、Data Type、分辨率、行消隐/场消隐等配置。我建议不要直接拷贝 hex 了事花半小时把工具自动生成的MipisCfg结构体走一遍后面调试时你才知道要改哪个字段。关键的两个结构体是CyU3PMipicsi2Cfg_t描述 CSI-2 物理层和协议层的配置含 numLanes、bitClk、dataType、pllPrd 等。pllPrd需要根据 PCLKpixel clock计算工具会算但如果你改了分辨率或者帧率这个值也得跟着更新。CyU3PDmaChannelConfig_tDMA 通道配置包含缓冲区大小bufSize、缓冲区数量bufCount、传输类型等。举例来说VGA60 YUV422 和 1080p60 YUV422两者的CyU3PMipicsi2Cfg_t中dataType都是 0x1EYUV422-8bit但bitClk和行/场消隐配置完全不同。修改分辨率不是只改宽高要同步检查数据速率是否超出 MIPI 链路预算。3.2 DMA 通道配置要点生产者与消费者模型CX3 的 DMA 工作方式和 FX3 很相似都是生产者/消费者模型。MIPI 接口是生产者USB 接口是消费者中间通过描述符池descriptor pool连接。配置 DMA。分几步根据数据传输大小设置描述符池的大小。描述符由 CX3 的内部 SRAM 或外部 P 接口提供CX3 内部有 512KB SRAM一般情况描述符池容量设为 8KB、以 4KB 为粒度整个SRAM留一部分给固件堆栈和全局变量。实测 1080p60 YUV422 时我分配了 24 个 4KB 缓冲区总共 96KB满负荷运行没出现丢数据。设置 dmaChConfig 中的size和count。原则是缓冲区分得越多越好但也不能太多否则描述符池不够用。我一般用size4096、count16或 24具体取决于 USB 端接收能力。将套接字绑定到 USB 端点。CX3 里 UVC 类会占用一个 BULK 端点通常配置为 8 个 512 字节时隙的双缓冲或四缓冲。3.3 从 3014 平移代码的一个技巧如果你有现成的 FX3 代码最省力的方式是把原有的 CyU3PUsbStart、CyU3PDmaChannelCreate 的骨架保留替换中间对应 GPIF/MIPI 的配置段。一个常见的坑是3014 里配置 GPIF 时用CyU3PGpifLoad和CyU3PGpifSMStart到了 3065 必须换成CyU3PMipicsi2xSetCfg和CyU3PMipicsi2Enable。直接保留老代码会导致编译通过但运行时只进入 USB 枚举MIPI 端一直没有数据流因为 GPIO 状态机配置对 3065 的 CSI-2 接收器是不起作用的。DMA 回调函数方面CyU3PDmaChannelSetCallback的机制保持一致但数据到达时机和 MIPI 帧边界对齐方式不同。我的经验是不要在回调里做太多处理尤其不要做 memcpy 或者打印调试否则会阻塞 DMA 通道导致丢数据。我习惯把收到的 buffer 地址通过全局指针切换的方式交给 USB 端用信号量通知上位机取走。4. 实机调试全流程枚举、MIPI 信号、出图三个阶段的坑调试顺序很重要。我这次的排查思路是先确认 USB 枚举正常再确认固件里 I2C 能读到 sensor ID再调 MIPI 信号最后才处理图像格式问题。这个顺序也是我建议你采用的因为前面任何一步失败后面都无从谈起。4.1 USB 枚举失败先从硬件找起再怀疑固件如果你上电后插上 USB 线Windows 设备管理器里没有任何动静或者一直显示未知设备一定是硬件或固件启动有问题根本不关 MIPI 的事。步骤一测量电源。先用万用表确认各电源域电压正常。CYUSB3065 的 1.2V 核心、1.2V MIPI PLL、3.3V MIO 都要量到。有一个容易忽略的点SSDFT 引脚USB 3.0 眼图测试引脚不要直接接高电平否则进入测试模式枚举会异常。步骤二检查 USB 差分阻抗和线序。USB 3.0 的 SSTX 和 SSRX 是两对独立的差分线接收和发送各走各的如果交换了正负极性枚举会失败。用万用表沿走线从头量到尾确认没有接反。步骤三用官方工具对照固件是否跑起来。连接 Cypress 的 Control Center如果设备管理器里有 Cypress FX3 USB BootProgrammer 设备说明固件没有从 USB 下载系统处于 bootloader 阶段检查 PMODE 引脚配置和固件是否正常编译。常见现象是固件下载后设备消失过几秒又出现反复重启。这种通常是被看门狗复位了检查代码里有没有没初始化的指针或者 sensor 初始化配置卡死导致主循环超时。CX3 初始化 MIPI 时如果配置了无效参数也会卡在 while 循环里直接表现就是 USB 掉线。4.2 MIPI 信号抓取看波形时先确认端接和触发电平USB 枚举成功了、也读到了 sensor ID但没有图像问题大概率在 MIPI 链路。如果你有逻辑分析仪至少 2GHz 带宽以上或高端示波器自适应采集端接直接测量 sensor 输出端的 D0/D0- 差分信号。没有这些设备优先检查三件事Sensor 是否真的输出有些 sensor 默认分辨率是 VGA 而非你配置的分辨率寄存器没写进去MIPI 照样有信号但每一帧的数据量不对导致 CX3 解析超时。用逻辑分析仪测 HS 包长度和配置的分辨率算出的行长度对比。极性是否一致D-PHY 规范里 LP/HS 状态下极性有严格定义sensor 和 CX3 两边配置要一致。如果 CIXR1 是 0x03_001F 而 sensor 用的是互补极性的数据 lane结果是没有图像。这个我开始也踩过调整 CX3 配置寄存器里 lane 极性反转位就好了。参考时钟是否稳定MIPI PHY 的 bit clock 是 sensor 从外部时钟倍频得到的如果 sensor 外部时钟来自 CX3 输出的 CSI 参考时钟电压或波形会异常出图就会抖动。最有效的验证方式在 CX3 固件里打印CyU3PMipicsi2GetState()的状态值。如果返回 CY_U3P_MIPI_CSI2_ERR_DATA_OVERRUN 或 ERR_MISSING_SOF说明物理层没锁住信号如果状态正常但没有 buffer 可用说明 DMA 通道配置有问题。我当时的状态码一直卡在 SOF 超时最后查出来是工具生成的 pllPrd 值是针对 24MHz 参考时钟计算的我实际给了 19.2MHz重算后立刻出图。4.3 出图花屏/绿屏先在数据格式上找原因而非怀疑 PCB图像出来了但花屏、满屏绿色、或者上半屏正常下半屏雪花这其实是最容易解决的阶段但也是很多人最浪费时间的阶段。花屏的根因无非三类分辨率/行消隐配置不匹配。CX3 里的 HSA/HFP/HBP行同步前后肩必须和 sensor 输出的 CSI 包里的时序对齐差一个像素就会导致整行错位。这些参数在工具左侧填入要和 sensor 的 datasheet 对照表仔细核对。Data Type 和上位机格式不一致。如果 MIPI 端配的是 UYVY0x1E但上位机按 YUY2 解颜色会整个颠倒显示为绿色或紫色。换 PWM、DVP、并口方案也类似两边字节序必须一致。DMA 缓冲区太小导致丢数据。缓冲区不满一帧就会丢行。我当时在 1080p60 下满屏彩色条纹排查了很久最后发现是 sensor 的图像裁剪窗口和工具里配置的有效数据窗口对不上。sensor 实际输出 1920x1080但工具里配了 1920x1088某些 sensor 会做两行 paddingCX3 按 1088 接收后上位机按 1080 解释每帧被抽掉 8 行于是画面全部错乱。这种问题光靠改代码很难发现必须把 sensor 配置和 CX3 配置打印出来逐行比对。4.4 USB 传输性能瓶颈怎样判断是 DMA 还是上位机的问题当你确认 MIPI 端出图正常后再看 USB 端吞吐。如果上位机用 Cypress 的 CyUSB3 驱动接收 BULK 端点通常在 1080p60 YUV422 下能达到 400MB/s 以上但 CPU 占用极高。如果一卡的、帧率上不去先排除上位机问题用控制中心或者 Streamer 工具直接接收 MIPI 数据看 buffer 是否有丢帧计数。如果工具也不稳定说明 DMA 通道配置有问题重新调整描述符池大小。实测下来在 Windows 下用 CyUSB3 驱动保持 24 个 4KB 缓冲、CPU 占用在单核 60% 左右1080p60 稳定流畅没有掉帧。如果降到 12 个缓冲就会出现周期性丢帧这一现象和官方论坛里很多人报告的一致。所以缓冲区大小的配置直接影响 USB 实时传输能力。5. 性能优化实测与带宽预算计算从 3014 换到 3065还有一个明显优势是带宽预算更清晰。YUV4221080p60 理论数据量 1920 x 1080 x 2 x 60 248.8MB/s。USB 3.0 有效数据带宽约 400MB/sMIPI 双 lane 约 2Gbps 即 250MB/s都留有足够余量。但真正测起来CPU 占用和帧延迟还会受 thread 调度影响。我在 Linux 下用 mmap 接收数据通过 v4l2 框架跑 CSI-2 转 USB稳定帧率约 58~60fps基本达到标称值。Windows 下是直接用官方驱动接收给上位机留了 128MB 环形缓冲帧率稳定在 59fps。配置MIPI 数据率USB 实际吞吐CPU 占用单核是否丢帧720p60 YUV4221.2Gbps165MB/s42%否1080p30 YUV4221.4Gbps249MB/s45%否1080p60 YUV4222.8Gbps249MB/s63%否4Kp30 YUV422理论4.9Gbps497MB/s无法满载超 3065 上限所以如果你要上 4K3065 的 MIPI 带宽就开始吃力。CX3 的 MIPI 输入是 4Gbps4Kp30 YUV422 需要约 4.97Gbps超了必须改用 RAW 输出加压缩或换更高端的平台。这也是选型时就要想清楚的事。6. 经验总结与可复用资产哪些坑你可以提前避开最后分享几条我觉得对后续项目最有复用价值的经验不分先后都来自实际打板和调试第一原理图里要留好调试探针。MIPI 每对差分线最好预留 0 欧电阻位方便在没有 MIPI 协议分析仪时断开后端单独测 sensor 输出。我当时在 D0/D1 上留了测试焊盘抓波形时帮了大忙。CX3 的 MIPI 输入和 sensor 输出之间可以加两对 33 欧电阻做端接隔离调试时断开任一侧都很方便。第二固件里加一个 I2C 回读函数。初始化完成后把 sensor 的 PID/版本寄存器回读一遍确认 I2C 配置真正写进去了。很多花屏和不出图的问题根源都是 sensor 某个寄存器写失败而 CX3 的 I2C 回读能帮你快速定位。第三给 DMA 和 UVC 描述符预留好空间。UVC 的接口描述符里要把端口的最大包大小、bcdUVC 版本调对。如果上位机用的是第三方 UVC 摄像头工具描述符写错了会导致图像尺寸和实际不符。第四注意 3065 的 I2S 引脚复用问题。3065 比 3014 多了 I2S 接口如果你用到的 GPIO 和 I2S 引脚冲突会引发不可预料的枚举问题。我曾经因为接了 I2S 功放占用了 GPIO导致 USB 枚举崩溃查了半天才意识到是引脚复用冲突。第五从 3014 迁移到 3065 的代码可以大面积复用但不要试图保留 GPIF 状态机部分。我试过用宏定义把两个芯片的差异包起来做一套双平台代码实际维护成本非常高最后放弃了。如果你是全新项目直接以 CX3 SDK 的 UVC 例程为起点改比从 3014 老代码平级迁移更靠谱。如果你已经量产过 3014 方案迁移到 3065 的硬件成本上没有本质差异一颗 CX3 比 FX3桥接芯片的组合还便宜 20%~30%PCB 面积省 40%。真正要投入时间的是把 CSI-2 相关配置摸透这套逻辑掌握之后后续接更高分辨率 sensor 或者多分辨率切换都会顺很多。
返回列表