完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
通过本次OPT3001驱动调试,了解到I2C通信遵守操作时序的重要性。在通讯不能成功时,可加入死循环函数,检验发送、接收信号是否正常,从而帮助锁定错误。
如果在上文中出现错误之处,还望指正。 |
|
相关推荐
4个回答
|
|
一般当我们拿到一个I2C设备时,就必须涉及到驱动的编写,就比如对于OPT3001来说,就要用编写OPT3001驱动,这样我们才能控制它。
OPT3001模块 我们所用的是ZigBee-CC2530开发板与OPT3001模块,将OPT3001模块采集到的照度值传送到ZigBee-CC2530模块显示,但显示不出照度值,在检测了硬件及ZigBee-CC2530软件没有问题的情况下,将问题集中在OPT3001的I2C驱动上。 对于I2C总线的数据,我们要用到示波器,这样我们才能抓取到信号,而且必须同时采集SDA和SCL的数据,通常,触发信号放在时钟上面。该如何抓取呢?这里的方式是将示波器调成边下降沿触发模式(因为开始信号是SDA下降沿),并且将触发电平设置成2V(触发电平设置不正确,抓不到波形),便于数据分析。 理论上,如果是3.3V的系统,那么触发电平一般就放在1.5V上下。 |
|
|
|
|
|
|
|
OPT3001驱动函数
程序利用普通IO口模拟I2C通信,其中SCL通过IO口延时高低电平变化实现,SDA根据SCL状态变化产生起始信号,停止信号,以及实现发送接收数据等。编程环境为IAR,想了解更多IAR,可点击IAR集成开发环境入门。 I2C起始函数 主机(只有主机)会发送起始和终止信号,起始和终止信号之间,总线处于被占用状态。 起始信号,终止信号如下: 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信号等等。 下图是测到波形: 分析图中部分波形可知: 1、由主机发起,在SCL为高电平时,SDA由高到低切变,形成开始信号; 2、接着是7位地址和一位读写标志,这里7位地址为1000100,正是我们代码中设置的地址ID;最后一位为0表示写操作; 3、接着在下一个时钟,主机以高电平状态释放SDA,这时从机响应,将SDA拉低了。 |
|
|
|
只有小组成员才能发言,加入小组>>
771 浏览 1 评论
990 浏览 1 评论
12426 浏览 0 评论
5881 浏览 3 评论
17672 浏览 6 评论
995浏览 1评论
970浏览 1评论
782浏览 1评论
3781浏览 1评论
994浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 21:33 , Processed in 0.808360 second(s), Total 55, Slave 47 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号