三防平板電腦內部集成電路串行總線(Inter Integrate Circuit,I2C)是Philips公司設計推出的一種多主雙向的串行總線,采用兩根連線實現(xiàn)全雙工同步數(shù)據(jù)傳送,可以很方便地通過擴展外圍器件構成串行總線系統(tǒng)。隨著眾多支持I2C總線的集成器件出現(xiàn),I2C總線極大地縮短了系統(tǒng)設計人員和器件提供商對新產品的設計周期。使用I2C總線,可以直接與具有I2C總線接口的控制器和各種外圍器件進行雙向八位二進制同步串行通信,如三防平板電腦嵌入式微處理器、存儲器、A/D轉換器、D/A轉換器、鍵盤、LCD控制器和智能傳感器等。
圖1 單路測量溫度主函數(shù)流程圖
圖2 多路測量溫度主函數(shù)流程圖
三防平板電腦I2C總線最主要的優(yōu)點是其簡單性和有效性。由于接口直接在組件之上,因此I2C總線占用的空間非常小,減少了電路板的空間和芯片引腳的數(shù)量,降低了互連成本??偩€的長度可高達25英尺(1英尺≈0.3048 m),并且能夠以100 kbps的最大傳輸速率支持40個組件。I2C總線的另一個優(yōu)點是支持多主控,其中任何能夠進行發(fā)送和接收的設備都可以成為主設備。一個主設備能夠控制信號的傳輸和時鐘頻率,但是在系統(tǒng)任何時間點上只能有一個主設備。
1.三防平板電腦性能與工作原理
I2C總線通信方式具有低成本、易實現(xiàn)、中速(標準總線可達100 kbps,擴展總線可達400 kbps)的特點。I2C總線的2.1版本使用的電源電壓低至2 V,傳輸速率可達3.4 Mbps。I2C使用兩條連線,其中串行數(shù)據(jù)線(SDL/SDA)用于數(shù)據(jù)傳送,串行時鐘線(SCL/SCK)用于指示什么時候數(shù)據(jù)線上是有效數(shù)據(jù)。
I2C 總線可以工作在全雙工通信模式,其規(guī)范并未限制總線的長度,但其總負載電容需要保持在400 pF以下。I2C總線通信有主傳送模
式、主接收模式、從傳送模式和從接收模式四種操作模式。其中的I2C主設備負責發(fā)出時鐘信號、地址信號和控制信號,選擇通信的I2C從設備和控制收發(fā)。每個I2C設備都有一個唯一的7位地址(擴展方式為10位),便于主設備訪問。正常情況下,I2C總線上的所有從設備被設置為高阻狀態(tài),而主設備保持在高電平,表示處于空閑狀態(tài)。在網絡中,每個設備都可以作為發(fā)送器和接收器。在主從通信中,可以有多個I2C總線器件同時接到總線上,通過地址來識別通信對象,并且I2C總線還可以是多主系統(tǒng),任何一個設備都可以為I2C總線的主設備,但是在任一時刻只能有一個I2C主設備。I2C總線具有總線仲裁功能,可保證系統(tǒng)正確運行。
在應用時應注意,I2C總線上設備的串行時鐘線和串行數(shù)據(jù)線都使用集電極開路/漏極開路接口,因此在串行時鐘線和串行數(shù)據(jù)線上都必須連接上拉電阻。
總之,三防平板電腦在任何模式下使用I2C總線通信方式都必須遵循以下三點:
● 每個設備必須具有I2C總線接口功能或使用I/O模擬完成功能;
● 各個設備必須共地;
● 兩個信號線必須接入上拉電阻。
I2C總線設備的連接示意圖如圖3所示。
圖3 I2C總線設備的連接示意圖
三防平板電腦I2C總線通信方式不規(guī)定使用電壓的高低,因此雙極型TTL器件或單極型MOS器件都能夠連接到總線上。但總線信號均使用集電極開路/漏極開路,通過上拉電阻保持信號的默認狀態(tài)為高電平。上拉電阻的大小由電源電壓和總線傳輸速度決定,對于VCC=+5 V電源電壓,低速100 kHz一般采用10 kΩ 的上拉電阻,標準速率400 kHz一般采用2 kΩ 的上拉電阻。
當“0”被傳送時,每一條總線的晶體管用于下拉該信號。集電極開路/漏極開路信號允許一些設備同時寫總線而不會引起電路的故障,網絡中的每個I2C總線設備都使用集電極開路/漏極開路,并連接到串行時鐘線SCL和串行數(shù)據(jù)線SDA上。
在具體的工作中,I2C總線通信方式被設計成多主設備總線結構,即任何一個設備都可以在不同的時刻成為主設備,沒有一個固定的主設備在 SCL 上產生時鐘信號。相反,當傳送數(shù)據(jù)時,主設備同時驅動SDA和SCL;當總線空閑時,SCL和SDA都保持高電位,當兩個設備試圖改變SCL和SDA到不同的電位時,集電極開路/漏極開路能夠防止出錯。但是每個主設備在傳輸時必須監(jiān)聽總線狀態(tài),以確保報文之間不會互相影響,如果設備收到了不同于它要傳送的值時,它知道報文之間發(fā)生相互影響了。I2C總線的起始信號和停止信號如圖6-18所示。
圖4 I2C總線的起始信號和停止信號
在傳輸數(shù)字信號方面,三防平板電腦I2C總線通信方式包括七種常用的信號。
● 總線空閑狀態(tài):串行時鐘線和串行數(shù)據(jù)線均為高電平。
● 起始信號:即啟動一次傳輸,串行時鐘線是高電平時,串行數(shù)據(jù)線由高變低。
● 停止信號:即結束一次傳輸,串行時鐘線是高電平時,串行數(shù)據(jù)信號線由低變高。
● 數(shù)據(jù)位信號:串行時鐘線是低電平時,可以改變串行數(shù)據(jù)線電位。串行時鐘線是高電平時,應保持串行數(shù)據(jù)線上電位不變,即時鐘在高電平時,數(shù)據(jù)有效。
● 應答信號:占1位,數(shù)據(jù)接收端接收1字節(jié)數(shù)據(jù)后,應向數(shù)據(jù)發(fā)出端發(fā)送應答信號。低電平為應答,繼續(xù)發(fā)送;高電平為非應答,結束發(fā)送。
● 控制位信號:占1位,I2C主設備發(fā)出的讀寫控制信號,高電平為讀、低電平為寫(對I2C主設備而言),控制位在尋址字節(jié)中。
● 地址信號和讀寫控制:地址信號為7位從設備地址,讀寫控制位1位,兩者共同組成一個字節(jié),稱為尋址字節(jié),各字段含義如表6-6所示。
表1 I2C總線尋址字節(jié)各字段的含義
三防平板電腦其中,設備地址(DA3~DA0)是I2C總線接口器件固有的地址編碼,由生產廠家給定,如I2C總線EEPROM器件24CXX系列器件地址為1010。需要注意的是,在標準的I2C總線定義中設備地址是7位,而擴展的I2C總線允許10位地址。地址0000000一般用于發(fā)出通用呼叫或總線廣播,總線廣播可以同時給所有的設備發(fā)出命令信號。
引腳地址(A2、A1、A0)由I2C總線接口器件的地址引腳A2、A1、A0來確定,接電源者為1,接地者為0,對于讀寫控制位():1表示主設備讀,0表示主設備寫。
I2C 總線通信方式最主要的優(yōu)點是簡單性和有效性,因此在諸多低速控制和檢測設備中得到了廣泛的應用。
2.三防平板電腦基于I2C總線的數(shù)字溫度傳感器
(1)概述。TMP101是TI公司生產的基于I2C串行總線接口的低功耗、高精度智能溫度傳感器,其內部集成有二極管溫度傳感器、Σ-Δ 型 A/D 轉換器、串行接口等,TMP101內部結構和引腳如圖6-19所示,該器件主要有以下特點。
● I2C總線通過串行接口(SDA和SCL)實現(xiàn)與單片機的通信,I2C總線上可掛接3個TMP101器件,構成多點溫度測控系統(tǒng)。
● 溫度測量范圍為-55℃~125℃,9~12位A/D轉換精度,12位A/D轉換的分辨率達0.0625%,被測溫度值以符號擴展的16位數(shù)字方式串行輸出。
● 電源電壓范圍寬(+2.7~+5.5 V),靜態(tài)電流小,待機狀態(tài)下僅為0.1 μA。
● 內部具有可編程的溫度上、下限寄存器及報警(中斷)輸出功能,內部的故障排除功能可防止因噪聲干擾引起的誤觸發(fā),從而提高溫控系統(tǒng)的可靠性。
TMP101采用SOT23-6封裝,引腳說明如下。
● SCL:串行時鐘輸入引腳,CMOS電平。
● GND:接地腳。
● ALERT:總線報警(中斷)輸出引腳,漏極開路輸出。
● V+:電源端。
● ADD0:I2C總線的地址選擇引腳,輸入用戶設置的地址。
● SDA:串行數(shù)據(jù)輸入/輸出端,CMOS電平,雙向開路。
電源與接地端之間接有一只0.1 μF的耦合電容。
TMP101內部含有二極管溫度傳感器、Σ-Δ 型 A/D轉換器、時鐘振蕩器、控制邏輯、配置寄存器和溫度寄存器,以及串行接口等。TMP101首先通過內部的二極管溫度傳感器產生一個與被測溫度成正比的電壓信號,再通過12位Σ-Δ 型A/D轉換器將電壓信號轉換為與攝氏溫度成正比的數(shù)字量并存儲在內部的溫度寄存器中。
(2)三防平板電腦TMP101工作原理。TMP101的I2C總線串行數(shù)據(jù)線SDA和串行時鐘線SDA由主控制器控制。主控制器作為主機,TMP101作為從機并支持I2C總線協(xié)議的讀/寫操作命令。首先通過主控制器進行地址設定,使主控制器對掛接在總線上的TMP101進行地址識別。為了能夠正確獲取TMP101內部溫度寄存器中的溫度值數(shù)據(jù),要通過I2C總線對TMP101內部相關寄存器寫相應的數(shù)據(jù),設定溫度轉換結果的分辨率、轉換時間、報警輸出的上下限溫度值及工作方式等。也就是對TMP101內部的配置寄存器、上限溫度寄存器和下限溫度寄存器進行初始化設置。
① TMP101的地址設置。根據(jù)I2C總線規(guī)范,TMP101有一個7位的從器件地址碼,其有效位為10010,其余兩位根據(jù)引腳ADD0接地、懸空和接電源端的不同,分別設置為00、01、10。一條I2C總線上可掛接3個TMP101器件。
② TMP101內部寄存器。TMP101的功能實現(xiàn)和工作方式主要是由其內部的5個寄存器確定,如圖6-20所示,這些寄存器分別是地址指針寄存器、溫度寄存器、配置寄存器、下限溫度(TL)寄存器和上限溫度(TH)寄存器,后4個寄存器均屬于數(shù)據(jù)寄存器。
圖5 TM101內部的5個寄存器
三防平板電腦地址指針寄存器為8位可讀寫寄存器,內部存儲了要讀寫的其他4個數(shù)據(jù)寄存器的地址。在讀寫操作中,通過設定地址指針寄存器的內容可確定要訪問的寄存器。在8位數(shù)據(jù)字節(jié)中,前6位全部設置為0,后2位(P0和P1)用于選擇寄存器,P0、P1的值與選擇的寄存器關系如表6-7所示。
表2 P0、P1的值與選擇的寄存器關系
溫度寄存器為16位可讀寄存器,用于存儲經A/D轉換后的12位溫度數(shù)據(jù),后4位全補為0,以構成2字節(jié)的可讀寄存器,也可以通過設置配置寄存器的內容來獲得9、10、11、12位不同的A/D轉換結果。
配置寄存器為8位可讀/寫寄存器,可通過配置寄存器來設置器件的工作方式。Rl/R0為溫度傳感器轉換分辨率配置位,可以設定內部A/D轉換器的分辨率及轉換時間;F1/F0為故障排隊次數(shù)配置位,當被測溫度值連續(xù)超過n次(可通過設置Fl/F0位)時,就會有報警輸出;POL為ALERT極性位,通過POL的設置,可以使控制器和ALERT輸出的極性一致;SD 用來設置器件是否工作在關斷模式,在關斷模式下,
向 OS/ALERT 位寫 l 可以開啟一次溫度轉換,在溫度比較模式下,該數(shù)據(jù)位可提供溫度比較模式的狀態(tài)。
(3)I2C總線編程示例。AT89S52單片機內部沒有集成I2C接口電路,因此這里介紹如何通過編程來實現(xiàn)單片機I/O口模擬I2C總線的接口電路。
三防平板電腦I2C總線的基本操作有啟動總線、停止總線、寫1個字節(jié)、讀1個字節(jié)。以下采用兩條I/O口線分別作為I2C總線的SCL和SDA信號,并給出用C語言編寫的各個子函數(shù)。
① 啟動總線與停止總線。前面介紹了I2C總線的起始與停止的時序,可根據(jù)圖6-18來完成I2C總線控制的起始與停止程序,程序如下。
這里需要調用延時子函數(shù)DelayMs(unsigned int number),表示延時number毫秒。
void I2C_Start(void)
{
SDA=1;
SCL=1;
DelayMs(1);
SDA=0;
DelayMs(1);
SCL=0;
DelayMs(1);
}
void I2C_Stop(void)
{
SCL=0;
SDA=0;
DelayMs(1);
SCL=1;
DelayMs(1);
SDA=1;
DelayMs(1);
}
② 應答機制。應答信號用于表明1字節(jié)數(shù)據(jù)傳輸?shù)慕Y束,由數(shù)據(jù)接收端發(fā)出。數(shù)據(jù)發(fā)送端在第9個時鐘位上釋放數(shù)據(jù)總線,使其處于高電平,此時接收端輸出的低電平為數(shù)據(jù)總線的應答信號。用C編語言編寫的I2C總線控制應答程序如下。
void I2C_Ack(void)
{
SDA=0;
DelayMs(1);
SCL=1;
DelayMs(1);
SCL=0;
DelayMs(1);
SDA=1;
DelayMs(1);
}
/*檢測應答子程序
*ErorrBit=0,接收到正常應答信號
*ErrorBit=1,無正常應答信號 */
bit AckCheck(void)
{
bit ErrorBit;
SDA=1;
DelayMs(1);
SCL=1;
DelayMs(1);
ErrorBit=SDA;
SCL=0;
DelayMs(1);
return(ErrorBit);
}
③ 非應答信號。非應答信號用于數(shù)據(jù)傳輸出現(xiàn)異常而無法完成的情況,在傳送完1個字節(jié)的數(shù)據(jù)后,在第9個時鐘位上,從設備輸出高電平作為非應答信號。非應答信號產生有兩種情況:
一是當從設備正在進行其他處理而無法立即接收總線上的數(shù)據(jù)時,從設備不產生應答信號,此時從設備釋放總線,將數(shù)據(jù)線SDA置為高電平。這樣,主設備可產生一個停止信號來終止總線數(shù)據(jù)傳輸。
二是當主設備接收來自從設備的數(shù)據(jù)時,接收到最后1個字節(jié)后,必須給從設備發(fā)送一個非應答信號,使從設備釋放數(shù)據(jù)總線。這樣,主設備才可以發(fā)生停止信號,從而終止數(shù)據(jù)傳輸。用C語言編寫I2C總線控制的非應答信號程序如下。
void NACK(void)
{
SDA=1;
DelayMs(1);
SCL=1;
DelayMs(1);
SCL=0;
DelayMs(1);
}
④ 寫數(shù)據(jù)。I2C總線協(xié)議規(guī)定了完整的數(shù)據(jù)傳送格式,以寫數(shù)據(jù)為例,在數(shù)據(jù)傳輸?shù)拈_始時,主設備發(fā)出起始信號,然后發(fā)送尋址字節(jié),這里尋址字節(jié)的最低位應該為0,表示這次操作是寫操作,在尋址字節(jié)后是要傳送的數(shù)據(jù)字節(jié)與應答位,具體過程如下所示。
如果一次數(shù)據(jù)傳輸完畢,主設備希望繼續(xù)占用總線,則可以不產生停止信號,再次發(fā)送起始信號,并對另一從設備進行尋址,便可進行新的數(shù)據(jù)傳輸。
用C語言編寫的I2C總線控制的寫1個字節(jié)數(shù)據(jù)程序如下。
bit WriteByte(unsigned char data) //data為要發(fā)送的數(shù)據(jù)
{
unsigned char temp;
for(temp=8;temp!=0;temp——) //循環(huán)移位,逐位發(fā)送8位數(shù)據(jù)
{
SDA=(bit)(data & 0x80);
DelayMs(1);
SCL=1;
DelayMs(1);
SCL=0;
DelayMs(1);
data=data <<1;
}
return 1;
}
三防平板電腦如果主設備需要發(fā)送n個字節(jié)的數(shù)據(jù),則首先發(fā)送起始位,接著是尋址字節(jié),然后是數(shù)據(jù)所要存入單元的首地址,從設備此時產生正確的應答后,主設備便將n個字節(jié)數(shù)據(jù)傳到指定的從設備中。用C語言編寫的I2C總線控制的寫n個字節(jié)數(shù)據(jù)程序如下。
void WriteNByte(unsigned char *Wdata,unsigned char RomAddress,unsigned char number)
{
I2C_Start(); //啟動總線
WriteByte(WriteDevAdd); //寫從設備的尋址地址
AckCheck(); //檢測應答信號
WriteByte(RomAddress); //寫入所要存入單元的首地址
AckCheck(); //檢測應答信號
for(;number!=0;number——) //逐個字節(jié)發(fā)送
{
WriteByte(*Wdata); //發(fā)送1個字節(jié)數(shù)據(jù)
AckCheck(); //檢測應答信號
Wdata++; //指向下一個數(shù)據(jù)
}
Stop(); //結束本次傳輸
DelayMs(1);
}
其中,WriteDevAdd為I2C總線從設備的尋址地址,其聲明如下。
#define WriteDevAdd 0xa0
⑤ 讀數(shù)據(jù)。與寫數(shù)據(jù)的過程類似,I2C總線的讀數(shù)據(jù)也是從主設備發(fā)出起始信號開始的,然后發(fā)送尋址字節(jié),具體過程如下所示。
用C語言編寫I2C總線控制的讀1個字節(jié)數(shù)據(jù)的程序如下。
unsigned char ReadByte()
{
unsigned char temp,rbyte=0;
for(temp=8;temp!=0;temp——)
{
SCL=1;
DelayMs(1);
rbyte=rbyte<<1;
DelayMs(1);
//數(shù)據(jù)線SDA上的數(shù)據(jù)存入rbyte的最低位
rbyte=rbyte|((unsigned char)(SDA));
SCL=0;
DelayMs(1);
}
return(rbyte);
}
三防平板電腦主設備讀取n個字節(jié)數(shù)據(jù)的過程與發(fā)送n個字節(jié)數(shù)據(jù)的過程類似,只不過尋址地址中的讀寫位為1。
需要注意的是,在讀n個字節(jié)的操作中,除了發(fā)送尋址字節(jié)外,還要發(fā)送設備的子地址。因此,在讀n個字節(jié)操作前,要進行1個字節(jié)的寫操作,然后重新開始讀操作,將從設備內的n個字節(jié)數(shù)據(jù)讀出。用C語言編寫的I2C總線控制的讀n個字節(jié)數(shù)據(jù)程序如下。
void ReadNByte(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes)
{
Start(); //啟動I2C總線
WriteByte(WriteDevAdd); //寫從設備的尋址地址
AckCheck(); //檢測應答信號
WriteByte(RomAddress); //寫I2C設備內部數(shù)據(jù)的讀取首地址
AckCheck(); //檢測應答信號
Start(); //重新啟動
WriteByte(ReadDevAdd); //寫設備的尋址地址
AckCheck(); //檢測應答信號
while(bytes!=1) //循環(huán)讀入字節(jié)數(shù)據(jù)
{
*RamAddress=ReadByte(); //讀入1個字節(jié)
I2C_Ack(); //應答信號
RamAddress++; //地址指針遞增
bytes——; //待讀入數(shù)據(jù)個數(shù)遞減
}
*RamAddress=ReadByte(); //讀入最后1個字節(jié)數(shù)據(jù)
NACK(); //非應答信號
Stop(); //停止I2C總線
}
其中WriteDevAdd和ReadDevAdd分別為寫、讀I2C總線設備的尋址字節(jié),聲明如下。
#define WriteDevAdd 0xa0
#define ReadDevAdd 0xa1
(4)TMP101的使用方法。要獲取TMP101中的溫度值數(shù)據(jù),首先應通過AT89S52單片機對TMP101內部的配置寄存器、上限溫度
寄存器和下限溫度寄存器進行初始化設置。其過程為AT89S52單片機對TMP101寫地址,然后寫配置寄存器地址到地址指針寄存器,最后將數(shù)據(jù)寫入配置寄存器。AT89S52單片機對TMP101配置寄存器寫操作的時序如圖6所示,上/下限溫度寄存器的寫時序和配置寄存器的寫時序同理。
圖6 AT89S52單片機對TMP101配置寄存器寫操作的時序
三防平板電腦讀取TMP101內部溫度寄存器當前值的過程是:首先寫入要讀的TMP101地址,然后寫入要讀的 TMP101內部溫度寄存器,向 I2C 總線上發(fā)送一個“重啟動信號”,并將 TMP101地址字節(jié)再重發(fā)一次,改變數(shù)據(jù)的傳輸方向,從而進行讀取溫度寄存器的操作。AT89S52單片機對TMP101溫度寄存器讀操作的時序如圖7所示。
由圖7可見,在串行數(shù)據(jù)線SDA和串行時鐘線SCL的時序配合下,將AT89S52單片機的啟動使能位SEN置位并建立啟動信號時序,接著單片機將要讀的TMP101地址字節(jié)寫入緩沖器,并通過單片機內部移位寄存器將字節(jié)移送至 SDA 引腳,8位地址字節(jié)的前7位是TMP101的受控地址,最后l位為讀/寫的控制位(為“0”時表示寫操作)。寫地址字節(jié)完成后,在第9個時鐘脈沖周期內,單片機釋放SDA,以便TMP101在地址匹配后能夠反饋一個有效應答信號供單片機檢測接收。第9個時鐘脈沖之后,SCL引腳保持為低電平,SDA引腳電平保持不變,直到下一個數(shù)據(jù)字節(jié)被送入緩沖器為止,然后寫入要讀的 TMP101內部溫度寄存器地址字節(jié),其過程與 TMP101地址字節(jié)的寫操作同理。通過向總線上發(fā)送“重啟信號”,改變數(shù)據(jù)的傳輸方向,此時尋址字節(jié)也要重發(fā)一次,但對TMP101的地址字節(jié)已變?yōu)樽x操作,然后讀取TMP101內部溫度寄存器的地址字節(jié),最后讀出TMP101內部溫度寄存器中的溫度值數(shù)據(jù)字節(jié),被測溫度值是以符號擴展的16位數(shù)字量的方式串行輸出的。單片機每接收一個字節(jié)都要反饋一個應答信號,此時要注意單片機反饋的應答信號和TMP101反饋的應答信號是不同的,最后通過設置停止使能位,發(fā)送一個停止信號時序到總線上,表明終止此次通信。
圖7 AT89S52單片機控制TMP101溫度寄存器讀操作的時序
(5)三防平板電腦C語言應用程序。TMP101的C語言應用程序如下。