首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

模拟I2C总线多主通信研究与软件设计(2)

模拟I2C总线多主通信研究与软件设计(2)

  主节点的写字节子程序:
;其中的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总线的推广起到了积极的作用。
继承事业,薪火相传
返回列表