思享国logo
  • 点赞

    6

  • 宝推

    0

  • 10

  • 回复

  • 下载附件

    2

返回顶部

点赞数

6

回复数

3

被浏览

780

OPT3001驱动调试记录:用示波器分析I2C时序(IO口模拟I2C通信,附代码)

2018-02-11 16:02更新
  • OPT3001驱动
  • ZigBee-CC2530
  • IAR编程
  • 论坛热议

一般当我们拿到一个I2C设备时,就必须涉及到驱动的编写,就比如对于OPT3001来说,就要用编写OPT3001驱动,这样我们才能控制它。

捕获

OPT3001模块

我们所用的是ZigBee-CC2530开发板与OPT3001模块,将OPT3001模块采集到的照度值传送到ZigBee-CC2530模块显示,但显示不出照度值,在检测了硬件及ZigBee-CC2530软件没有问题的情况下,将问题集中在OPT3001的I2C驱动上。

对于I2C总线的数据,我们要用到示波器,这样我们才能抓取到信号,而且必须同时采集SDA和SCL的数据,通常,触发信号放在时钟上面。该如何抓取呢?这里的方式是将示波器调成边下降沿触发模式(因为开始信号是SDA下降沿),并且将触发电平设置成2V(触发电平设置不正确,抓不到波形),便于数据分析。

理论上,如果是3.3V的系统,那么触发电平一般就放在1.5V上下。

下图红色方框中的按钮,设置触发电平。

1

注:除非特殊原因,示波器上的衰减倍率要和表笔上的设置一样。

OPT3001驱动函数

程序利用普通IO口模拟I2C通信,其中SCL通过IO口延时高低电平变化实现,SDA根据SCL状态变化产生起始信号,停止信号,以及实现发送接收数据等。编程环境为IAR,想了解更多IAR,可点击IAR集成开发环境入门

I2C起始函数

主机(只有主机)会发送起始和终止信号,起始和终止信号之间,总线处于被占用状态。

起始信号,终止信号如下:

SCL为高电平时,SDA由高向低的变化,即为起始信号。

SCL为高电平时,SDA由低向高的变化,即为终止信号。

2

I2C时序

我们来看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信号等等。

下图是测到波形:

7

分析图中部分波形可知:

1、由主机发起,在SCL为高电平时,SDA由高到低切变,形成开始信号;

2、接着是7位地址和一位读写标志,这里7位地址为1000100,正是我们代码中设置的地址ID;最后一位为0表示写操作;

8

3、接着在下一个时钟,主机以高电平状态释放SDA,这时从机响应,将SDA拉低了。

结语

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

如果在上文中出现错误之处,还望指正。


您尚未登录, 登入  或  注册  后可查看全部