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