侯鳳云 蔡曉龍
摘 要 隨著嵌入式系統(tǒng)主頻的提高,串行通信的地位逐步提高。STM32的同步串行口IIC通信效率高,占用資源少。本文介紹了STM32的IIC通信的教學(xué)方法,以24C02為從機,解析了STM32和24C02之間模擬IIC通信的實現(xiàn)過程。首先敘述了IIC通信基礎(chǔ),然后分析了STM32和24C02的接口電路設(shè)計,最后是軟件的實現(xiàn)。
關(guān)鍵詞 STM32 IIC通信 課堂教學(xué)
0引言
IIC 即Inter-Integrated Circuit(集成電路總線),是由飛利浦半導(dǎo)體公司在八十年代初設(shè)計出來的一種簡單、雙向、二線制、同步串行總線。
IIC是多向控制總線,也就是說多個芯片可以連接到同一總線結(jié)構(gòu)下,同時每個芯片都可以作為實時數(shù)據(jù)傳輸?shù)目刂圃?,簡化了信號傳輸總線接口。IIC總線是各種總線中使用信號線最少,并具有自動尋址、多主機時鐘同步和仲裁等功能的總線。使用IIC總線搭建計算機系統(tǒng)方便靈活,體積小,隨著嵌入式系統(tǒng)主頻的提高,IIC在嵌入式系統(tǒng)中得到了廣泛應(yīng)用。
1 STM32的IIC通信基礎(chǔ)
1.1 IIC總線結(jié)構(gòu)
IIC總線一般有兩根信號線,數(shù)據(jù)線SDA和時鐘線SCL。IIC總線是多主機的總線,所有接到IIC總線上的設(shè)備數(shù)據(jù)線都接到總線的SDA上,各設(shè)備的時鐘線接到總線的SCL上,連接關(guān)系如圖1所示。
多主機情況由總線仲裁功能解決,主機能夠控制信號的傳輸和時鐘頻率,任何時間點上只能有一個主機。每個連接到總線的器件可以通過唯一的地址和主機聯(lián)系,主機可以是發(fā)送器或接收器。一般情況下SDA、SCL接上拉電阻,實現(xiàn)電平的轉(zhuǎn)換以及提高驅(qū)動能力,當總線空閑時這兩條線路都是高電平。
IIC時序是SCL和SDA兩根信號線上的電平變化順序,IIC正常通信時必須遵守一定的時序要求,時序信號如圖2所示。
根據(jù)時序圖進行分析:總線空閑狀態(tài)時,SDA和SCL兩條信號線都處于高電平,即總線上所有的器件都釋放總線;啟動信號START,時鐘信號SCL保持高電平,數(shù)據(jù)信號SDA的電平被拉低(即負跳變)。啟動信號必須是跳變信號,而且在建立該信號前必修保證總線處于空閑狀態(tài);停止信號STOP,時鐘信號SCL保持高電平,數(shù)據(jù)線被釋放,使得SDA返回高電平(即正跳變),停止信號也必須是跳變信號;數(shù)據(jù)傳輸過程中,數(shù)據(jù)線SDA上的數(shù)據(jù)狀態(tài)在時鐘線SCL的高電平期間必須保持穩(wěn)定,只有在SCL線為低電平期間,SDA上的電平允許變化;應(yīng)答信號ACK,IIC總線的數(shù)據(jù)都是以字節(jié)(8位)的方式傳送的,發(fā)送器件每發(fā)送一個字節(jié)之后,在SCL的第9個脈沖期間釋放數(shù)據(jù)總線,由接收器發(fā)送一個ACK(把數(shù)據(jù)總線的電平拉低)來表示數(shù)據(jù)成功接收;無應(yīng)答信號NACK,在SCL的第9個脈沖期間發(fā)送器釋放數(shù)據(jù)總線,接收器不拉低數(shù)據(jù)總線表示一個NACK,NACK有兩種用途,一種表示接收器未成功接收數(shù)據(jù)字節(jié),另一種是當接收器是主機時,接收到最后一個字節(jié)后,發(fā)送一個NACK信號,通知發(fā)送器結(jié)束數(shù)據(jù)發(fā)送,主機發(fā)送停止信號STOP。
2 IIC的接口電路設(shè)計
以24C02為例介紹IIC的接口電路,24C02是一種256B的可電擦除EEPROM,通過IIC協(xié)議與STM32進行通信,讀寫方便,廣泛應(yīng)用于智能儀器、汽車電子、家用電器等場合。
接口電路如圖3所示。24C02的A2、A1、A0為地址位,用于級聯(lián),由于電路中僅1片24C02,3個端口接地即可;WP為寫保護,接地時可進行讀、寫操作;24C02的SCL是時鐘線,SDA是信號線,分別接STM32的PB10、PB11端子,并且外接上拉電阻至3.3V電源。
STM32的PB10、PB11也是硬件IIC接口,為了靈活選用端子、方便移植,這里采用模擬IIC方式通信。
通過操作兩個I/O端口的高、低電平滿足時序要求,從而實現(xiàn)IIC通信,就是模擬IIC。下面介紹軟件的實現(xiàn)過程。
3軟件實現(xiàn)
3.1 IIC尋址方式
圖3中24C02的地址以字節(jié)表示。地址字節(jié)的高7位表示從機地址,其中高4位屬于固定地址,由廠家統(tǒng)一規(guī)定;低3位為引腳設(shè)定地址,由外部引腳電平狀態(tài)來設(shè)定。圖3中的IIC設(shè)備是AT24C02,高4位由廠家規(guī)定為1010,低3位是000。
地址字節(jié)的最低位(LSB)是讀/寫控制位,0表示主機向從機寫入信息,1表示主機由從機讀取信息。
3.2 IIC通信流程
IIC通信包括寫入和讀取兩個過程,以啟動信號START來掌控總線,以停止信號STOP來釋放總線;每次通信以START開始,以STOP結(jié)束。每個數(shù)據(jù)字節(jié)在傳送時都是高位(MSB)在前。注意編寫程序時,參考STM32用戶手冊中IIC通信要求的精確時序,可采用SysTick定時器。
寫入的通信流程如下:
(1)主機在檢測到總線空閑的狀況下,發(fā)出START信號。
(2)發(fā)送一個地址字節(jié)(上述例子的地址是10100000),表示寫入,等待從機應(yīng)答信號ACK。
(3)主機收到ACK后,發(fā)送要寫入的器件地址單元,等待從機應(yīng)答信號ACK。
(4)主機收到ACK后,開始發(fā)送第一個數(shù)據(jù)字節(jié)。
(5)從機收到數(shù)據(jù)字節(jié)后發(fā)送一個ACK表示繼續(xù)傳送數(shù)據(jù),發(fā)送NACK表示傳送數(shù)據(jù)結(jié)束。
(6)主機發(fā)送全部數(shù)據(jù)后,發(fā)出STOP信號,結(jié)束通信并且釋放總線。
讀取的通信流程如下:
(1)主機在檢測到總線空閑的狀況下,發(fā)出START信號。
(2)發(fā)送一個地址字節(jié)(上述例子的地址是1010000),等待從機應(yīng)答信號ACK。
(3)主機收到ACK后,發(fā)送要讀取的器件地址單元,等待從機應(yīng)答信號ACK。
(4)主機收到ACK后,啟動START信號,發(fā)送一個地址字節(jié)(上述例子的地址是10100001),表示接收,等待從機應(yīng)答信號ACK。
(5)主機收到ACK后釋放數(shù)據(jù)總線,開始接收第一個數(shù)據(jù)字節(jié)。
(6)主機收到數(shù)據(jù)后發(fā)送ACK表示繼續(xù)傳送數(shù)據(jù),發(fā)送NACK表示傳送數(shù)據(jù)結(jié)束。
(7)主機接收全部數(shù)據(jù)后,發(fā)出STOP信號,結(jié)束通信并且釋放總線。
根據(jù)上述IIC的通信流程和時序要求,進行程序的編寫,會用到下列函數(shù):啟動信號函數(shù)、停止信號函數(shù)、等待應(yīng)答函數(shù)、產(chǎn)生應(yīng)答函數(shù)、不產(chǎn)生應(yīng)答函數(shù)、發(fā)送字節(jié)函數(shù)、接收字節(jié)函數(shù)等,不一一列寫。
4小結(jié)
實現(xiàn)模擬IIC通信,重點是先理解IIC的通信時序,根據(jù)IIC通信器件要求設(shè)計硬件接口電路,然后弄清楚讀取和寫入的通信流程,完成程序的編寫。通過實驗?zāi)軌蜻M一步理解和掌握模擬IIC通信方法。