重温I2C总线协议并用PicoScope进行实测
I2C是什么?
I2C总线全称Inter IC 总线或IIC 总线。它是Philips公司在1980年代早期设计出来的,是为了方便一块电路板上的不同元器件之间互相通信。Philips半导体事业部在2006年成立了一家独立公司,也就是耳熟能详的NXP(恩智浦)公司。NXP与Freescale(飞思卡尔)于2015年合并,次年又被高通收入囊中,而I2C总线见证了半导体行业四十年的潮起潮落,至今仍然散发着活力。
初期的I2C标准速率设定在100Kbps,因为当时的许多应用不需要很快的传输速率。后来逐渐有了400kbps的快速模式,在1998年之后又有了高速模式3.4Mbps. 最近的一次更新是快速模式的增强版,速率介于快速和高速之间。I2C不仅适用于板内走线,对于板间线缆连接的情况也适用,这个总线最大的魅力就在于它简单、灵活!
核心的几个特点包括:
1. 只需要两根总线信号
2. 没有严格的波特率要求,不像RS232,I2C的主设备会产生一个总线时钟
3. 所有通信之间都是简单的主从关系
4. 每个连接到总线的设备都有唯一的软件地址
5. 总线仲裁可以防止通信冲突时丢失数据
本文针对一款串行DAC芯片AD5325,展示了用PicoScope进行混合域分析I2C信号的全部过程。用到的这台Pico示波器有两个模拟输入端口和16个数字端口,模拟端口分别连到DAC芯片的两个模拟输出,数字端口的D0和D1分别连接DAC输入的SDA和SCL信号。
模拟信号显示
下图展示的就是PicoScope的软件界面,分成了三个区域:最上面的一个显示两个模拟信号A和B,以及I2C总线的概貌。中间的一块显示两个数字通道D0和D1的波形,最下面一个则是I2C解码的结果表格。
最上面区域的蓝色曲线,就是通道A的模拟电压,它在1.9V和0.6V之间开关变化。我们用游标准确地量取电压值,如下图。蓝线电平阶跃跳变的那个时刻,对应的就是I2C一簇数据的第三个字节的尾巴,此后还跟有一些握手确认信号。
红色的曲线是则是通道B的模拟输出电平,同样在1.9V到0.6V之间跳变,这一组波形的标尺是屏幕右侧的红色刻度。同样,在波形阶跃变化的时刻,也对应着三个字节的I2C传输。
I2C数据概览
就在两个模拟波形之间,还显示了两个I2C 传输块的概貌,每个传输块都包含了下面的这些元素:
1. 起始包
2. DAC的地址
3. DAC通道索引
4. 两个字节DAC的数据值
5. 停止包
中间的显示区域
中间这个区域显示的是SDA和SCL这两路数字信号的原始波形。如果因为噪声或者干扰,导致数据传输中有任何错误,在这里也能看到标注。
理论上讲,通过肉眼读取二进制的码型,就可以解码I2C的命令了,但这样做耗时耗力,还容易出错,因此非常有必要通过PicoScope的软件自动解码。
下面的显示区域
这个区域就是I2C自动解码的结果了,具体包括了这些内容:
1. 第一列是报文的编号,按照解码出来的时间顺序排列,下面的图中有12个包
2. 第二列就是报文的几种类型了,起始/地址/数据/停止等等
3. 第三列是解码出来的地址数值,我们这个例子里面DAC在I2C总线上的地址是0x0C
4. 第四列表明是读数据还是写数据的请求
5. 第五列就是解码出来的数据值了,三个字节的数据中第一个是DAC的通道索引,比如01,接下来是16bit即两个字节的数据值,2C和11,组合起来就是0x2C11. 这个数据值经过DAC转换后得到是1880mV的模拟电压
6. 第九和第十字节就是DAC的通道02上的数据,0x2C23
7. 第六列Ack表明这一个包已经被正确接收了
8. 最后两列就是这个包的开始和结束时间
导出数据
解码出来的I2C数据可以导出到Excel表格中。
总线时序
总线的时序可以自动测量,或者用游标手动测量。上面的一张图曾经用游标测量了DAC模拟通道A和B的信号跳变边沿之间的时间差,达到1.4ms。
触发点
通常会选用A通道的模拟波形边沿切换时刻,而这里我们改用了D0变成高电平的时刻作为条件。下图展示了触发点的位置,就在第一个起始包对应的地方。
捕获多个I2C的传输块
在一些更加复杂的系统应用中我们可能需要一次性捕获多个I2C的传输块,中间没有间断。这就要用到解码软件中的累积功能,如下图:
我们知道PicoScope有快速触发模式,可以把存储空间切分成2-10000段,每一次触发条件满足,就填满其中一个段,直到10000段全部完成,段与段之间的延时可以非常小。这个功能可以和I2C解码中的累积功能配合起来使用。
下图就展示了一个稍微复杂些的数据传输序列,在打开累积功能之后,我们抓到了5段数据(5个传输块),像通常使用快速触发模式一样,我们可以在顶部的索引里面挨个浏览5段波形。而在下面的解码结果表格中,我们就可以翻看连续的5组完整的数据传输块,每一组都完整的包含起始、地址、数据、停止等等包。
检验波特率
数据传输的波特率在解码窗口中也可以有选择地打开查看,或者放大数字波形,也能看到。如下图中波形的右下角我们看到波特率是89K.
结论
现今许多的电路都包含模拟和数字两部分,所以我们常常要同时捕获模拟和数字信号。它们之间必须要同步起来,然后一起显示到界面上,才能更加方便我们做深入的分析,定位各种软硬件的故障。PicoScope 的各个系列以较高的性价比提供了模拟和数字的混合域分析能力,并且还搭配了完全免费的近20种串行总线解码软件,不失为硬件测试工程师们的好伴侣。