新聞中心

        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



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 三门峡市| 孟津县| 乌鲁木齐市| 霍林郭勒市| 霍山县| 肥西县| 冕宁县| 怀安县| 建湖县| 阳西县| 稻城县| 永平县| 澎湖县| 灌南县| 旌德县| 洪湖市| 平远县| 新干县| 肥东县| 莱阳市| 德兴市| 巴彦淖尔市| 鹤壁市| 山东| 汉沽区| 南部县| 襄垣县| 三台县| 海安县| 永仁县| 自治县| 兴国县| 杂多县| 大连市| 德清县| 刚察县| 富阳市| 清镇市| 洱源县| 镇康县| 疏附县|