模擬I2C總線多主節(jié)點通信原理及實現(xiàn)方法
MOV B,#37H
WWAIT1: JB SCL,WWAIT1;等待SCL為低
JC WR1;判斷是發(fā)送“1”還是發(fā)送“0”
SETB SDA;發(fā)送“1”
AJMP COM
WR1: CLR SDA;發(fā)送“0”
COM: DJNZ R0,WWAIT2;判斷是否發(fā)送完畢
WWAIT3: JNB SCL,WWAIT3;發(fā)送完畢等待應(yīng)答信號
WWAIT4: JB SCL,WWAIT4
WWAIT5: JNB SCL,WWAIT5
CLR ACK
JB SDA,ST0
SETB ACK
ST0: RET;返回
WWAIT2: JNB SCL,WWAIT2;等待SCL為高
SJMP WAGAIN
從節(jié)點的讀字節(jié)同時判斷是否有起始信號的子程序。如果有起始信號,則轉(zhuǎn)為寫字節(jié)子程序:
SRDBYTE:MOV R0,#08H
SETB 20H;設(shè)置標志位判斷是讀還是寫
SETB SDA;釋放總線
RWAITJ: JNB SCL,RWAITJ;等待SCL為高
MOV C,SDA;從總線上讀取數(shù)據(jù)
RRC A;存入累計器
DEC R0
MOV C,ACC.7;判斷是否為起始信號
JNC RWAITJ1;為低繼續(xù)讀取數(shù)據(jù)
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為低繼續(xù)讀數(shù)據(jù)
SJMP RWAITJ3
5 總結(jié)
根據(jù)總線協(xié)議中的仲裁原理,提出的基于延時比較的模擬I2C多主通信的方法,不僅能夠體現(xiàn)了I2C總線的高效性,而且還具有良好的擴展性。它使普通不具有I2C接口的MCU可以應(yīng)用在多主通信的系統(tǒng)中,既增加了普通MCU的使用范圍,又突破了模擬I2C總線的應(yīng)用局限性,為I2C總線的推廣起到了積極的作用
評論