思路其实蛮简单的。 我们知道,I2C对时序要求是严格的,但对时间没有要求,即每一个动作之间的时间间隔没有要求,于是,我们可以把每一个动作放慢到我们利于肉眼可以观测的速度,并用LED来显示每一个步骤及端口的电位变化。 具体说来,就是将每一步SDA及SCL端口的电位,送入另外的两个端口,这两个端口分别接有LED,比如,我们用P1.0作为总线的SCL端口,用P1.2作为SDA端口,用P1.5作为SCL电位显示的端口(标记为LSCL),用P1.6作为SDA电位显示的端口(标记为LSDA);用P2作为发送或接收的数据的显示端口,每发送一位或接收一位,就显示在P2端口的LED上。 如果你自己搭建电路,需要注意的是,SDA和SCL端口一定要接上拉电阻。 每一步延时的时间,可以设为1s,看你自己喜欢。 编写程序时,我们可以直接写入器件寻址及写入器件命令值10100000B值,最后通过观测LSDA的亮灭来检验你的程序是否正确。 对于初练I2C的人来说,建议先一步步硬写这段程序,程序流程如下: 置SDA高电位; SDA送入LSDA; 置SCL高电位; SCL送入LSDA; 延时; 置SDA低电位;取得总线控制权 LSDA=SDA; 延时; 置SCL为0;为SDA上放数据作好准备 LSCL=SCL; 延时; 置SDA为1;数据的第7位 LSDA=SDA; P2.7=SDA;送入数据显示LED最高位 短延时;有几个空操作就够了 SCL=1; LSCL=SCL; DELAY1S; SCL=0; LSCL=SCL; DELAY1S; 以上第7位就发送完了,按上面从“置SDA为1”开始的程序,将剩下的7位全部发送完成,这样就将10100000B发送完成。然后,运行并观测所有LED灯的显示是否符合你的设计,最终LSDA应处于灭状态。如果你送入的是10100001B(读)数值,则最后LSDA处于亮状态。 没问题后,再加写三条程序 SDA=1; LSDA=SDA; DELAY1S; 再运行,完成后LSDA应处于灭状态。 没问题后,再加写以下程序: SCL=1; LSCL=SCL; DELAY1S; LSDA=SDA; DELAY1S; 再运行,完成后LSDA依然处于灭状态。 再加写以下程序: SCL=0; LSCL=SCL; DELAY1S; LSDA=SDA; DELAY1S; 再运行,完成后LSDA处于亮状态。说明从器件是在SCL的下降沿读取SDA的值。 至此,我们的实验基本就算达成了目的,后面的写数据也好读数据也好,在此基础上编写就是了。 此慢动作的方法,其实适用于任何数据传输协议的探究与学习,无非是对于固定波特率的协议,在编程中进行人为加个放大的时间倍率就是了。 前面有个贴子,说是教科书中有错误,而这个试验,就是对其的论证。 另外说明一下,上面的流程,即不是C也不是汇编,你按这个流程,选择你喜欢的语言来编程就是了。还有你可以输入10100001B来一步一步地试验。
|