
前阵子调一块双电源板子主控是3.3V的STM32外扩一颗5V逻辑的老款EEPROM和一颗5V传感器。我想着I2C总共两根线按说直接连上就能用结果上电一扫描要么器件地址出不来要么读到一半卡死。示波器挂上去才看明白SCL高电平只有3.3V而5V那边CMOS输入的高电平阈值偏偏标在3.5V以上。换句话说5V设备压根不认3.3V的高电平通信纯靠运气。后来换上TI的TXS0102电平转换芯片两通道双向转换问题当场消失。这篇文章就把TXS0102在I2C场景下的原理、接线、上拉电阻计算和调试方法完整梳理一遍给正在被总线电平折腾的朋友一个可以直接照做的参考。1. 为什么I2C总线天生离不开电平转换1.1 开漏输出与上拉电阻的物理逻辑I2C协议规定所有设备的SCL和SDA引脚必须是开漏输出。开漏的意思是芯片内部没有推挽结构只有一个下拉MOS管它的职责仅仅是把总线拉低。总线空闲时这个MOS管是关断的引脚处于高阻状态。那么高电平谁来给靠外部上拉电阻把总线拉到VCC。这就像一群人围着一根竖杆每个人只能往下压想让它回位就得靠一根弹簧往上顶弹簧就是上拉电阻。这种设计给I2C带来了两个不可替代的好处多设备共享总线时不会短路。推挽输出一个拉高一个拉低就是电源短路开漏不会。不同电压域的设备可以挂在同一条总线上因为高电平是各家用自己的上拉电阻拉到各自的VCC低电平大家都拉GND。问题也恰恰出在这里。如果3.3V主控和5V从设备直连主控一侧上拉把高电平拉到3.3V5V设备的输入高电平阈值可能是3.5V于是它永远读不到有效的高电平。要么靠边沿偶尔蒙对一次要么直接收不到任何有效位。1.2 高电平识别不了带来的三个后果我在最初直连调试时遇到过三种典型坏表现分别对应三种物理原因第一种是设备无响应。5V设备认为高电平无效SDA上的0和1判断混乱地址帧过不去整个总线上没有任何ACK。第二种是设备偶发复位或死机。3.3V主控输出的高电平虽然只有3.3V但从设备在识别失败时可能把内部输入钳位二极管导通把电流倒灌进主控IO或者从设备本身。严重时引起闩锁效应电流猛增芯片发烫只能断电恢复。第三种是信号边沿异常。I2C的上升沿是靠上拉电阻对总线电容充电完成的电平不匹配时两边寄生二极管和输入缓冲同时参与工作等效电容变大上升沿变缓高速模式下直接失败。所以在混合电压环境下做I2C通信电平转换不是可选项而是必要项。TXS0102这类专用芯片就是在这一层解决问题的。2. TXS0102的双向转换机制2.1 两个通道的内部组成TXS0102是一片双通道双向电平转换器外形通常为USON或VSSOP封装引出VCCA、VCCB、GND、OE、A1、A2、B1、B2共8个引脚。A侧接低压域B侧接高压域。每个通道内部可以拆成三块一个传输门。这是双向导通的核心A侧和B侧IO通过它相连。传输门的导通与否由两侧电压状态自动决定不需要外部方向控制引脚。一组内部上拉电阻。A侧和B侧各自有上拉到对应VCC的电阻量级在几十千欧左右具体数值要以你手上芯片批次对应的数据手册电气特性表为准。一个边沿加速器也叫one-shot。这是TXS系列区别于老式无源电平转换方案的关键。当A侧设备把总线拉低时传输门导通B侧被同步拉低。当A侧释放总线时内部上拉电阻开始给总线电容充电B侧电压随之回升。整个过程对两端设备完全透明不需要软件配置方向。2.2 one-shot是快上沿的关键如果只靠内部几十千欧的上拉电阻RC充电时间会非常长。假设等效上拉电阻20kΩ总线电容100pF算下来上升沿常数就是2微秒100kHz的I2C勉强能跑400kHz基本完蛋。正是为了克服这个矛盾TXS0102引入了one-shot机制。one-shot的工作方式是当输入检测到总线从低到高的上升沿瞬间内部会短暂打开一个低阻PMOS管把对应的IO快速拉到VCC。这个低阻通道持续几十纳秒后关闭之后由高阻上拉电阻维持高电平。相当于在边沿那一刻用一记短促强拉把总线电容快速充到位充电完成后自动放手。这个设计让TXS0102在开漏模式下的速率比无源方案高出一大截。推挽模式下数据手册标称可以跑到50Mbps级别开漏模式下覆盖I2C常规的100kHz、400kHz以及1MHz高速模式没有问题。当然具体极限数据以数据手册为准因为实际速率还跟负载电容、上拉阻值直接相关。需要特别提醒的是one-shot只是加速边沿不是无限驱动。如果总线电容大到几百皮法one-shot的短暂导通时间可能不足以把电压充到目标值后半段上升沿依旧缓慢。这也是为什么后面要单独讨论外部上拉电阻。2.3 供电范围、OE与上电顺序TXS0102的供电要求并不复杂但三条红线必须记住VCCA接低压侧电源范围1.65V到3.6V。VCCB接高压侧电源范围2.3V到5.5V。任何时候都要保证VCCA小于等于VCCB。如果接反内部传输门和ESD结构可能出现异常电流通路轻则转换逻辑混乱重则损坏芯片。OE引脚是输出使能端高电平有效逻辑参考电压是VCCA。I2C应用里最简单粗暴的做法是直接把OE接到VCCA让它一直被使能。不要悬空有些芯片内部OE自带弱下拉悬空等于关闭。把OE拉低时所有IO进入高阻态相当于从电气上把总线断开这个特性可以用于低功耗场景下的外设隔离。上电顺序上数据手册推荐VCCA先上电之后VCCB最后等电源稳定后再让OE拉高。实际用线性稳压器供电时只要保证VCCA不晚于VCCB、OE通过VCCA的上拉或者直接连接就不会出问题。3. 硬件设计接线、选阻和PCB3.1 最小系统接线直接给出一份经过验证的接线清单适用于3.3V主控与5V I2C从设备的典型场景主控3.3V电源接VCCA5V电源接VCCBGND共地。A1接主控SCLA2接主控SDA。B1接从设备SCLB2接从设备SDA。OE接VCCA。VCCA和VCCB引脚旁边各放一只0.1uF去耦电容靠近引脚放置。主控和TXS0102之间不需要串联电阻但如果是长线连接可以在A1/A2上串联33Ω电阻做阻尼抑制反射。通道对应关系一定要检查清楚。很多人的板子SCL和SDA丝印排版随意接反之后不是完全没反应而是偶尔能读到设备但数据全乱排查起来非常费时间。3.2 外部上拉电阻到底加不加这是TXS0102使用中被问得最多的问题。结论分两种情况。如果只是临时调试设备少、走线短、速率跑100kHz可以不加外部上拉。TXS0102内部上拉和主控内部上拉并联等效阻值通常在十几千欧到二十千欧左右100kHz下完全够用。如果是正式产品或要求稳定必须加外部上拉。原因很简单内部上拉阻值偏大只能保证空闲高电平不能保证高速下上升沿达标。总线拉长、温度变化、挂载设备增多都会让总线电容上升导致400kHz甚至1MHz下波形变成圆弧通信随机失败。外部上拉电阻取值通常从1kΩ到10kΩ之间。具体取多少不能拍脑袋得按公式算。3.3 用两个公式算上拉电阻I2C上拉电阻的选取受两个方向的约束一个是上升沿时间的上限一个是低电平灌电流的下限。上升沿时间可以用近似公式估算tr 0.8473 × Rp × Cbus其中tr是上升沿时间Rp是等效上拉电阻Cbus是总线等效电容。I2C规范要求标准模式100kHz下tr必须小于1000ns快速模式400kHz下tr必须小于300ns。举个例子假设总线上挂5个设备PCB走线和引脚电容加起来估算100pF目标跑400kHzRp_max 300ns / (0.8473 × 100pF) ≈ 3.54kΩ所以选3.3kΩ是合理的。如果设备更多估算电容到200pFRp_max就只有约1.77kΩ这时要么换更小的上拉要么降低速率。再看下限。上拉太小低电平时的灌电流会变大。公式是IOL (VCC - VOL) / Rp还是上面3.3V系统取VOL不超过0.4VRp1kΩ时灌电流约2.9mA。多数I2C设备的IOL极限在3mA到20mA范围内2.9mA可以接受。但如果从设备是低功耗芯片IOL只有1.5mA就必须把最小阻值抬到2kΩ以上。这就是为什么有的板子用1k上拉反而不稳定因为从设备拉不动。综合上下限100kHz、短总线选4.7k到10k400kHz、中等负载选2.2k到3.3k这是一个可靠的起点。3.4 PCB布局与供电细节PCB布局上TXS0102应该放在低压域主控和高压域从设备之间作为物理上的电平边界。A侧走线属于低压域B侧走线属于高压域两边的地都要以芯片GND为基准不要跨分割地平面。去耦电容要尽可能靠近电源引脚。VCCA和VCCB的电容地端直接打过孔到主地不要绕远。电源走线先到电容再到芯片顺序不要反。I2C信号线尽量短而直避免平行长距离走线引入串扰。如果板上还有其他高频信号比如SPI或PWM至少让I2C走线远离它们必要时用地线隔离。双通道之间间距并不关键因为SCL和SDA本来就是平行总线。另外提醒一点不要为了美观在SCL和SDA上串磁珠或电感。I2C是开漏信号任何额外的感性阻抗都可能和上拉电阻产生振铃轻则边沿过冲重则完全无法通信。4. 调试实录看波形、抓时序、对故障表4.1 示波器上必须确认的四个点拿到一块焊好TXS0102的板子第一步不是写代码读数据而是用示波器量波形。四个点确认完I2C通信八成已经成功了一半。第一低电平是否足够低。I2C规定VOL要小于0.4V实测应该在几十毫伏级别。如果低电平快到1V说明从设备下拉能力不足或者上拉电阻太小总线处于危险边缘。第二高电平是否到达对应侧VCC。A侧波形高电平应接近3.3VB侧应接近5V。如果B侧高电平只有4.2V可能是内部上拉被其他设备的分压拉低或者总线电容过大。第三上升沿是否陡峭。前面说了tr的约束400kHz下不要超过300ns。波形如果像圆馒头而不是矩形波就要调小上拉电阻。第四START和STOP条件是否完整。START是SCL高电平时SDA由高到低STOP是SCL高电平时SDA由低到高。很多通信卡死问题就出在从设备没收到正确的STOP总线一直被占用。示波器探头记得用10x档位探头本身有十几皮法电容用1x档位等于给总线又挂了个几十皮法的负载波形看起来偏慢会误导判断。4.2 逻辑分析仪解码怎么快速定位问题逻辑分析仪的价值是能看到协议层的问题。把通道1接A侧SCL通道2接A侧SDA或者B侧也可以重点是同一侧设置合适的采样率解码为I2C协议。实际分析时优先看三类信息地址帧是否被ACK。主机发送从设备地址后第九个时钟的SDA应该被从机拉低表示ACK。如果这里一直是高说明从设备根本没参与通信问题在地址、硬件连接或者电平阈值。每个字节后面的ACK是否正常。中间某个字节出现NACK通常是寄存器地址写错、从设备不支持该操作或者从设备内部状态机卡死。数据字节是否有错位。如果解码出来全是0xFF或者0x00大概率是信号电平临界逻辑分析仪误采样。这时候回到示波器看波形。用逻辑分析仪还有一个技巧采样率不要设得太低。I2C 400kHz下至少设4MHz以上采样率否则边沿抖动会被误判成额外的电平变化解码结果非常奇怪。4.3 常见故障现象与解决对照表把样机调试过程中反复遇到的故障按现象归类整理成一张可快速检索的对照表。现象可能原因验证与解决扫描不到任何设备地址电源或OE未接对SCL/SDA接反检查VCCA/VCCB电压OE应等于VCCA示波器确认两侧波形地址有ACK但读写数据全错电平临界B侧高电平不达标用示波器看B侧VOL/VOH调整外部上拉阻值400kHz通信随机失败总线电容过大上升沿超限减小上拉电阻缩短走线或把速率降到100kHzSDA长时间被拉低总线死锁某从设备异常占用总线用示波器找拉低源给故障从设备单独复位或重新上电一侧波形正常另一侧畸形VCCA/VCCB顺序反了或地没共好检查两路电源电压关系确保共地通信时好时坏TXS0102到任一侧的走线过长或悬空检查连接线长度去掉悬空分支必要时串33Ω阻尼电阻其中SDA长时间被拉低特别常见。我在调一块板子时遇到SDA一直为低排查后发现是从设备在通信中途掉电输出级下拉管一直导通。这时候不是改上拉能解决的需要先把出问题的从设备电源管理做好保证总线操作期间供电稳定。4.4 用EEPROM读写做完整验证电平转换是否正常工作最直观的验证方式就是读写一颗I2C EEPROM比如AT24C32。让它完成一次写字节、读回字节的完整流程然后用逻辑分析仪把整个时序抓下来。一个标准的验证流程主控发送START。发送设备地址方向位为写。收到ACK后发送要写入的存储地址高字节。收到ACK后发送存储地址低字节。收到ACK后发送数据字节。收到ACK后发送STOP。然后再发一次读操作把刚写进去的字节读回来。读回的数据和写入的数据一致说明地址、数据、ACK、STOP这些关键环节都正确完成了。TXS0102只要在低电平和高电平传递两个方向都没有问题整个流程就能一次通过。实测中我遇到过写进去0x5A读回来0x7A的情况逻辑分析仪显示每一位都对就是高电平采样点不稳。最后定位到是5V侧总线电容偏大、上拉电阻用了10k导致上升沿过慢。换成3.3k后问题消失。这个案例充分说明芯片本身没有问题问题是外部的RC参数没配好。5. 选型对比什么场景该选TXS01025.1 分立MOS方案是省钱但不是万能很多低成本板子用的是两个BSS138 NMOS加几个电阻搭成的双向电平转换网上模块十几块钱一个。它的原理是利用MOS管的对称导通特性和体二极管实现双向传输在100kHz、短走线、少设备的场景下确实能用。但分立方案有三个天然短板高电平会被MOS管体二极管和分压电阻拉低实际高电平往往到不了VCC余量小。没有one-shot加速器上升沿完全靠上拉电阻硬充总线电容稍大就露馅。没有ESD保护和精密的上电时序管理在工业现场或电源抖动环境下可靠性一般。所以我的建议是自己焊着玩、实验课、临时验证用分立模块问题不大。做产品、做严苛环境下的通信选TXS0102这种专用芯片省下的调试时间远比多出来的几块钱成本值。5.2 TXB0102、PCA9306、TCA9517怎么取舍TXS0102之外还有几款常见芯片容易混淆。TXB0102是TXS0102的表亲同样是TI的自动方向电平转换但它是为推挽信号设计的不支持开漏。I2C总线在空闲时是高阻态靠上拉维持高电平TXB0102内部没有针对开漏的上拉策略直接用于I2C轻则边沿异常重则触发振荡。UART、SPI、GPIO这些推挽信号可以选TXB0102I2C场景直接选TXS0102不用犹豫。PCA9306是NXP的双向电平转换走的是模拟开关路线本身不带驱动和边沿加速两侧都必须自行加上拉电阻。它的优势是成本低、通道压降低适合简单低速的转换。但如果你要省掉外部上拉、追求更高的边沿质量TXS0102体验更好。TCA9517是I2C专用缓冲器内部集成上拉和单向缓冲能隔离两侧总线电容适合总线很长、挂载设备很多、甚至需要热插拔的场景。它的问题是只能用在标准I2C协议上对两侧逻辑有更强的依赖。如果只是单纯转换电压选TXS0102就够如果是为了隔离电容和增强驱动TCA9517是更专业的工具。从选型角度总结常规的3.3V与5V I2C互联TXS0102是目前平衡成本、易用性和性能的好选择。它不需要方向控制、不需要额外驱动逻辑接线简单两颗通道刚好覆盖SCL和SDA非常契合I2C总线的特点。5.3 关于总线扩展的一点提醒还有一类问题常被误以为是电平问题总线上设备太多导致等效电容过大通信不稳定。这时候换再好的电平转换芯片也解决不了因为TXS0102的本质是电平翻译不是总线缓冲。如果需要挂载很多设备或者总线要拉出板外走一两米更合理的做法是使用I2C多路复用器或总线缓冲器比如TCA9548A做通道扩展TCA9517做电容隔离。先把总线分成多个分支每个分支的电容控制在合理范围内再在这些分支上做电平转换。分清电压不匹配和总线负载过重是两种不同的问题是排查I2C故障的基本功。我在实际项目里的习惯是先确认每个分支上的设备数量不超过4到5个再估算总线电容最后才决定上拉电阻和是否加缓冲。顺序反了往往会在一个错误的方向上反复调参浪费时间。最后再分享一个经验调试任何带TXS0102的I2C系统手边一定要有示波器和逻辑分析仪示波器看电气质量逻辑分析仪看协议状态两者缺一不可。我第一次用TXS0102时因为偷懒只写了代码、拿了万用表量电压以为电平都对就行结果在上升沿问题上耗了整整一个下午。后来老老实实把波形和时序图拍出来五分钟就定位到了上拉电阻偏大的问题。芯片是工具波形和时序才是真正的证据。