新闻中心

EEPW首页 > 手机与无线通信 > 设计应用 > 模拟I2C总线多主节点通信原理及实现方法

模拟I2C总线多主节点通信原理及实现方法

作者:时间:2010-12-14来源:网络收藏

  图5给出了从的流程。进入从时,要将BUSY置为高,说明MCU现在正在工作,不能完成其他的任务。在MCU作为从完成接收任务后,要将BUSY置为低。MCU在接收到寻址字节后与自己的地址字节进行比较。如果是访问自己的就进入到下面的接收程序,否则跳出。在访问自己的时候,还要判断主节点是读取数据还是写数据,以便进入相应的程序。在写字节的子程序中,从节点每发送1个字节的数据后都要察看是否有应答信号(ACK),有则说明数据接收到了;否则要跳出等待,重新发送。在读字节的子程序中,每接收1个字节的数据就要发送1个应答信号(ACK),以示接收正常,否则主节点将停止继续发送。在现有的资料中,关于从节点的和源代码比较少,这里给出作为从节点时写字节子程序的源代码。由于篇幅有限其他的子程序没有列出。

  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



评论


相关推荐

技术专区

关闭