模拟I²C总线多主通信研究与软件设计

[09-13 16:54:12]   来源:http://www.88dzw.com  接口定义   阅读:8820

文章摘要:4 部分源代码本节是在MCU多主通信中的部分源代码。多主通信的实现中有几个难点和重点。一是在作为主节点时的写字节子程序,里面要包括发送的每位数据和总线的数据进行比较并做出判断。如果数据不同,要跳出并进入从节点的状态。由于子程序返回主程序时改变的只是PC的值而累加器(ACC)和工作寄存器(Ri)里面的值是不变的,因此MCU进入从机状态后继续接收总线剩下的数据,这样总线的数据并没有丢失。二是作为从节点时的写字节的子程序。由于时钟线是由主节点的MCU控制的,所以怎样根据SCL线来读取SDA线的数据是其中的一个难点。三是在具有子地址的从节点关于是写字节还是读字节时的判断。如果是写字节时主节点会给出新

模拟I²C总线多主通信研究与软件设计,标签:接口技术,微机原理与接口技术,http://www.88dzw.com

  4  部分源代码

  本节是在MCU多主通信中的部分源代码。多主通信的实现中有几个难点和重点。一是在作为主节点时的写字节子程序,里面要包括发送的每位数据和总线的数据进行比较并做出判断。如果数据不同,要跳出并进入从节点的状态。由于子程序返回主程序时改变的只是PC的值而累加器(ACC)和工作寄存器(Ri)里面的值是不变的,因此MCU进入从机状态后继续接收总线剩下的数据,这样总线的数据并没有丢失。二是作为从节点时的写字节的子程序。由于时钟线是由主节点的MCU控制的,所以怎样根据SCL线来读取SDA线的数据是其中的一个难点。三是在具有子地址的从节点关于是写字节还是读字节时的判断。如果是写字节时主节点会给出新的起始信号,并再次发送从节点的地址数据。这时从节点需要做出判断是读取数据还是写数据,并进入相应的子程序。这里给出以上三个重点和难点的子程序的源代码,以供读者参考。这些源代码经实践证明都是正确的。

  主节点的写字节子程序:

  ;其中的NOP可根据时钟的快慢自己加减

  WRBYTE:MOV R0,#08H

  CLR BUSY;将BUSY值清零

  WLP:  RLC A;取数据位

  JC   WR1

  SJMP WR0;判断数据位

  WLP1: DJNZ R0,WLP

  NOP

  OUT1: RET

  WR1:  SETB SDA;发送1

  NOP

  SETB  SCL

  MOV  C,SDA;判断是否与发送的数据相同

  JC   GOON

  SETB  BUSY

  AJMP  OUT1

  GOON: NOP

  NOP

  NOP

  CLR SCL

  SJMP WLP1

  WR0:  CLR SDA;发送0

  NOP

  SCL

  NOP

  NOP

  NOP

  NOP

  NOP

  CLR

  SCL

  SJMP  WLP1

  从节点的写字节子程序(返回为ACK):

  SWRBYTE:MOV R0,#08H

  WAGAIN: RRC A

  MOV B,#37H

  WWAIT1: JB SCL,WWAIT1;等待SCL为低

  JC WR1;判断是发送“1”还是发送“0”

  SETB SDA;发送“1”

  AJMP COM

  WR1:  CLR SDA;发送“0”

  COM:  DJNZ R0,WWAIT2;判断是否发送完毕

  WWAIT3: JNB SCL,WWAIT3;发送完毕等待应答信号

  WWAIT4: JB SCL,WWAIT4

  WWAIT5: JNB SCL,WWAIT5

  CLR ACK

  JB  SDA,ST0

  SETB ACK

  ST0:  RET;返回

  WWAIT2: JNB SCL,WWAIT2;等待SCL为高

  SJMP WAGAIN

  从节点的读字节同时判断是否有起始信号的子程序。如果有起始信号,则转为写字节子程序:

  SRDBYTE:MOV R0,#08H

  SETB 20H;设置标志位判断是读还是写

  SETB SDA;释放总线

  RWAITJ: JNB SCL,RWAITJ;等待SCL为高

  MOV C,SDA;从总线上读取数据

  RRC A;存入累计器

  DEC R0

  MOV C,ACC.7;判断是否为起始信号

  JNC RWAITJ1;为低继续读取数据

  REWAIT: JNB SCL,RWAITJ1;开始判断是否为起始信号

  JB  SDA,REWAIT

  CLR 20H;是,则清标志位并返回

  AJMP SjRDOUT

  RWAITJ1:JB SCL,RWAITJ1;等待SCL为低

  RWAITJ3:JNB SCL,RWAITJ3;等待SCL为高

  MOV C,SDA

  RRC A

  DJNZ R0,RWAITJ2

  SjRDOUT:RET

  RWAITJ2:JB SCL,RWAITJ2;等待SCL为低继续读数据

  SJMP RWAITJ3

  5  总结

  根据总线协议中的仲裁原理,提出的基于延时比较的模拟I2C多主通信的方法,不仅能够体现了I2C总线的高效性,而且还具有良好的扩展性。它使普通不具有I2C接口的MCU可以应用在多主通信的系统中,既增加了普通MCU的使用范围,又突破了模拟I2C总线的应用局限性,为I2C总线的推广起到了积极的作用。(作者:  西安电子科技大学 郑旭阳 李兵兵 黄新平 )


上一页  [1] [2] [3] 


Tag:接口定义接口技术,微机原理与接口技术接口定义

《模拟I²C总线多主通信研究与软件设计》相关文章

分类导航
最新更新
热门排行