宣 慧,孫佳昊,程 實,蔡艷婧,胡傳志
(1. 通富微電子股份有限公司,江蘇 南通 226000;2. 江蘇大學(xué) 計算機(jī)科學(xué)與通信工程學(xué)院,江蘇鎮(zhèn)江 212013;3. 南通大學(xué) 江蘇省專用集成電路設(shè)計重點實驗室,江蘇 南通 226000;4. 南通大學(xué) 信息科學(xué)與技術(shù)學(xué)院,江蘇 南通 226000;5. 江蘇商貿(mào)職業(yè)技術(shù)學(xué)院 電子與信息學(xué)院,江蘇 南通 226000)
I2C(inter-integrated circuit)總線,主要用于電路板內(nèi)集成電路之間的連接,是由PHILIPS 公司開發(fā)的一種同步串行總線協(xié)議。I2C 總線因為協(xié)議成熟、引腳簡單、傳輸速率高,已經(jīng)成為世界性的工業(yè)標(biāo)準(zhǔn),被大多數(shù)的芯片廠家采用。嵌入式系統(tǒng)中常用該總線來連接存儲器[1-3]、傳感器[4-5]和交互設(shè)備[6-7]等,因此I2C 總線實驗就成了嵌入式系統(tǒng)實驗教學(xué)中極重要的一個環(huán)節(jié)。I2C 總線編程要點在于掌握I2C 總線的數(shù)據(jù)幀格式,本文以TI 公司的TM4C123GH6PM 微控制器通過 I2C 總線接口讀寫 LM75A 溫度傳感器為例,以TivaWare 函數(shù)庫中的I2C 總線API 函數(shù)為工具,研究I2C 總線的實驗設(shè)計方法
為了使硬件效益最大和電路最簡單,PHILIPS 公司開發(fā)了一個簡單的雙向兩線總線,實現(xiàn)有效的 IC之間控制,該總線稱為Inter IC 或I2C 總線[8],具有以下一些顯著特征。
(1)只要求兩條總線線路。一條串行數(shù)據(jù)線SDA,一條串行時鐘線SCL。
(2)對各器件的尋址是軟尋址方式,因此節(jié)點上沒有必需的片選線[9]。
(3)是一個真正的多主機(jī)總線,帶有沖突檢測和仲裁,防止多個主機(jī)同時開始數(shù)據(jù)傳輸時破壞數(shù)據(jù)。
(4)串行的8 位雙向數(shù)據(jù)傳輸,位速率在標(biāo)準(zhǔn)模式下可達(dá)100 kbit/s,快速模式下可達(dá)400 kbit/s,高速模式下可達(dá)3.4 Mbit/s。
I2C 總線上的設(shè)備分為主機(jī)(也稱為主控器)和從機(jī)(也成為被控器),主機(jī)和從機(jī)都既可以是數(shù)據(jù)的發(fā)送方,也可以是數(shù)據(jù)的接收方。主機(jī)提供時鐘信號,對總線時序進(jìn)行控制,一般由微控制器擔(dān)任主機(jī);總線上除主機(jī)外的其他設(shè)備都是從機(jī),一般來說是外圍器件。主機(jī)通過從機(jī)地址訪問從機(jī),從機(jī)之間無法通信,任何數(shù)據(jù)傳輸都必須通過主機(jī)進(jìn)行。在標(biāo)準(zhǔn)的I2C總線中,從機(jī)地址被定義為7 位,擴(kuò)展I2C 總線允許10 位從機(jī)地址。
某一I2C 總線的系統(tǒng)結(jié)構(gòu)如圖1 所示,通過沖突檢測,主機(jī)1 在查看總線空閑的情況下(即主機(jī)2 不在使用總線),發(fā)送一個開始信號,啟動一次數(shù)據(jù)傳輸,先對從機(jī)尋址,再在總線上傳輸數(shù)據(jù)。數(shù)據(jù)以字節(jié)為單位,每傳送一個字節(jié)后都必須跟一個應(yīng)答位,由接收方回答,所以I2C 總線上的數(shù)據(jù)幀為8 加1 的格式。
圖1 某一I2C 總線系統(tǒng)結(jié)構(gòu)圖
I2C 總線上的信號類型有以下5 個:
(1)開始信號(START),由主機(jī)產(chǎn)生,用來建立通信,從此總線將處于忙狀態(tài),直至結(jié)束通信;
(2)停止信號(STOP),由主機(jī)產(chǎn)生,用來結(jié)束通信,此后總線將處于空閑狀態(tài);
(3)重新開始信號(RESTART),由主機(jī)產(chǎn)生,用于改變上次開始時所建立的數(shù)據(jù)傳輸方向或目的從機(jī);
(4)應(yīng)答信號(ACK),由接收方產(chǎn)生,表示收到數(shù)據(jù);
(5)非應(yīng)答信號(NO ACK),由接收方產(chǎn)生,如果是從機(jī)作為接收方發(fā)送非應(yīng)答信號,那么主機(jī)認(rèn)為此次數(shù)據(jù)傳輸失??;如果是主機(jī)作為接收方發(fā)送非應(yīng)答信號,那么從機(jī)認(rèn)為數(shù)據(jù)傳輸結(jié)束,不再往總線上放數(shù)據(jù)。
I2C 總線上的數(shù)據(jù)幀格式如圖 2 所示,一個標(biāo)準(zhǔn)的I2C 通信由4 部分組成:開始信號、從機(jī)地址傳輸、數(shù)據(jù)傳輸和停止信號。開始信號后的第一個字節(jié)為尋址字節(jié),由7 位的從機(jī)地址加1 位方向位構(gòu)成,方向位為0 表示主機(jī)寫,方向位為1 表示主機(jī)讀。每傳送一個字節(jié)后都必須跟隨一個應(yīng)答位,每次通信的數(shù)據(jù)字節(jié)數(shù)沒有限制,在全部數(shù)據(jù)傳送結(jié)束后,由主機(jī)發(fā)送停止信號,結(jié)束通信。
圖2 I2C 總線數(shù)據(jù)幀格式
實驗中,以TI 公司的TM4C123GH6PM 微控制器作為主機(jī),以LM75A 溫度傳感器作為從機(jī),建立I2C總線連接,TM4C123GH6PM通過I2C 總線讀取LM75A檢測到的溫度值。硬件電路見圖3。
圖3 硬件電路
TM4C123GH6PM 是 TI 公司的 TM4C123x 系列的微控制器,工作主頻可達(dá) 80 MHz,采用 ARM Cortex-M4 浮點內(nèi)核。配備有4 個I2C 模塊,每個模塊既可以作為主機(jī),也可以作為從機(jī),本實驗中將I2C1模塊用作主機(jī),其中SDA 和SCL 為引腳PA7 和PA6的復(fù)用功能[10]。
LM75A 是一個帶有I2C 總線接口的溫度傳感器,只能用作從機(jī)。微控制器可以通過 I2C 總線直接讀寫其內(nèi)部寄存器:即溫度寄存器、配置寄存器、THYST寄存器和TOS 寄存器[11]。
除了以上 4 個寄存器以外,LM75A 還有一個 8位的指針寄存器,高 6 位等于0,低2 位是其他4 個寄存器的指針值。指針寄存器對用戶來說是不可訪問的,但通過將指針數(shù)據(jù)放置到總線命令中可以用來選擇需要讀寫的寄存器,其中00 是溫度寄存器的指針,01 是配置寄存器的指針,10 是THYST 寄存器的指針,11 是TOS 寄存器的指針。
溫度寄存器是16 位的只讀寄存器,其中D0—D6為全零,D7—D15 保存當(dāng)前溫度值,這9 位以二進(jìn)制補(bǔ)碼數(shù)據(jù)的形式存放分辨率為0.5 ℃的溫度值。其中D8—D15 為整數(shù)部分,D7 為小數(shù)部分。
LM75A 在總線上的7 位從機(jī)地址由兩部分構(gòu)成,其中低3 位由外部引腳A2、A1 和A0 的邏輯值定義,高4 位由內(nèi)部硬連線預(yù)先設(shè)置為“1001”,因此地址范圍是0X48—0X4F。實驗中將 A2、A1 和A0 全部接地,因此地址為0X48。
通過 I2C 總線讀取 LM75A 溫度寄存器的過程:第1 步,MCU 發(fā)送開始信號,并尋址LM75A,寫方式;第2 步,MCU 寫指針寄存器(00,指向溫度寄存器);第3 步,MCU 發(fā)送重新開始信號以改變數(shù)據(jù)傳輸方向,尋址LM75A,讀方式;第4 步,MCU 讀溫度寄存器的高8 位;第5 步,MCU 讀溫度寄存器的低8 位;第6 步,MCU 發(fā)送停止信號,釋放總線。讀取溫度寄存器見圖4。
圖4 讀取溫度寄存器
TivaWare 是一套廣泛用于控制各種TM4C 系列器件外設(shè)功能的驅(qū)動包,即驅(qū)動函數(shù)庫,其中的 I2C 庫提供了一些用于I2C 操作的API 函數(shù)[12]。程序設(shè)計中將用到以下函數(shù):
(1)I2CMasterSlaveAddrSet 用來發(fā)送開始信號、尋址字節(jié);
(2)I2CMasterDataPut 將數(shù)據(jù)寫入 I2C 主機(jī)數(shù)據(jù)寄存器;
(3)I2CMasterDataGet 從 I2C 主機(jī)數(shù)據(jù)寄存器讀取數(shù)據(jù);
(4)I2CMasterControl 控制主機(jī)模塊的發(fā)送或接收;
(5)I2CMasterBusy 查看主機(jī)是否在忙于發(fā)送或接收數(shù)據(jù);
參照圖4 中讀取溫度寄存器的數(shù)據(jù)幀格式,設(shè)計函數(shù)Read_LM75A 如下:
實驗中,每秒鐘讀一次LM75A,并將溫度值(包括高位字節(jié)和低位字節(jié))以十進(jìn)制格式通過串行口發(fā)送到 PC 的超級終端。為了體現(xiàn)溫度的變化,實驗中用電吹風(fēng)加熱 LM75A 的周邊環(huán)境,通過超級終端看到了緩慢遞增的溫度值,結(jié)果如圖5 所示。
圖5 超級終端輸出的溫度值
為了更清楚地表示溫度,可以將溫度寄存器的值轉(zhuǎn)換為攝氏度,高位字節(jié)(MSB)為整數(shù)部分;低位字節(jié)的 D7 位為小數(shù)部分,所以低位字節(jié)(LSB)為128 即 0.5 ℃,為0 即 0.0 ℃,將整數(shù)部分加上小數(shù)部分即得到溫度的攝氏度值。將圖5 的輸出結(jié)果轉(zhuǎn)換為攝氏度值的結(jié)果見表1。
表1 超級終端輸出的溫度攝氏度值
實驗結(jié)果表明,該實驗實現(xiàn)了對I2C 總線的讀寫功能,該實驗的設(shè)計方法對實踐中I2C 總線的程序設(shè)計有一定借鑒意義。文中為了清楚闡明I2C 總線的讀寫時序,采用了查詢等待的模式,實際應(yīng)用中為了提高系統(tǒng)的實時性,應(yīng)該采用中斷模式。