分享

初学单片机,可别自顾自的发送,对方跟得上吗?细说I2C的ACK信号

 xpxys99 2017-10-27 发布于江苏

对于一位单片机初学者,最容易做的是走捷径,找到一份现成的代码来用。当我们在网上找到一份别人的程序代码参考的时候,往往会遇到很多问题。要么是功能和我们想要的不完全一样,要么是实际使用中出现各种问题,究其原因,大多是在细节上存在偏差。那么我们最好的解决方法就是自己对照器件手册,来分析如何改进(修正)现有的代码,才能适合我们自己的设计需要。当然,我们的目标是完全可以根据器件手册自己编写源代码。

前面我们的两篇短文聊到了如何对照24cxx的器件手册编写程序,开始只是一个小意念,没想到其内容很多,一时写不完。今天接前面两篇短文,继续聊如何阅读理解24cxx器件手册里的信息。

还是用图说话:

初学单片机,可别自顾自的发送,对方跟得上吗?细说I2C的ACK信号

从上图中可以看到很多信息:

总线从机地址设置:之所以叫总线,就是两根线可以并接多个器件。线路板上用A0/A1/A2这些管脚设置,程序里用地址(高位)来区分。当然只接一片24cxx的时候程序里的地址同样要和线路板上的连接方式对应一致。

24cxx的WP管脚:在实际电器产品中,个别厂家对此保护加以利用,其产品对应部位故障率非常低。也就是说在读写器件的时候关闭保护,平常启用保护。

页写缓冲器:这是大多数初学者忽视的东西,当然对于24c08~16基本不存在这个问题,大多设置为8字节,但是对于02来说就要修改为2字节。

存储容量:24c04的容量超过了256字节,一个字节的地址已经不够用了,所以占用了A0,只能用A1、A2,也就是说,24c04最多外接两位二进制数的从机(24c04),也就是3个。

另外,24c32以上用法跟24c16以下的用法稍有不同,相信在弄明白如何看懂器件手册的情况下,那都不是问题,包括SPI等。


由于24cxx不需要单独的擦除命令,在写入的时候会自动擦除要写入的地址的数据,那么写入是需要时间的,不会像单片机发送数据那么快,因此,每发送完一个“写”命令或数据字节,都需要查询24cxx是否“忙完”?这就是ACK信号。

ACK信号:单片机先释放端口(SDA = 1),SCK当然要打开(SCK = 1),当24cxx处理完前面的“写工作”,也就是空闲了,就会自动下拉SDA(SDA = 0),这时单片机不断查询SDA,当检测到低电平时,就可以继续下一个操作。

如果24cxx器件损坏,SDA一直等于1,则程序会进入死循环,因此需要加入计数(计时)来规避此现象发生。

请看下图详细标注:

初学单片机,可别自顾自的发送,对方跟得上吗?细说I2C的ACK信号

从上图可以看出,器件手册给出的是完整的查询ACK流程,但是我们在写程序的时候一般只是在写指令后面做简单的等待查询,这并不影响实际操作。

等待时间是有据可查的,字节编程模式下,最大时间是1ms,对于高速单片机需要加入延时函数,普通89C51/2只要计数就可以。当然等待时间也不能随意设置的太长,否则影响单片机整个运行时间。

(注意:不同品牌器件参数不同,应以手册和实际调试为准。取值较大可适应更大范围,实际相差20倍都有。)

另外,编写程序通常把ACK函数和Send函数放在一起,这里暂不详述。

以上分别分析了24cxx作为从机的地址设置,以及ACK忙信号查询的函数写法,希望对初学者有用。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多