以下文章来源于:公_众_号开源电子网 读取更多技术文章,请扫码关注
这篇文章着重点是让大家学会使用示波器查看IIC波形,并且说明在搞IIC驱动中,大家比较容易犯的错误点。关于IIC驱动源码,这里不过多描述,以精英版IIC实验例程为基础。示波器使用正点原子大神DS100作为测试。
【劲爆升级】正点原子DS100手持数字示波器全面升级,来看看视频介绍吧!
(DS100示波器视频介绍)
购买链接:
https://detail.tmall.com/item.htm?id=632834963710
淘宝搜索:正点原子旗舰店 即可进店购买
测试场景实物连接图如下:
(通道A连接到PB6即IIC_SCL上,通道B连接到PB7即IIC_SDA上) DS100示波器操作按键示意图如下图所示:
通过选择滚轮和调整滚轮,把右侧参数调整,如下图所示:
这里主要做的工作: ① 双通道即通道A和通道B(通过耦合方式进行开启) ② 垂直档位2V(这里需要查看探头档位并在示波器上探头调整为X1即可) ③ 档位调整为100us即可,对于IIC通信可以了 ④ 阈值不能调太高 ⑤ 把触发方式改为单次 把例程代码修改一下,写入数据为1个字符‘A’:
//要写入到24c02的字符串数组
const u8 TEXT_Buffer[] = {"A"};
在地址10处写入/读写一个字符数据,代码修改如下:
AT24CXX_Write(10, (u8 *)TEXT_Buffer, SIZE);
AT24CXX_Read(10, datatemp, SIZE);
编译下载进开发板。例程的操作是按下按键1就是写入数据,按下按键0就是读取数据。
分析波形这里我们以AT24C02写时序为例子进行分析,回顾一下。
整个写操作过程如下: 起始信号地址和方向应答信号内存地址应答信号数据内容应答信号停止信号
由于前面已经将触发方式改为单次,所以通过按下按键1即是写入操作,获得波形图。
这时候,我们已经把整个写操作时序获取到,这样看肯定不清楚,所以我们可以通过时间档位进行放大。时间档位变为10us并通过水平偏移操作,放大波形如下:
通过波形图,你会发现: S就是经典的起始信号,当SCL线为高电平的时候,SDA从高电平往低电平跳变 发送起始信号之后便是地址和方向组合的一个字节数据,这里就是0xA0。0xA0的由来可以查看一下IIC实验教程。 **(重点)**第九个时钟脉冲高电平期间便是检测应答信号,这里也是检测IIC有没有通信成功的地方。假如看到波形是有低电平,那么就证明从机应答了,否则就是没有应答,这时候你就需要检查第一个字节是不是应该发0xA0。 图中第九个时钟脉冲后,SDA线出现绿色的小尖峰是由于从机发送完应答信号后,会释放SDA线,把总线的主动权交还给主机。这是正常现象。 现在继续往后分析波形,通过水平偏移,把波形图整体往左移,如下:
这里传输的便是内存地址,前面也提到为地址10处,0xA0即为10,这里与你发送的是一致的内容,并且后面也能接收到从机返回的应答信号。 继续通过水平偏移,查看剩下的波形内容。
这里传输的就是数据内容,通过波形分析,传输的数据为0x41。‘A’的ASCII码值就是0x41,发送与实际一致。随后便是从机的应答信号,低电平表示应答,最后便是经典的P停止信号,在SCL线为高电平的时候,数据线从低电平往高电平跳变。 以上就是分析IIC波形图的过程。 导致IIC通信异常或者失败的原因有: ① IIC_SDA和IIC_SCL没有接上拉电阻,这时候出现的波峰会出现软弱无力的感觉,可以参照正点原子原理图设计。
② 读取数据时异常,这里就要检查主机发送完数据后是否释放SDA线,源码可以参考例程。 ③ 写入数据不生效,这里存在一个很关键的地方,EEPROM写入速度比较慢,必须需要等待一小段时间约10ms。
下图是AT24C02的读时序图。
整个读操作过程如下: 起始信号地址和方向应答信号内存地址应答信号 起始信号地址和方向应答信号数据内容应答信号停止信号 有DS100示波器的同学,可以尝试捕捉一下读操作波形,看看读出来的是不是字符‘A’。