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