第四章 数据手册解读:时序图与参数表,一个都不能少
说实话,很多工程师拿到一份新的datasheet,直接跳到寄存器列表去抄配置。我个人习惯恰恰相反——先翻到时序参数表和时序图,因为这里藏着硬件能否跑通的命门。
温度传感器这类I2C器件,时序边界如果踩过了,读回来的温度值可能忽高忽低,甚至I2C总线直接被锁死。你想排查都很难下手。所以我建议,拿到任何一颗新传感器,先花30分钟把时序图和参数表吃透。
时序参数表:七个必须盯死的数字
先看参数表。不同厂家的I2C传感器,参数表里列的项大同小异。我按重要性排了个序,你就照这个顺序看,不会有遗漏:
| 参数名称 | 符号 | 典型值(100kHz) | 上边界 | 下边界 |
|---|---|---|---|---|
| SCL时钟频率 | f_SCL | 100 kHz | 400 kHz | 1 kHz |
| SCL高电平时间 | t_HIGH | 4.0 µs | — | 4.0 µs |
| SCL低电平时间 | t_LOW | 4.7 µs | — | 4.7 µs |
| 数据建立时间 | t_SU;DAT | 250 ns | — | 250 ns |
| 数据保持时间 | t_HD;DAT | 0 ns | — | 300 ns |
| 起始条件保持时间 | t_HD;STA | 4.0 µs | — | 4.0 µs |
| 停止条件建立时间 | t_SU;STO | 4.0 µs | — | 4.0 µs |
SCL时钟频率,这个简单吧?但有没有想过,如果SCL频率正好卡在400kHz,但传感器手册写的是“最高400kHz”,你直接跑满,一旦线缆寄生电容稍微大一点,高电平时间就不够了。我在项目中遇到过这种情况,跑100kHz稳如泰山,一提到400kHz就隔三差五丢数据。后来一量高电平时间,只剩3.2 µs,而规格书要求至少4.0 µs。
时序图:从7个段看懂一套I2C读写周期
参数表给的是数字,时序图给的是波形。两者必须对着看。我一般把一整个I2C读写周期拆成7个段来读:
- 起始条件(S):SCL高电平时SDA由高变低。看t_HD;STA是否满足。
- 设备地址+写位(7位地址+0):每个SCL时钟发一位,注意数据建立时间t_SU;DAT。
- ACK回复:从机拉低SDA。这里要算从机应答的时间窗口是否在SCL低电平时隙内。
- 寄存器地址(8位):和发送地址完全一样的时序要求。
- 第二个ACK:重复ACK段。
- 重复起始条件(Sr):这是很多新手容易忽略的。参数表里可能单独列了t_HD;STA(重复起始)和t_SU;STO。
- 停止条件(P):SCL高电平时SDA由低变高。检查t_SU;STO。
你想象一下,用逻辑分析仪抓波形,对着这7个段逐一量。能快速定位出哪个段时序不达标。
典型解析实例:读一个16位温度值
咱们以读一个温度传感器内部16位寄存器为例,拆解一遍参数表和时序图的配合用法。
假设传感器设备地址是0x48(7位),温度寄存器地址是0x00。读操作完整时序:
主机发送:S + 0x48(W) + ACK + 0x00 + ACK + Sr + 0x48(R) + ACK
主机接收:+ Data_High + ACK + Data_Low + NAK + P
我现在用量化的方式检查每个段:
- S段:确保SCL高电平时间≥t_HIGH(比如4.0 µs),SDA由高变低时SCL必须保持高
- 地址+数据段:每个SCL周期的低电平时间≥t_LOW(4.7 µs),每个bit的建立时间≥t_SU;DAT(250 ns)
- ACK段:从机有最大允许的响应时间,通常为0~t_VD;ACK(数据有效时间),如果主机太快,可能导致从机还没完成就被拉走SDA
- 停止条件P:SDA由低变高必须在SCL高电平前就稳定,建立时间要求t_SU;STO(4.0 µs)
算裕量的时候,我习惯把规格书上给的min值当最大允许值(对于t_HIGH这类参数,是下限,只能大不能小),然后用实际抓到的值减掉min值,得到的差值至少要留20%以上的裕量。比如t_HIGH min=4.0 µs,你实际量到4.8 µs,差值0.8 µs,考虑到温漂和老化,这个裕量我觉得刚刚及格。
最后总结一下我的核心经验:参数表和时序图不是各自孤立的。一边量波形边对照参数表里的数值,是唯一能确认I2C通信是否在“安全区”内的方法。我在调试中踩过的所有I2C总线卡死、丢数据、读值错误,最终原因都能归结到某个参数越界——不是t_LOW不够大,就是t_SU;DAT不满足。你现在开始养成这个习惯,以后会省掉很多头痛的时间。