- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
I2C总线多主通信研究与软件设计
图4 多主通信流程
图4给出了基于延时比较的多主通信流程,其中MCU作为从节点部分的流程在图5中给出。在节点发送起始信号之前先要检测一下总线上是否为空闲状态(BUSY是否为0)。这里使用的检测方法是,持续检测一段时间看总线上的电平是否一直为高,若是说明总线上为闲状态,否则说明有其他的节点正在使用总线,要等一段时间再发送。当总线空闲时,发送起始信号,接着发送要访问的从节点的地址字节。每发送1位数据就接收比较1次,看发送和接收的是否一致,若是则继续,否则跳出到从节点的接收状态。如果没有产生冲突,MCU作为主节点继续发送数据,直到任务结束,然后发送停止信号并返回。如果数据不一样,MCU将跳转到从节点状态。由于在跳转到从节点接收状态的过程中累加器(ACC)和工作寄存器(Ri)的数据没有发生变化,所以数据没有丢失,作为从节点可以继续接收总线上的数据。这样整个通信的过程没有中断,数据也没有丢失。
图5 从节点部分的流程
图5给出了从节点的流程。进入从节点时,要将BUSY置为高,说明MCU现在正在工作,不能完成其他的任务。在MCU作为从节点完成接收任务后,要将BUSY置为低。MCU在接收到寻址字节后与自己的地址字节进行比较。如果是访问自己的就进入到下面的接收程序,否则跳出。在访问自己的时候,还要判断主节点是读取数据还是写数据,以便进入相应的程序。在写字节的子程序中,从节点每发送1个字节的数据后都要察看是否有应答信号(ACK),有则说明数据接收到了;否则要跳出等待,重新发送。在读字节的子程序中,每接收1个字节的数据就要发送1个应答信号(ACK),以示接收正常,否则主节点将停止继续发送。在现有的资料中,关于从节点的原理和源代码比较少,这里给出作为从节点时写字节子程序的源代码。由于篇幅有限其他的子程序没有列出。
4 部分源代码
本节是在MCU多主通信中的部分源代码。多主通信的实现中有几个难点和重点。一是在作为主节点时的写字节子程序,里面要包括发送的每位数据和总线的数据进行比较并做出判断。如果数据不同,要跳出并进入从节点的状态。由于子程序返回主程序时改变的只是PC的值而累加器(ACC)和工作寄存器(Ri)里面的值是不变的,因此MCU进入从机状态后继续接收总线剩下的数据,这样总线的数据并没有丢失。二是作为从节点时的写字节的子程序。由于时钟线是由主节点的MCU控制的,所以怎样根据SCL线来读取SDA线的数据是其中的一个难点。三是在具有子地址的从节点关于是写字节还是读字节时的判断。如果是写字节时主节点会给出新的起始信号,并再次发送从节点的地址数据。这时从节点需要做出判断是读取数据还是写数据,并进入相应的子程序。这里给出以上三个重点和难点的子程序的源代码,以供读者参考。这些源代码经实践证明都是正确的。
来源:维库开发网
上一篇:基于FPGA的DDFS与DDWS两种实现方式
下一篇:海上地震探测传输系统的设计