完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本项目是一个基于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信号等等。 |
|
|
|
调试心得
使用的是普通IO口模拟I2C总线实现,调试程序的过程中出现了一些问题,在进过修改和改正之后总结了以下需要注意的几点: 1、为了防止总线被占用,在I2C操作之前,加入I2C总线状态检测,释放总线。待总线释放后,再进行操作。要保证I2C操作最小单元的完整性,不被其他事件(中断、高优先级线程,等)打断。 2、在应答信号和接收字节读数据的时候,一定要将SDA数据线配置为输入:OPT3001IIC_SDA0_I,主机等待从机发送的应答信号。 3、读数据的时候,slave每发送完八个数据位,如果继续读取下一个字节,主机应该回答“ACK”,当从机收到“ACK”时提示从设备准备下一个数据,如果主机不继续读取更多字节,那么主机应该回答“NACK”以提示从设备准备接受stop信号。 4、写数据时,写入的是从设备的子地址,不能和从设备的地址混淆。关于这点,可参考《opt3001环境光传感器调试记录:如何确定器件在IIC总线中的从地址》。 完整的程序会附在下篇结果分析中,欢迎下载。 |
|
|
|
只有小组成员才能发言,加入小组>>
798 浏览 1 评论
999 浏览 1 评论
12431 浏览 0 评论
5882 浏览 3 评论
17674 浏览 6 评论
996浏览 1评论
971浏览 1评论
801浏览 1评论
3837浏览 1评论
999浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 02:14 , Processed in 0.958077 second(s), Total 81, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号