电力电子技术
直播中

孙原元

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

基于zigbee CC2530的照度计的设计心得

OPT3001环境光传感器利用普通IO口模拟实现I2C通信调试心得

回帖(2)

张坤

2021-1-11 11:49:04
  本项目是一个基于zigbee CC2530的照度计,传感器使用的是TI的OPT3001,开发环境是IAR Embedded Workbench。关于IAR开发环境的搭建可参考《Zigbee开发平台的构建》及《IAR集成开发环境入门》。
  这里采用的是普通IO口模拟实现I2C通信,其中ZigBee-CC2530开发板作为主设备,OPT3001模块作为从设备。
  对于I2C总线,这里就不多阐述了,有兴趣的可点击《I2C总线协议学习笔记》。
  OPT3001模块硬件连接如下图所示:
  
  一般的,OPT3001传感器实现I2C通信流程如下:
  OPT3001通过两个引脚连接到总线:SCL时钟输入引脚和SDA开漏双向数据引脚。总线必须由主设备控制,主设备生成串行时钟(SCL),控制总线访问,并生成启动和停止条件。为了寻址特定器件,主器件通过在SCL为高电平时将数据信号线(SDA)从高逻辑电平拉至低逻辑电平来启动启动条件。总线上的所有从器件都在SCL上升沿的从器件地址字节中移位,最后一位指示是否需要读取或写入操作。在第9个时钟脉冲期间,被寻址的从机通过拉低SDA产生应答位来响应主机。
  然后启动数据传输并发送8位数据,然后发送应答位。在数据传输期间,SDA必须保持稳定,同时SCL为高电平。当SCL为高电平时,SDA的任何变化都被解释为启动或停止条件。当所有数据都被传输时,主机产生停止条件,通过在SCL为高电平时将SDA从低电平拉至高电平来指示。
  
  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信号等等。
举报

胡劝侨

2021-1-11 11:49:19
  调试心得
  使用的是普通IO口模拟I2C总线实现,调试程序的过程中出现了一些问题,在进过修改和改正之后总结了以下需要注意的几点:
  1、为了防止总线被占用,在I2C操作之前,加入I2C总线状态检测,释放总线。待总线释放后,再进行操作。要保证I2C操作最小单元的完整性,不被其他事件(中断、高优先级线程,等)打断。
  
  2、在应答信号和接收字节读数据的时候,一定要将SDA数据线配置为输入:OPT3001IIC_SDA0_I,主机等待从机发送的应答信号。
  
  3、读数据的时候,slave每发送完八个数据位,如果继续读取下一个字节,主机应该回答“ACK”,当从机收到“ACK”时提示从设备准备下一个数据,如果主机不继续读取更多字节,那么主机应该回答“NACK”以提示从设备准备接受stop信号。
  
  4、写数据时,写入的是从设备的子地址,不能和从设备的地址混淆。关于这点,可参考《opt3001环境光传感器调试记录:如何确定器件在IIC总线中的从地址》。
  完整的程序会附在下篇结果分析中,欢迎下载。
举报

更多回帖

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