Skip navigation
Home > All Places > USB > USB Superspeed Peripherals > Blog > 2019 > April
2019

经过了第二篇笔记的学习,用户可以自行创建出一个支持视频流传输的UVC工程,其中 具体的 sensor/ISP 配置部分需要用户将获得的参数写入到工程框架中。但是,生成的工程下载到用户的硬件板中,并不是每次都能正确地出图。本篇笔记介绍在这种情况下,如何排查和解决这种问题。

 

从大的方面来讲,可以从硬件软件(固件,下同)两个方面进行排查。

 

首先来讲硬件方面可能的原因。

  • USB 部分原理图设计。主要检查 CX3 的 USB3.0 的 SSRX 和 SSTX 引脚是否正确地连接到了板子上的 USB 接口引脚上。 如果硬件设计中采用标准 USB 插座(这里特指母座,下同)和线缆,则 CX3 的 SSRX+/-  引脚需要接到 USB 插座的 SSRX+/- 引脚上(正负可交换),CX3 的 SSTX+/- 引脚需要接到 USB插座的SSTX+/-引脚上(正负可交换)。如果这里连接错误,则会导致 下载固件后 CX3 不能正确枚举为USB3.0 设备。

 

  • USB 部分PCB设计。关于这一部分的细则,用户可以参考AN70707,其中包含了应当遵守的设计细则。

 

  • PCB 板供电部分。用户需要确保上电后,各个电压域都稳定可靠。采用示波器对电压的波形和幅值进行检查。

 

  • 时钟部分。一般的,CX3需要 一个晶振或者时钟源提供必要的时钟输入,sensor 或者 ISP 同时也需要相应的时钟。用户需要检查这两种时钟是否都正常工作。另外,根据 CX3 的 datasheet, CX3 的 MCLK 可以对外提供时钟输出给 sensor。但是由于各种原因,即使在开发测试环节,也不建议使用此引脚。建议用户为sensor 设计独立可靠的时钟电路。

 

  • 检查是否正确枚举为USB3.0。因为 720P 和 1080P 的分辨已经极为常见,用户也通常以此分辨率入手搭建UVC相机,但是一般这都需要 CX3 工作在 USB3.0 模式下。经常的,CX3 的配置工具生成的代码中并没有 USB2.0 模式下的描述符信息和配置代码(如下图)。如果由于某些硬件设计原因,CX3无法枚举为 USB3.0 的设备,也就无法完成必需的初始化和视频推流。

BaiduShurufa_2019-4-2_14-20-4.png

Fig.1 USB2.0 描述符不可用的提示

 

  • 检查 CX3 datasheet中标明的 DNU 引脚是否接地。datasheet 中注明 DNU 的引脚需要悬空,禁止接地或高电平。以下的引脚禁止接地或高电平。

Table.1 CX3 DNU pins list

No.
Pin #Note

1

F10DNU
2F9DNU
3F7DNU
4G10DNU
5G9DNU
6F8DNU
7H10DNU
8H9DNU
9J10DNU
10H7DNU
11K11DNU
12L10DNU
13K10DNU
14K9DNU
15G7DNU
16G8DNU
17H8PCLK(Clock output from bridge)
18G6Hsync(Horizontal sync)
19H5Vsync(vertical sync)
20F1INT#
21K2DNU
22J4DNU
23K1DNU
24J2DNU
25J3DNU
26J1DNU
27H2DNU
28H3DNU

 

 

接下来谈谈固件方面可能的原因。

  • I2C 接口相关检查。一般的,CX3 会通过 I2C 接口将必需的配置参数写入到 sensor 中,用户需要确保这一步正确执行。首先,需要检查固件中是否设置了正确的 I2C 设备地址。因为很多 sensor 具有不止一个 I2C 地址,需要特别注意当前有效的地址是什么。其次,需要确保 sensor 正确进行了初始化并且 I2C 接口准备就绪,可以进行 I2C 通信。曾经有一个实际案例,sensor 在上电后 NAK 了所有的 I2C 写命令。通过查看datasheet,得知 sensor 的某个引脚为高,使得 sensor 处于 I2C 不可访问的状态。通过在固件中将此引脚拉低,使得 I2C 可写,解决了问题。最后,需要确保所有的 I2C 写命令被 sensor ACK,即全部写入成功。此处用户可以使用 逻辑分析仪 抓取整个过程中的 I2C 通信数据,与已知的 配置参数对比即可得到结果。也可以在固件中的 I2C 写命令后面添加 I2C 读命令,将寄存器中写入的值读取回来进行对比。

 

  • 检查 sensor 输出信号。正常来讲,在 CX3 通过 I2C 接口写入配置参数后,sensor 开始输出信号。用户可以用示波器检查 sensor 的 MIPI Data、Clock的输出是否符合预期。下图是实际测量的 sensor MIPI Data 引脚上的波形,光标 a 和 b之间代表一帧图像数据。此处,光标 a 和 b 之间的时间差是 33 ms,对应帧率为 30 fps。此处示波器的水平时间尺度一般在 10-20 ms左右,暂时只需要关注波形的轮廓,不必探究信号的细节。这里Data 是差分信号,可以用差分探头测量信号,也可以用普通的单端探头测量(下图即为单端测量结果)。

040327_022348.jpg

Fig.2 Sensor  MIPI data 引脚波形

相应的,也需要确认Clock 信号正确输出。这里 clock 可能有不同的形式,分别叫做 continuous(free running) 模式 和 gate 模式。关于 continuous 和 gate 模式,可 以 参照Fig.2 进行理解。从 Fig 2 可以看到,sensor 并非持续不断地输出数据,而是在一段时间输出后暂停,稍后继续输出。这种模式可以称为 gate 模式。MIPI clock 引脚也可以按照这种模式输出时钟信号,称为 gate 模式 clock信号。Gate 模式的  clock 信号与Fig.2 中的 data 信号有基本一致的信号波形,此处不再重复。而与之相反的模式称为 continuous 模式,即 clock 信号在上电后持续输出。此时 clock 的波形如 Fig.3, 为带有直流分量的,峰峰值大概100-200 mV的信号,需要调节示波器垂直分辨率仔细观察。

微信图片_20190321173750.jpg

Fig.3 Continuous 模式 clock 信号

     此处建议用户将 sensor 的 clock 设置为 gate 模式。

 

  • 检查描述符部分是否正确。一般采用 CX3 配置工具生成的固件,其中的描述符部分是正确的。如果用户基于其他工程修改,需要检查对应的描述符结构体是否正确。

 

  • 检查Probe描述信息是否正确。在系统上电后,host 会通过probe control 命令获知当前的 图像格式、分辨率、帧率以及每秒钟最大传输字节数等信息,需要确认此处 host 所获取的信息正确。可以通过 UART 打印输出相关的 log 信息辅助检查。另外,也可以用BUS HOUND, LeCory 或者 Ellisys 的 USB 协议分析仪抓取USB数据包进行分析。

 

  • 检查 MIPI 解析输出信号。一般的,当 CX3 连接到主机并且与主机之间正确完成枚举阶段的信息沟通后,就会在主机端的设备管理器呈现为USB相机。用户在 host 端打开看图软件,用其打开相机设备并且选择一种图像格式和分辨率的之后,CX3 会通过 I2C 接口像 sensor 写入相应的配置参数。之后 sensor 开始输出 MIPI 数据,CX3 的MIPI block 会解析输入的MIPI数据,并通过 H5/H8/G6 三个引脚输出内部使用的控制信号。CX3 内部的状态机根据这三个控制信号进行工作,这也是前面我们提到 禁止这三个引脚接固定电平的原因。 显而易见,将这三个引脚引出到 TEST 点将会极大地有益于 Debug 工作。因此,强烈建议用户将这三个引脚引出到测试点。 如下附图,为正常的PCLK、Vsync和Hsync 信号。

scope_3.png

Fig.4 Correct PCLK,Vsync and Hsync

scope_4(H_active).png

Fig.5 Zoom in of correct PCLK,Vsync and Hsync

 

  • 添加 UART信息打印。当用户测量到如上的信号并且还是不能正确得到视频流,可以在固件中添加相应的 UART 打印语句输出相关的 log 以便分析。注意,此处禁止用户在 DMA callback 函数调用 UART 打印语句,因为这样会阻塞正常的视频传输。

 

以上即为 CX3 UVC 开发阶段常见的 debug 的方法。