电力电子技术
直播中

钟晶

7年用户 183经验值
私信 关注
[问答]

用示波器分析I2C时序

通过本次OPT3001驱动调试,了解到I2C通信遵守操作时序的重要性。在通讯不能成功时,可加入死循环函数,检验发送、接收信号是否正常,从而帮助锁定错误。
如果在上文中出现错误之处,还望指正。

回帖(4)

颜廷波

2021-2-1 11:08:05
  一般当我们拿到一个I2C设备时,就必须涉及到驱动的编写,就比如对于OPT3001来说,就要用编写OPT3001驱动,这样我们才能控制它。
  
  OPT3001模块
  我们所用的是ZigBee-CC2530开发板与OPT3001模块,将OPT3001模块采集到的照度值传送到ZigBee-CC2530模块显示,但显示不出照度值,在检测了硬件及ZigBee-CC2530软件没有问题的情况下,将问题集中在OPT3001的I2C驱动上。
  对于I2C总线的数据,我们要用到示波器,这样我们才能抓取到信号,而且必须同时采集SDA和SCL的数据,通常,触发信号放在时钟上面。该如何抓取呢?这里的方式是将示波器调成边下降沿触发模式(因为开始信号是SDA下降沿),并且将触发电平设置成2V(触发电平设置不正确,抓不到波形),便于数据分析。
  理论上,如果是3.3V的系统,那么触发电平一般就放在1.5V上下。
举报

卞晓俊

2021-2-1 11:08:20
  下图红色方框中的按钮,设置触发电平。
  
  注:除非特殊原因,示波器上的衰减倍率要和表笔上的设置一样。
举报

孙云云

2021-2-1 11:08:37
  OPT3001驱动函数
  程序利用普通IO口模拟I2C通信,其中SCL通过IO口延时高低电平变化实现,SDA根据SCL状态变化产生起始信号,停止信号,以及实现发送接收数据等。编程环境为IAR,想了解更多IAR,可点击IAR集成开发环境入门。
  I2C起始函数
  主机(只有主机)会发送起始和终止信号,起始和终止信号之间,总线处于被占用状态。
  起始信号,终止信号如下:
  SCL为高电平时,SDA由高向低的变化,即为起始信号。
  SCL为高电平时,SDA由低向高的变化,即为终止信号。
  
举报

庄金樱

2021-2-1 11:08:56
  I2C时序
  我们来看I2C协议中的数据传输时序图:
  
  数据传送时,1个字节8位数据,后面跟一个应答位。所以,一桢有9位。
  SCL是时钟,SDA承载的是数据。当SDA从1变动到0,而SCL还是1时,表示开始数据传输。接下来的7位,就是设备的地址。紧接着的是读写标志,其为1时是读取,为0则是写。如果I2C总线上存在着和请求的地址相对应的设备,则从设备会发送一个ACK信号通知主设备,可以发送数据了。接到ACK信号后,主设备则发送一个8位的数据。当传输完毕之后,SCL保持为1,SDA从0变换到1时,标明传输结束。
  从这个时序图中可以看到,SCL很重要,并且哪个时钟沿是干嘛的,都是确定好的。比如,前面7个必定是地址,第8个是读写标志,数据传输必须是8位,必须接个ACK信号等等。
  下图是测到波形:
  
  分析图中部分波形可知:
  1、由主机发起,在SCL为高电平时,SDA由高到低切变,形成开始信号;
  2、接着是7位地址和一位读写标志,这里7位地址为1000100,正是我们代码中设置的地址ID;最后一位为0表示写操作;
  
  3、接着在下一个时钟,主机以高电平状态释放SDA,这时从机响应,将SDA拉低了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分