在 USB 接口(包括传统的 Micro USB、USB Type-A 以及现在通用的 USB Type-C)中,D+ 和 D- 是极其重要的两条信号线。
结合你提到的产线维修、FPC(柔性电路板)折弯以及 Type-C 口不良的背景,以下为你详细拆解什么是 D+/D- 以及在产线/维修时如何具体进行测试。
一、 什么是 D+ 和 D-?
D+ (Data Plus)和D- (Data Minus)是 USB 2.0 协议中规定的一组差分数据信号线。
- 核心作用:它们负责在设备(如手机、嵌入式板卡)和主机(如电脑、U盘、OTG设备)之间传输数据和识别设备。
- 识别/握手:当设备插入时,系统通过 D+/D- 上的电平变化来识别是否有设备接入,以及设备是低速、全速还是高速设备。
- 数据传输:USB 读写文件、ADB 调试、刷机等,在 USB 2.0 速率下全靠这对双绞线。
- 充电协议握手:许多传统的快充协议(如 QC2.0/3.0,部分 BC1.2 标准)需要通过 D+/D- 线的电压“对暗号”来决定输出 5V、9V 还是 12V。
- 为什么叫差分信号?
- D+ 和 D- 传输的是大小相等、方向相反的电压信号(例如 D+ 为高电平 3.3V 时,D- 对应低电平 0V)。
- 接收端通过计算二者的差值(D+ 减去 D-)来判断数据是“0”还是“1”。这种设计能极大地抵消外界的电磁干扰。如果 FPC 受到折弯、拉扯导致这两条线其中一条断裂或断续,通信就会立刻失败。
二、 在产线与维修中,如何测试 D+ 和 D-?
根据你提到的“万用表/示波器量 Type-C 口 VBUS、D+/D- 通断”,在实际操作中,通常有以下几种递进的测试方法:
方法 1:用万用表测量“对地阻抗”(最常用、最快)
这是产线和维修判断芯片引脚、FPC、座子是否虚焊/断路最经典、最高效的方法。
- 测试准备:设备断电(拔掉电池和外部电源),万用表打到二极管档(Diode档,也就是蜂鸣器档旁边那个)。
- 测试方法:
- 将万用表的红表笔接板子的主地(GND)。
- 用黑表笔分别去点测Type-C 母座上(或 FPC 测试点上)的 D+ 和 D- 引脚。
- 结果分析:
- 正常情况:D+ 和 D- 的对地阻抗数值应该非常接近(通常在 300mV ~ 700mV 之间,具体取决于主控芯片和保护器件)。
- 数值为“1”或“OL”(溢出):说明断路(Open)。对应你的排查点:FPC 焊接虚焊、金手指折弯断线、或 Type-C 座子压接开裂。
- 数值接近 0(或蜂鸣器响):说明短路(Short)。可能是 D+ / D- 与旁边的 GND 短路,或者芯片内部被静电(ESD)击穿。
方法 2:用万用表测量“通断/电阻”(验证 FPC 物理链路)
当你怀疑“换 FPC 即好”是 FPC 自身的问题时,可以直接测线缆。
- 测试方法:万用表打到电阻档(Ω)或蜂鸣器档。一根表笔接 Type-C 座子的 D+ 焊接脚,另一根表笔接主板端接收芯片侧的 D+ 测试点。
- 结果分析:电阻应接近 0 欧姆;如果阻值很大或不通,说明 FPC 内部走线断裂,特别是折弯处最容易发生。
方法 3:用示波器测量“波形/电平”(用于深度分析)
如果万用表测阻值正常,但软件仍然报 OTG 错误或无法连接,就需要抓取动态信号。
- 测试准备:设备供电并开机,插入 USB 或者是触发 FactoryTest OTG 测试。
- 测试方法:示波器探头分别接 D+ 和 D-,地线接 GND。
- 结果分析:
- 正常情况:在设备插入的瞬间,可以看到 D+ 或 D- 有明显的电压跳变(比如从 0V 被拉高到 3.3V 保持,或者看到密密麻麻的连续方波数据包信号)。
- 异常情况:若一条线有波形,另一条线完全是死线(一条直线),或者波形严重变形、幅值不够,说明线路上有严重的寄生电容、阻抗不匹配、或者 FPC 处于“似断非断”的临界状态。
三、 结合你业务背景的维修建议
- 制作专属的“Type-C 测试小板(Fixture)”:
直接拿万用表表笔去扎 Type-C 母座内部细小的引脚很容易打滑甚至造成短路。产线维修通常会使用一个带有 Type-C 公头的引出小板(测试治具),把 VBUS、GND、D+、D-、CC1、CC2 等引脚引出来做成大测试点,方便员工用万用表快速点测。 - 重点看 CC 线和 D+/D- 的配合:
因为是 Type-C 口且涉及 OTG,Type-C 还有两根关键线叫CC1 / CC2(配置通道)。OTG 设备(如主控端)需要通过 CC 线上的电阻检测来决定自己是做 Host(给别人供电)还是 Device(被供电)。如果 CC 线断了,VBUS 甚至可能都不会输出电压;如果 CC 线正常但 D+/D- 断了,就会出现“能充电/能供电,但无法识别设备/无数据传送”的现象。
环节 状态
VBUS✅ 有(~5V,PD sink)
充电 online ✅ online=1, type=5
Type-C HAL ✅ ufp / device / connected=true
extcon 切 Device ❌ 没切
musb❌ 仍在 Host(hub_control)
代码里两条路都被堵了:
mediatek,bypss-typec-sink = <1> → PC 插入不走 Type-C SINK → set_role(DEVICE)
usb_is_online() 只认 type=4/6,不认 type=5 → psy 备用路径也不切 Device
一键快照
adb shell “date; getprop ro.build.type; getprop ro.debuggable” > usb_diag_base.txt
adb shell getprop | grep -iE “usb|adb|persist” >> usb_diag_base.txt
adb shell dumpsys usb >> usb_diag_base.txt
adb shell ps -A | grep -iE “adbd|usb” >> usb_diag_base.txt
adb shell ls -l /sys/class/android_usb/ 2>/dev/null >> usb_diag_base.txt
adb shell ls -l /config/usb_gadget/ 2>/dev/null >> usb_diag_base.txt
adb shell cat /config/usb_gadget/g1/UDC 2>/dev/null >> usb_diag_base.txt
adb shell ls -lR /config/usb_gadget/g1/ 2>/dev/null >> usb_diag_base.txt
adb shell ls -l /sys/bus/usb/devices/ >> usb_diag_base.txt
adb logcat -b kernel -d -t 500 | grep -iE “usb|musb|typec|tcpc|extcon|vbus|sc8989|chg|gadget|udc” >> usb_diag_base.txt
adb logcat -d -t 500 | grep -iE “UsbService|adbd|UsbDeviceManager|UsbPort|configfs” >> usb_diag_base.txt
$ adb shell dmesg | grep -iE “typec|extcon|vbus|musb|gadget|udc|connect|sc8989|role” | tail -80
[ 1154.802146] charger_thread: [__mtk_pdc_get_setting]watt:28800000,45000,5000000 up:0,1 vbus:9410000 ibus:5, mivr:0,0
[ 1154.802181] charger_thread: [__mtk_pdc_get_setting]vbus:9000:5000:5000 current:3000 idx:0 default_idx:1
[ 1154.803198] charger_thread: [mtk_chg_enable_vbus_ovp] en:1 ovp:12500000
[ 1154.820687] kworker/u16:0: pd_adapter pd_adapter: pd_tcp_notifier_call: sink vbus mv:5000, ma:3000, type:130
[ 1154.821037] kworker/u16:0: rt-pd-manager rt-pd-manager: pd_tcp_notifier_call sink vbus 5000mV 3000mA type(0x82)
[ 1154.977205] charger_thread: [__mtk_pdc_setup]idx:1:0:1:0 vbus:5000 cur:3000 ret:0
[ 1158.679760] binder:502_2: [MUSB]usb_spm_dpidle_request 3061: USB_DPIDLE_FORBIDDEN, skip_cnt<9>
[ 1158.679803] binder:502_2: [MUSB]usb_spm_dpidle_request 3054: USB_DPIDLE_ALLOWED, skip_cnt<9>
[ 1158.679833] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1158.769088] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1159.749090] binder:502_2: [MUSB]usb_spm_dpidle_request 3061: USB_DPIDLE_FORBIDDEN, skip_cnt<5>
[ 1159.749144] binder:502_2: [MUSB]usb_spm_dpidle_request 3054: USB_DPIDLE_ALLOWED, skip_cnt<5>
[ 1159.749182] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1159.855923] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1160.568494] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1160.681172] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1161.372276] binder:502_2: [MUSB]usb_spm_dpidle_request 3061: USB_DPIDLE_FORBIDDEN, skip_cnt<11>
[ 1161.372308] binder:502_2: [MUSB]usb_spm_dpidle_request 3054: USB_DPIDLE_ALLOWED, skip_cnt<11>
[ 1161.372330] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1161.440061] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1163.159046] binder:502_2: [MUSB]usb_spm_dpidle_request 3061: USB_DPIDLE_FORBIDDEN, skip_cnt<5>
[ 1163.159078] binder:502_2: [MUSB]usb_spm_dpidle_request 3054: USB_DPIDLE_ALLOWED, skip_cnt<5>
[ 1163.159100] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1163.159602] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1164.223158] charger_thread: [__mtk_pdc_setup]idx:0:0:1:0 vbus:5000 cur:3000 ret:-100
[ 1164.231542] kworker/4:2: mtk_charger_external_power_changed event, name:mtk-master-charger online:1 type:2 vbus:5350
[ 1164.237025] kworker/4:1: mtk-extcon-usb extcon_usb: online=1, type=5
[ 1164.239561] charger_thread: Vbat=4326 vbats=0 vbus:5360 ibus:1 I=1 T=-10 uisoc:86 type:std>std idx:0 ta_stat:0 swchg_ibat:0 cv:4352000 cmd_pp:-1
[ 1167.420321] binder:502_2: [MUSB]usb_spm_dpidle_request 3061: USB_DPIDLE_FORBIDDEN, skip_cnt<3>
[ 1167.420350] binder:502_2: [MUSB]usb_spm_dpidle_request 3054: USB_DPIDLE_ALLOWED, skip_cnt<3>
[ 1167.420371] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1167.535780] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1168.244787] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1168.379155] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1169.080095] binder:502_2: [MUSB]usb_spm_dpidle_request 3061: USB_DPIDLE_FORBIDDEN, skip_cnt<11>
[ 1169.080126] binder:502_2: [MUSB]usb_spm_dpidle_request 3054: USB_DPIDLE_ALLOWED, skip_cnt<11>
[ 1169.080149] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1169.195230] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1169.876056] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1169.996782] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1170.892514] binder:502_2: [MUSB]usb_spm_dpidle_request 3061: USB_DPIDLE_FORBIDDEN, skip_cnt<11>
[ 1170.892566] binder:502_2: [MUSB]usb_spm_dpidle_request 3054: USB_DPIDLE_ALLOWED, skip_cnt<11>
[ 1170.892605] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1170.893637] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1174.488325] kworker/1:2: mtk_charger_external_power_changed event, name:mtk-master-charger online:1 type:2 vbus:5300
[ 1174.496318] kworker/1:3: mtk-extcon-usb extcon_usb: online=1, type=5
[ 1174.498867] charger_thread: Vbat=4228 vbats=0 vbus:5130 ibus:0 I=0 T=33 uisoc:86 type:std>std idx:0 ta_stat:0 swchg_ibat:0 cv:4352000 cmd_pp:-1
[ 1174.506358] charger_thread: [__mtk_pdc_get_setting]watt:14500000,5000000,5000000 up:0,1 vbus:5150000 ibus:1000, mivr:0,0
[ 1174.506370] charger_thread: [__mtk_pdc_get_setting]vbus:9000:5000:5000 current:3000 idx:0 default_idx:0
[ 1174.506391] charger_thread: [__mtk_pdc_setup]idx:0:0:1:0 vbus:5000 cur:3000 ret:-100
[ 1174.525815] charger_thread: Vbat=4228 vbats=0 vbus:4940 ibus:0 I=-3 T=33 uisoc:86 type:std>std idx:0 ta_stat:0 swchg_ibat:0 cv:4352000 cmd_pp:-1
[ 1174.527444] charger_thread: [__mtk_pdc_get_setting]watt:14500000,5000000,5000000 up:0,1 vbus:4930000 ibus:1000, mivr:0,0
[ 1174.527459] charger_thread: [__mtk_pdc_get_setting]vbus:9000:5000:5000 current:3000 idx:0 default_idx:0
[ 1174.527486] charger_thread: [__mtk_pdc_setup]idx:0:0:1:0 vbus:5000 cur:3000 ret:-100
[ 1174.897026] binder:502_2: [MUSB]usb_spm_dpidle_request 3061: USB_DPIDLE_FORBIDDEN, skip_cnt<3>
[ 1174.897074] binder:502_2: [MUSB]usb_spm_dpidle_request 3054: USB_DPIDLE_ALLOWED, skip_cnt<3>
[ 1174.897110] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1174.997627] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1176.191905] binder:502_2: [MUSB]usb_spm_dpidle_request 3061: USB_DPIDLE_FORBIDDEN, skip_cnt<5>
[ 1176.191936] binder:502_2: [MUSB]usb_spm_dpidle_request 3054: USB_DPIDLE_ALLOWED, skip_cnt<5>
[ 1176.191959] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1176.260555] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1178.671844] binder:502_2: [MUSB]usb_spm_dpidle_request 3061: USB_DPIDLE_FORBIDDEN, skip_cnt<5>
[ 1178.671916] binder:502_2: [MUSB]usb_spm_dpidle_request 3054: USB_DPIDLE_ALLOWED, skip_cnt<5>
[ 1178.671973] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1178.697729] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1180.715136] binder:502_2: [MUSB]usb_spm_dpidle_request 3061: USB_DPIDLE_FORBIDDEN, skip_cnt<3>
[ 1180.715183] binder:502_2: [MUSB]usb_spm_dpidle_request 3054: USB_DPIDLE_ALLOWED, skip_cnt<3>
[ 1180.715218] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1181.013860] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1181.708323] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1181.725653] binder:502_2: [MUSB]usb_spm_dpidle_request 3061: USB_DPIDLE_FORBIDDEN, skip_cnt<7>
[ 1181.725741] binder:502_2: [MUSB]usb_spm_dpidle_request 3054: USB_DPIDLE_ALLOWED, skip_cnt<7>
[ 1181.803515] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1182.476140] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1182.476968] binder:502_2: [MUSB]musb_hub_control 374: port status 00000100,devctl=0x80
[ 1183.827660] charger_thread: Vbat=4324 vbats=0 vbus:5060 ibus:0 I=0 T=33 uisoc:87 type:std>std idx:0 ta_stat:0 swchg_ibat:0 cv:4352000 cmd_pp:-1
[ 1183.830240] charger_thread: [__mtk_pdc_get_setting]watt:14500000,5000000,5000000 up:0,1 vbus:5060000 ibus:1000, mivr:0,0
[ 1183.830275] charger_thread: [__mtk_pdc_get_setting]vbus:9000:5000:5000 current:3000 idx:0 default_idx:0
[ 1183.830331] charger_thread: [__mtk_pdc_setup]idx:0:0:1:0 vbus:5000 cur:3000 ret:-100