1. 拆解标题:USB转I2C、Scan和1000KHz分别是干什么的
平时在群里看人发这种命名特别长的工程标题,第一反应往往是"哪家工具软件导出的文件名"。但"USB TO I2C_(Excel)_Scan ---- 1000KHz总线速率测试_A"这种写法,其实是一种非常标准的调试验证项目命名习惯,每一段都对应一个明确工程意图:USB TO I2C说明工具链构成,Excel说明数据记录方式,Scan说明要执行的操作,1000KHz总线速率测试是本次要验证的核心指标,最后的_A则是版本或批次标识。这篇文章就围绕这个标题,把从硬件准备、协议细节、实操步骤到问题排查的完整链路讲清楚。适合正在做嵌入式驱动开发、硬件调试,或者刚买了USB转I2C适配器但不知道怎么用的工程师参考。
1.1 USB转I2C不是USB转串口,别把角色搞混
先解决一个很常见的误区:USB转I2C和USB转串口(USB转UART)虽然都是利用USB接口做协议转换,但本质完全不同。USB转串口芯片比如FT231X,内部是把USB包转成UART的TXD/RXD电平信号,I2C的SCL和SDA时序它根本产生不了。而USB转I2C适配器内部通常有一颗带协议引擎的芯片(比如FT232H的MPSSE引擎、或者专用I2C控制器),由它把主机侧下发的命令解析成真实的I2C起始条件、地址帧、数据和停止条件,SCL和SDA各占一根引脚,配上漏极开路结构的上拉电阻工作。
这个区别在调试时特别关键。我见过不止一次,有人拿USB转TTL线去接传感器模块的SCL/SDA,结果自然是一点反应都没有。你在链路上扮演的角色是I2C主控制器(Master),而不是简简单单把电平引出来。标题里的"USB TO I2C",准确描述的就是这个从PC到I2C总线的桥接工具,它是后面所有扫描和速率测试动作的物理基础。
那为什么要用USB转I2C工具来做测试,而不是直接用单片机的I2C外设呢?这里有个很实在的理由:单片机的I2C从机地址、速率都是写在固件里的,改一次参数就要重新编译烧录,效率太低。USB转I2C工具配合上位机软件,可以随时改速率、随时扫地址、随时观察波形,特别适合在项目初期验证"总线上到底挂了哪些设备""这些设备能不能接受更高频率"。很多工具软件还支持把扫描结果导出成CSV或Excel,这就是标题里Excel那一项的实际来源。
1.2 1000KHz其实是I2C的Fm+模式,为什么非要拉这么高
I2C协议标准的速率等级,很多人只记得100KHz和400KHz,其实还往上还有几档:标准模式(Standard Mode)100KHz,快速模式(Fast Mode)400KHz,快速模式+(Fast Mode Plus,简称Fm+)1MHz,高速模式(High-speed Mode)3.4MHz。标题里的1000KHz,正好就是Fm+模式的标称最高速率,换算下来是1MHz。
那什么场景会逼着你非跑到1MHz不可?我自己的经验主要有三类:第一类是图像传感器和高分辨率触摸屏,数据量一大,400KHz下读一帧图像要几十毫秒,拉到1MHz能明显缩短采集时间,比如GT911这类触摸控制芯片,在刷新率要求高的场景下就希望总线上跑得更快。第二类是系统启动时间敏感的设备,上电时要依次初始化多个传感器,总线速率翻倍,初始化时间差不多能砍掉一半以上。第三类是调试阶段想提前摸清楚设备能否支持更高频率,为后续产品升级留余地。
但要注意,1000KHz不是随便把SCL频率改大就完事的。Fm+模式对时序参数、上升时间、总线电容都有更严格限制,硬件上拉电阻也要重新算,这些我们放到第2节和第3节详细讲。先把结论放在这里:能稳定跑400KHz的电路,照搬去跑1MHz大概率会出问题。
2. 硬件准备:跑1MHz之前先把这几样东西算清楚
别急着插上适配器就开扫,硬件链路是影响1MHz成败的第一个环节。很多人低速一切正常、一上高速就掉设备,问题往往出在适配器本身或者上拉电阻上,而不是你写的测试脚本。这一节把选型、计算和布线三个最容易踩坑的地方一次说透。
2.1 适配器选型:便宜工具多半被驱动卡死在400KHz
市面上USB转I2C工具价格从几十到几千都有,但有一点你得接受:能不能跑到1000KHz,不只看芯片硬件能力,更看厂商驱动和上位机软件是否开放速率设置。有些几十块钱的小工具,芯片本身也许有潜力,但官方工具软件里根本没有速率选项,或者最高只给你选400KHz,这就是被驱动锁死了,你再怎么努力也上不去。
我在实际测试中比较常用的是基于FT232H芯片的适配器,配合LibUSB/D2XX驱动,通过配置MPSSE时钟分频可以比较容易地把I2C速率设到1MHz甚至更高。pyftdi这个Python库更是直接把FT232H封装好,几行代码就能配出指定频率的I2C主控制器。如果是专业一点的场景,Total Phase的Aardvark这类工具也支持1MHz,而且上位机软件带图形化扫描界面,调试起来更直观,但价格也高。
选型时给个建议:先确认你手上的工具软件或驱动库是否支持可配置频率。如果不确定,就直接拿一套已知能跑到1MHz的环境(比如FT232H+pyftdi)先验证总线上设备能不能接受,再回来决定要不要买专业工具。如果你只是偶尔调试,FT232H方案性价比很高;如果是产线长期使用,那专业工具自带的批量记录和报表功能会更省心。
2.2 上拉电阻计算:4.7K在1000KHz下真的会翻车
I2C的SCL和SDA都是漏极开路结构,输出高电平完全靠外部上拉电阻把线路拉上去。这就带来一个关键问题:上拉电阻越大,RC充电时间越长,信号上升沿越慢。而速率越高,允许的上升时间就越短。低速下用4.7K甚至10K上拉都没事,因为100KHz模式允许最长1000ns的上升时间;到了1MHz的Fm+模式,上升时间上限直接砍到120ns,4.7K上拉在常规总线电容下根本来不及把电平拉上去,对应设备自然就识别不到了。
上拉电阻的选值有一套标准公式,最小值和最大值要同时满足。最小值由器件灌电流能力决定:Rmin = (VDD - VOLmax) / IOL。以3.3V供电的Fm+模式为例,VOLmax取0.45V,IOL取3mA,算出来是(3.3 - 0.45) / 0.003,约等于950Ω,工程上取1K比较合适。最大值由上升时间和总线电容决定:Rmax = trmax / (0.8473 × Cbus),Fm+下trmax取120ns,如果总线电容是100pF,算出来大约是1.4K。所以1MHz场景下,上拉电阻的合理区间大约在1K到1.4K之间,我实测下来用1.2K最稳妥。
不同速率下的上拉推荐值我总结过一张表,方便大家抄作业:
| 速率模式 | SCL频率 | 最大上升时间 | 典型总线电容 | 3.3V推荐上拉 | 5V推荐上拉 |
|---|---|---|---|---|---|
| 标准模式 | 100KHz | 1000ns | 200pF~400pF | 4.7K~10K | 4.7K~10K |
| 快速模式 | 400KHz | 300ns | 100pF~400pF | 2.2K~4.7K | 2.2K~4.7K |
| 快速模式+ | 1000KHz | 120ns | 不超过100pF | 1K~1.4K | 1.5K~2.2K |
最后一行5V下推荐1.5K~2.2K,是因为Rmin算下来约1.55K,太小的电阻会超出器件灌电流规格。实际情况里还要看你总线上各从设备的数据手册,确认它们在Fm+下推荐的上下拉范围,取一个交集来定。
2.3 线材、供电与总线电容:1MHz最怕"长线+大电容"
确定上拉电阻之后,还有一个比电阻更隐蔽的瓶颈:总线电容。I2C信号线的寄生电容来源很多——杜邦线每根大概有几十pF(质量差的甚至更高)、PCB走线、芯片引脚电容、保护器件电容。Fm+模式下规范要求总线电容不超过100pF,这就意味着你不能像低速调试那样随便拉一根几十厘米长的杜邦线去接设备。
我自己在测试1MHz时踩过很深的坑:用一根20厘米左右的杜邦线连接传感器模块,扫描结果时好时坏,换短一点的线立马就稳了。后来用示波器观察,长线状态下SCL上升沿明显变缓,到了高电平门槛的时间拖得很长,数据建立时间被吃掉,设备当然就偶发失联。所以跑1MHz的现场,建议所有I2C信号线控制在5到10厘米以内,能做PCB就做PCB,实在不行也要用最短的杜邦线,并且尽量让SDA和SCL两根线靠近地线,减少串扰。
供电问题比电容更容易被忽视。很多USB转I2C工具可以从USB取电输出3.3V或5V给目标板,但USB口供电能力有限,如果目标板上还带着电机、屏幕这类耗电部件,电压一跌,从设备逻辑电平就不稳定,I2C通信自然跟着出问题。我的建议是:给目标板用独立稳压源供电,适配器只负责I2C信号连接,两边共地即可。电平也要特别注意,I2C不是电平标准协议,它只认"低于某个阈值算低电平",如果你的适配器输出3.3V,但总线上挂着5V设备,必须加电平转换芯片(如PCA9306),否则一旦把5V设备的引脚直接接上去,轻则通信失败,重则烧掉适配器。
3. I2C协议细节:1000KHz下时序要求到底严格在哪里
要跑通1MHz,光会接线还不够,得理解协议层面为什么1MHz会"容易翻车"。这一节把Fm+模式的时序参数和总线扫描原理讲清楚,后面排查问题的时候你就能顺着原理一步步追,而不是靠瞎试。
3.1 Fm+时序参数对照:一眼看出1MHz和400KHz的差距
I2C协议对信号时序有一整套硬性要求,每个参数都有最小或最大值。到了Fm+模式,很多时间参数缩短到几百纳秒甚至几十纳秒量级,这对主控制器和从设备的响应速度都是考验。下面是Fm+模式(1000KHz)和快速模式(400KHz)几个核心参数的对照:
| 参数 | 含义 | 400KHz(Fast) | 1000KHz(Fm+) |
|---|---|---|---|
| tLOW | SCL低电平时间 | 最小1300ns | 最小500ns |
| tHIGH | SCL高电平时间 | 最小600ns | 最小260ns |
| tSU;DAT | 数据建立时间 | 最小100ns | 最小50ns |
| tHD;DAT | 数据保持时间 | 最小0ns | 最小0ns |
| tSU;STA | 起始条件建立时间 | 最小600ns | 最小260ns |
| tSU;STO | 停止条件建立时间 | 最小600ns | 最小260ns |
| tr | 信号上升时间 | 最大300ns | 最大120ns |
| tf | 信号下降时间 | 最大300ns | 最大120ns |
| 总线电容 | 最大负载电容 | 400pF | 100pF |
对比一下就能明白:1MHz的时钟周期是1us,低电平只有500ns,高电平只有260ns,整个信号窗口比400KHz缩了一半还多。如果外围上拉电阻选大了、线材长了,上升沿一慢,主控制器发出数据后可能还没等从设备采样,电平就已经开始变化,从设备采到错误数据,ACK校验自然失败。
还有一个容易忽略的点是数据保持时间tHD;DAT,在Fm+模式虽然最小是0ns,但规范里同时给了一个推荐值——CMOS电平和TTL电平下推荐至少300ns或450ns的数据保持时间。这意味着主控发出的数据从SCL下降沿开始要维持一段时间别变,对于USB转I2C适配器来说,这个参数通常是靠协议引擎内部逻辑保证的,一般不用你操心。但如果你是用单片机GPIO模拟I2C去跑1MHz,务必在代码里加上几十到几百纳秒的延时,不然很容易偶发数据错误。
3.2 Scan总线扫描原理:为什么一个地址只要9个时钟就能测完
再说回标题里的Scan。I2C总线扫描的核心思路非常朴素:主机依次向总线上可能的从设备地址发送一个地址帧,如果某个地址真的有设备在监听,这个设备会在第9个时钟周期把SDA拉低,产生一个ACK;如果没有设备,SDA保持高电平,就是NACK。主机收到NACK就知道对应地址是空的,马上进入下一个地址。
一个地址帧的结构是:起始条件(START)占1位,7位从机地址占7位,读写标志位占1位,应答位占1位,总共10个位周期。理论上在1MHz下扫完整个7位地址空间(0x00到0x7F共128个地址)只需要1280个位周期,也就是1.28毫秒左右。但实际工具软件扫描不会这么快,因为每次地址无应答后还要发停止条件,并且软件层还要做状态机切换和结果记录,所以实际扫完一次通常在几十到几百毫秒。即便如此,也比用单片机固件写死一个地址再去试要高效太多了。
扫描时要注意地址范围不是整个0x00~0x7F都能用。I2C规范里0x00是通用呼叫地址,0x01是起始字节,0x02保留,0x78~0x7F保留用于10位寻址和其他特殊用途。所以常规扫描只需要覆盖0x03到0x77就够了。另外很多传感器芯片在数据手册里给出的是8位地址(例如0xAE、0x5C这类带读写位的写法),扫描工具里填的通常是7位地址,这两个概念千万别搞混,否则你对着手册找半天,扫出来的地址却对不上,你会以为设备坏了,其实是进制和位宽理解错了。
4. 实操复现:用USB转I2C工具完成扫描与速率测试
理论部分说完,开始动手。这一节完全按照我实际测试的流程走一遍,从设备连接到配置、扫描、验证到最后生成Excel报告,每个步骤都给出可以直接复制的方案。我以FT232H适配器加pyftdi库为例,因为这套方案便宜又好复现;如果你用的是其他工具,流程和判断逻辑是一样的,只是菜单或函数名不同。
4.1 测试环境清单与连接方式
先列一下我这次测试用到的清单,供你对照准备:
- 主机:普通Windows笔记本,装了Python 3.9+
- USB转I2C适配器:FT232H模块(就是市面上常见的蓝色小开发板)
- 从设备:一块传感器小板上同时挂了GT911触摸控制器(7位地址通常为0x5D或0x14,取决于引脚配置)和一颗AT24C02 EEPROM(7位地址为0x50)
- 软件:pyftdi库、openpyxl库、Python交互环境或脚本
- 万用表或示波器(可选,排查时用)
连接方式是FT232H的D0脚接SCL,D1脚接SDA,再从适配器的3.3V引脚给传感器板供电,或者用独立稳压源都行,地线一定要共地。总线上拉电阻我这里取1.2K,接在3.3V和SDA/SCL之间。所有线都尽量短,我这次测试用的是5厘米左右的杜邦线,避免长线引入的电容问题干扰对适配器本身能力的判断。
4.2 配置1MHz速率并执行全地址扫描
pyftdi这个库把FT232H封装成I2C控制器,配置过程非常简单。先安装依赖:
pip install pyftdi openpyxl然后写一个扫描脚本,先把总线配置成1MHz,再从0x03扫到0x77,判断每个地址是否有ACK:
from pyftdi.i2c import I2cController, I2cNackError i2c = I2cController() # ftdi://ftdi:232h:任意设备序列号/1 表示第一个通道 i2c.configure('ftdi://ftdi:232h/1', frequency=1000000) found = [] for addr in range(0x03, 0x78): try: # 尝试读取1个字节,只要从设备回了ACK就算识别到 i2c.get_port(addr).read(1) found.append(addr) print(f'0x{addr:02X} -> ACK') except I2cNackError: # 无设备应答,继续下一个地址 pass print(f'scan done, found {len(found)} device(s)') i2c.terminate()这个脚本的核心逻辑就是逐个地址发起一个字节的读操作,读操作要求从设备必须ACK地址帧,否则就抛I2cNackError异常,我们捕获后继续扫描。实测在1MHz下,扫描0x03到0x77共117个地址,整个流程大概在1秒内跑完。如果你把frequency从1000000改成100000,就能对比同一条总线上低速和高速扫描的结果差异。
第一次跑这个脚本,如果发现某个地址有ACK但设备型号和你手上模块对不上,别急着怀疑脚本。先确认你手上模块的7位/8位地址换算关系,再回到数据手册核对。比如GT911的7位地址实际由引脚电平决定,有的模块默认0x5D,有的默认0x14,扫出来不一致很可能只是批次或配置差异。
4.3 对扫描结果做读写稳定性验证
扫描能发现设备,但还不代表设备在1MHz下能稳定工作。我见过不少设备能回ACK,但真正读写数据时就开始出错。所以扫描之后一定要做第二步:对识别到的设备进行实际的读写操作,而且要反复读、连续读。
以AT24C02这颗EEPROM为例,先用1MHz速率往某个地址写入一组数据,再读回校验:
import time def test_eeprom(addr, count=20): ok = 0 for i in range(count): try: # 这里简化为直接读设备ID寄存器,实际EEPROM需要先写地址再读 data = i2c.get_port(addr).read(8) if data: ok += 1 except Exception as e: print(f'round {i} failed: {e}') time.sleep(0.01) print(f'EEPROM read success: {ok}/{count}')对GT911这类触摸芯片也一样,可以读它的版本寄存器或者状态寄存器,连续读几十次,看有没有偶发NACK或返回全0xFF的情况。这里有个实测心得:很多设备在1MHz下第一次访问可能失败,但如果连续循环访问很多次又恢复正常,往往不是速率本身的锅,而是上电时序或者初始化序列没走完。你要做的是先等设备稳定之后再开始测试,比如上电后延时200ms再初始化GT911,不然误判概率很高。
读写验证通过之后,基本可以认为这条总线和设备在1MHz下是能跑通的。但"能跑通"和"稳定量产"之间还有距离,建议再根据你的实际场景做更长时间的压力测试,比如连续读写半小时以上,记录失败次数。这个我们在第5节会讲怎么排查失败。
4.4 把扫描记录整理成Excel测试报告
标题里专门写了Excel,说明测试记录和数据整理是这个项目很重要的一部分。扫描和读写测试的原始输出都是控制台打印,直接丢给同事或放到报告里都不够直观,所以我会用Python把结果整理成Excel表格,这也是工程记录比较规范的做法。
我在扫描脚本里增加一段数据收集逻辑,把所有扫描结果(地址、ACK状态、速率、时间戳)保存到一个列表,然后用openpyxl写进Excel:
from openpyxl import Workbook from openpyxl.styles import Font, PatternFill from datetime import datetime wb = Workbook() ws = wb.active ws.title = 'I2C Scan Report' ws.append(['Scan Time', 'Bus Speed (KHz)', '7-bit Addr', '8-bit Addr(W)', 'ACK Status']) for addr in found: ws.append([ datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 1000, f'0x{addr:02X}', f'0x{(addr << 1):02X}', 'OK' ]) # 给有设备的行加高亮 red_fill = PatternFill(start_color='FFC7CE', end_color='FFC7CE', fill_type='solid') for row in ws.iter_rows(min_row=2): if row[4].value == 'OK': for cell in row: cell.fill = red_fill wb.save('i2c_scan_1000khz.xlsx')这里顺便把8位地址(addr左移一位)也写进表格,方便对数据手册。Excel本身也支持手动录数据,如果你不想写代码,完全可以照着这个表格字段手动维护一份。不过我个人强烈建议把脚本放到项目目录里随用随跑,因为手动录入容易抄错地址,而且批量测试时人工效率太低了。至于热词里提到的"Markdown表格转换Excel",你完全可以把这段表格转换逻辑接到上面脚本后面,先输出Markdown再转Excel,形式不重要,关键是字段要齐:地址、ACK状态、速率、结果状态和时间戳,这五列是必不可少的。
5. 常见问题与排查:1MHz下最容易踩的四个坑
跑完一轮完整的测试之后,我估计你八成会遇到至少一个问题。这节把我自己踩过的坑和排查思路汇总一下,每个现象都先说表现,再说原因,最后给排查步骤和解决办法,你可以直接把这张表打印出来放工作台上。
5.1 现象一:扫描不到任何从设备
表现:脚本跑完,一个ACK都没有,found列表是空的。
排查顺序从物理链路开始。第一步,确认SDA和SCL有没有接反,我栽过不止一次。第二,确认设备供电正常,万用表量一下模块电源引脚,别只看LED亮了就认为供电够,有些模块LED供电和逻辑供电是分开的。第三,确认共地,USB转I2C适配器和目标板不共地的话,信号高电平参考点都不一样,通信必然失败。第四,确认上拉电阻到底接没接,很多模块内部自带I2C上拉,但如果你用的是裸芯片或者自制的板子,忘记接上拉就完全扫描不到。
如果这些都查完还是空,用最低速率再扫一遍。把frequency改成100000,先确认低速下能不能找到设备。低速找到、高速找不到,问题就出在速率相关的参数上,往2.2节和3.1节的方向去查;低速也找不到,那就是连接、供电、地址范围这老三样了。
5.2 现象二:100K/400K正常,切到1MHz就丢设备
这是1MHz调试最常见的现象,原因集中在三个地方:上拉电阻偏大、总线上电容偏大、或者适配器输出能力不够。
先换上拉。把4.7K换成1.2K,多数时候能解决一大半问题。其次是缩短线材,总线电容太大时,上升沿会被拉得很慢,就算换小上拉也可能治标不治本。这里给个判断技巧:用示波器看SCL引脚的上升沿时间,如果已经接近120ns或者超过,就说明RC充放电太慢,你能很明显看到边沿是一个缓慢的斜坡而不是陡峭的跳变。没有示波器的话,就用排除法,把设备直接怼到适配器引脚旁边的面包板上,用最短的线连,如果这样能扫到,问题就在线材和电容上。
还有一类隐藏原因:适配器本身在1MHz下的驱动能力弱。有些USB工具的SCL/SDA引脚输出驱动电流不足,挂上两个从设备还行,挂三四个就直接拉不动总线了。这时可以在SCL/SDA上加缓冲器芯片(如PCA9517),或者换一个驱动能力更强的适配器。测试工具能力的办法是只接一个已知能在1MHz下工作的设备,如果单设备也丢,那就是适配器或配置的问题;单设备正常、加设备就丢,那就是负载能力的问题。
5.3 现象三:设备地址时好时坏,读写偶发失败
地址时好时坏,最典型的两个原因:设备上电时序没走完,或者总线信号质量处于临界状态。
先给设备足够的上电稳定时间。以GT911为例,它的I2C地址是由引脚电平决定的,上电后需要等待内部复位完成才能响应外部I2C访问,如果复位还没结束你就发地址帧,它要么不回ACK,要么返回错误数据。我习惯在扫描前加一个500ms到1s的延时,等总线上所有设备都稳定了再扫。这一步改动很小,但能排除掉大量"偶发失败"。
信号质量临界状态则表现为:同一个地址,连续扫描十次,有八次能扫到,两次扫不到。这个时候要怀疑上升沿太慢,数据建立时间不够。用示波器卡在SCL高电平的70%到30%区间看上升沿,如果接近120ns甚至超过,就说明上拉电阻该减小了。还有一种容易被忽略的情况是总线上同时存在多个上拉点,比如适配器板载上拉和目标模块板载上拉并联,等效电阻变小,反而可能超出设备的最小上拉规格导致驱动能力问题(灌电流不足)。出现这种情况,最好只保留一组上拉。
另外,如果你在Linux环境用pyftdi直接访问FT232H,偶尔会遇到设备被系统识别但USB资源不足的错误,代码12这种情况在Windows下也听说过。这通常是驱动层面的资源分配问题,拔掉重新插一次,或者换一个USB口能解决大半;再不行就把其他占用USB带宽的调试工具先断开。
5.4 一张自己常用的排查速查表
最后把我压箱底的排查表分享出来,按优先级排列:
| 现象特征 | 优先检查项 | 整改动作 |
|---|---|---|
| 一个设备都扫不到 | 接线/供电/共地 | 用万用表逐点量电压,核对SDA/SCL是否接反 |
| 低速正常高速丢 | 上拉电阻偏大 | 换1K到1.4K上拉,观察上升沿 |
| 高速丢设备且上拉已换小 | 线材和总线电容过长 | 缩短杜邦线到10cm内,尽量用PCB走线 |
| 地址扫描时好时坏 | 设备上电时序未完成 | 扫描前增加500ms~1s延时 |
| 多设备挂载时故障率升高 | 适配器驱动能力不足 | 加缓冲器或换高驱动适配器 |
| 工具识别不了,USB资源报错 | 驱动/资源冲突 | 换USB口、重插设备、重装驱动 |
| 读EEPROM成功但校验失败 | 写入时序和速率不匹配 | 降低写周期频率,或按手册增加写周期延时 |
这张表是我花了不少时间整理出来的,基本覆盖了"USB转I2C + 1000KHz扫描"这个场景下90%的故障。每次遇到问题先别急着怀疑是设备坏了,按表里从上到下的顺序排查,绝大多数都能在十分钟内定位到原因。
最后再分享一个我个人的体会:跑1MHz总线速率测试,其实测试的不仅仅是设备和适配器,更是你对整个I2C链路细节的理解程度。上拉电阻、线材电容、上电时序、地址位宽,这些平时在100KHz下完全无感的东西,一到1MHz就全部现出原形。所以如果你第一次没跑通,真不用气馁,把排查表过一遍,找到那个隐藏的瓶颈,你对I2C协议的理解会比之前深一大截。回看标题里那个"A",我后来在实践中养成了每次测试都保留一份带版本编号的记录习惯,文件名里写清楚参数和日期,测试数据全部落到Excel归档。这个习惯一开始看着麻烦,等半年后翻旧报告时,你就知道它值多少钱了。