日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

模擬I2C 原理

 Allen 圖書館 2015-03-14
I2C總線是Philips公司最先推出的一種雙向數(shù)據(jù)傳輸總線,其僅使用兩根連線便可以實(shí)現(xiàn)全雙工同步數(shù)據(jù)傳送。在I2C總線中,一條為串行數(shù)據(jù)線(SDA),另一條為一條串行時(shí)鐘線(SCL)。I2C總線占用引腳少,接口協(xié)議簡(jiǎn)單。目前多數(shù)公司均推出了I2C總線接口的各種器件,如存儲(chǔ)器、A/D、D/A、鍵盤、LCD等,大大方便了用戶的選擇。
本章主要介紹了I2C總線的工作原理、尋址方式以及數(shù)據(jù)操作,并重點(diǎn)介紹了數(shù)據(jù)傳輸協(xié)議以及相應(yīng)的C51子函數(shù)。最后通過具體的實(shí)例,介紹如何使用在沒有I2C總線接口的單片機(jī)上讀寫具有I2C總線接口的E2PROM存儲(chǔ)器。

1  I2C總線概述

I2C總線采用兩線制,由數(shù)據(jù)線SDA和時(shí)鐘線SCL構(gòu)成。I2C總線對(duì)數(shù)據(jù)通信進(jìn)行了嚴(yán)格的定義。

1.1  I2C總線工作原理

典型的I2C總線系統(tǒng)結(jié)構(gòu),如圖所示。I2C總線上可以掛接多個(gè)器件,其中每個(gè)器件必須都支持I2C總線通信協(xié)議。

1.2  I2C總線器件的尋址方式
由于所有器件都通過SCL和SDA連接在I2C總線上,因此,主器件在進(jìn)行數(shù)據(jù)傳輸前需要通過尋址,選擇需要通信的從器件。I2C總線上所有外圍器件都需要有唯一的7位地址,由器件地址和引腳地址兩部分組成。
器件地址是I2C器件固有的地址編碼,器件出廠時(shí)就已經(jīng)給定,不可更改。
引腳地址是由I2C總線外圍器件的地址引腳(A2,A1,A0)決定,根據(jù)其在電路中接電源正極、接地或懸空的不同,形成不同的地址代碼。
1.3  I2C總線數(shù)據(jù)操作
在I2C總線上,數(shù)據(jù)是伴隨著時(shí)鐘脈沖,一位一位地傳送的,數(shù)據(jù)位由低到高傳送,每位數(shù)據(jù)占一個(gè)時(shí)鐘脈沖。I2C總線上的在時(shí)鐘線SCL高電平期間,數(shù)據(jù)線SDA的狀態(tài)就表示要傳送的數(shù)據(jù),高電平為數(shù)據(jù)1,低電平為數(shù)據(jù)0。在數(shù)據(jù)傳送時(shí),SDA上數(shù)據(jù)的改變?cè)跁r(shí)鐘線為低電平時(shí)完成,而SCL為高電平時(shí),SDA必須保持穩(wěn)定,否則SDA上的變化會(huì)被當(dāng)作起始或終止信號(hào)而致使數(shù)據(jù)傳輸停止。
1.寫數(shù)據(jù)格式
2.讀數(shù)據(jù)格式

2  I2C總線接口EEPROM存儲(chǔ)器
目前,市場(chǎng)上I2C總線接口器件有多種,例如A/D轉(zhuǎn)換器、D/A轉(zhuǎn)換器、時(shí)鐘芯片和存儲(chǔ)器等。這里以典型的I2C總線接口的存儲(chǔ)器為例進(jìn)行介紹。
I2C總線接口EEPROM存儲(chǔ)器是一種采用I2C總線接口的串行總線存儲(chǔ)器,這類存儲(chǔ)器具有體積小、引腳少、功耗低、工作電壓范圍寬等特點(diǎn)。目前,Atmel、MicroChip、National等公司均提供各種型號(hào)的I2C總線接口的串行EEPROM存儲(chǔ)器。在單片機(jī)系統(tǒng)中使用較多的EEPROM存儲(chǔ)器是24系列串行EEPROM。其具有型號(hào)多、容量大、支持I2C總線協(xié)議、占用單片機(jī)I/O端口少,芯片擴(kuò)展方便、讀寫簡(jiǎn)單等優(yōu)點(diǎn)。

3  C51模擬 I2C總線協(xié)議
在實(shí)際應(yīng)用中,往往遇到所使用的單片機(jī)沒有I2C總線接口,例如典型的 51系列單片機(jī)。為了讓此類單片機(jī)用于操作I2C總線器件的能力,往往需要在程序模擬I2C總線數(shù)據(jù)傳輸協(xié)議。
這里以典型的51系列單片機(jī)為例,假設(shè)其外接6MHz的晶振,采用P1.0作為時(shí)鐘線SCL,P1.1作為數(shù)據(jù)線SDA。在C51語(yǔ)言的程序中,首先需要聲明SCL和SDA所使用的引腳。其聲明如下所示:
sbit SCL=P1^0;
sbit SDA=P1^1;

3.1  延時(shí)子函數(shù)
這里給出一個(gè)典型的延時(shí)子函數(shù)。當(dāng)單片機(jī)的工作頻率比較高的時(shí)候,為了保證I2C總線的傳輸速率滿足100kHz或者400kHz的限制,可以進(jìn)行適當(dāng)?shù)难訒r(shí)處理。用戶可以根據(jù)需要使用。延時(shí)子函數(shù)的程序示例如下:
void Delays(unsigned int number)            //延時(shí)子程序
{
unsigned char temp;
for(;number!=0;number--)    //循環(huán)
{
for(temp=0;temp<100;temp++)        //空循環(huán)
{
}
}
}

3.2  起始信號(hào)子函數(shù)
起始信號(hào)子函數(shù)用于開始I2C總線通信。其中,起始信號(hào)是在時(shí)鐘線SCL為高電平期間,數(shù)據(jù)線SDA上高電平向低電平變化的下降沿信號(hào)。起始信號(hào)出現(xiàn)以后,才可以進(jìn)行后續(xù)的I2C總線尋址或數(shù)據(jù)傳輸?shù)?。起始信?hào)的時(shí)序,如圖所示。在程序中,可以直接為SDA和SCL賦值來實(shí)現(xiàn)起始信號(hào)的時(shí)序。起始信號(hào)子函數(shù)示例如下:
void StartI2C()                            //起始信號(hào)子程序
{
 SDA=1;
 Delays(1);                            //延時(shí),用于滿足傳輸速率要求
 SCL=1;
 Delays(1);
 SDA=0;
 Delays(1);
 SCL=0;
 Delays(1);
}

3.3  終止信號(hào)子函數(shù)
終止信號(hào)子函數(shù)用于終止I2C總線通信。其中,終止信號(hào)是在時(shí)鐘線SCL為高電平期間,數(shù)據(jù)線SDA上低電平到高電平變化的上升沿信號(hào)。終止信號(hào)一出現(xiàn),所有I2C總線操作都結(jié)束,并釋放總線控制權(quán)。終止信號(hào)的時(shí)序,如圖所示。在程序中,可以直接為SDA和SCL賦值來實(shí)現(xiàn)終止信號(hào)的時(shí)序。終止信號(hào)子函數(shù)示例如下:

3.4  應(yīng)答信號(hào)子函數(shù)
應(yīng)答信號(hào)子函數(shù)用于表明I2C總線數(shù)據(jù)傳輸?shù)慕Y(jié)束。I2C總線數(shù)據(jù)傳送時(shí),一個(gè)字節(jié)數(shù)據(jù)傳送完畢后都必須由主器件產(chǎn)生應(yīng)答信號(hào)。主器件在第9個(gè)時(shí)鐘位上釋放數(shù)據(jù)總線SDA,使其處于高電平狀態(tài),此時(shí)從器件輸出低電平拉低數(shù)據(jù)總線SDA為應(yīng)答信號(hào)。應(yīng)答信號(hào)的時(shí)序,如圖所示。在程序中,可以直接為SDA和SCL賦值來實(shí)現(xiàn)應(yīng)答信號(hào)的時(shí)序。應(yīng)答信號(hào)子函數(shù)示例如下:
void AckI2C()                                //發(fā)送應(yīng)答位子程序
{
 SDA=0;
 Delays(1);
 SCL=1;
 Delays(1);
 SCL=0;
 Delays(1);
 SDA=1;
 Delays(1);


3.5  非應(yīng)答信號(hào)子函數(shù)
非應(yīng)答信號(hào)子函數(shù)用于數(shù)據(jù)傳輸出現(xiàn)異常而無(wú)法完成時(shí)。在一個(gè)字節(jié)數(shù)據(jù)傳送完畢后,在第9個(gè)時(shí)鐘位上從器件輸出高電平為非應(yīng)答信號(hào)。非應(yīng)答信號(hào)的產(chǎn)生有兩種情況。
當(dāng)從器件正在進(jìn)行其他處理而無(wú)法接收總線上的數(shù)據(jù)時(shí),從器件不產(chǎn)生應(yīng)答,此時(shí)從器件釋放總線,將數(shù)據(jù)線SDA置為高電平。這樣,主器件可產(chǎn)生一個(gè)停止信號(hào)來終止總線數(shù)據(jù)傳輸。
當(dāng)主器件接收來自從器件的數(shù)據(jù)時(shí),接收到最后一個(gè)數(shù)據(jù)字節(jié)后,必須給從器件發(fā)送一個(gè)非應(yīng)答信號(hào),使從器件釋放數(shù)據(jù)總線。這樣,主器件才可以發(fā)送停止信號(hào),從而終止數(shù)據(jù)傳送。

3.6  應(yīng)答位檢查子函數(shù)
應(yīng)答位檢查子函數(shù)用于主器件檢測(cè)接收的是否為正常的應(yīng)答信號(hào),以便于判斷數(shù)據(jù)接收是否正常。程序中定義了ErrorBit作為應(yīng)答檢查位,用于數(shù)據(jù)線SDA上的應(yīng)答位檢查結(jié)果,最后通過return語(yǔ)句返回該值。應(yīng)答位檢查子函數(shù)示例如下:
bit TestAckI2C()                            //應(yīng)答位檢查子程序
{
 bit ErrorBit;
 SDA=1;
 Delays(1);
 SCL=1;
 Delays(1);
 ErrorBit=SDA;                                //讀入SDA上的應(yīng)答狀態(tài)
 Delays(1);
 SCL=0;
 Delays(1);
 return(ErrorBit);                            //返回應(yīng)答狀態(tài),0為應(yīng)答信號(hào),1為非應(yīng)答信號(hào)


3.7  單字節(jié)寫子函數(shù)
單字節(jié)寫子函數(shù)用于向從器件寫入單個(gè)字節(jié)的數(shù)據(jù)。程序中,可以通過for循環(huán)語(yǔ)句,逐位將數(shù)據(jù)發(fā)送到I2C數(shù)據(jù)總線上。該函數(shù)在使用之前,必須先使用起始信號(hào)子函數(shù)啟動(dòng)I2C總線數(shù)據(jù)傳輸。單字節(jié)寫子函數(shù)的流程圖,如圖16.7所示。單字節(jié)寫子函數(shù)示例如下:
bit Write8BitI2C(unsigned char input)            // input為待發(fā)送的數(shù)據(jù)
{
 unsigned char temp;
 for(temp=8;temp!=0;temp--)                    //循環(huán)移位,逐位發(fā)送數(shù)據(jù)
 {
  SDA=(bit)(input&0x80);                        //取數(shù)據(jù)的最高位
  Delays(1);
  SCL=1;
  Delays(1);
  SCL=0;
  Delays(1);
  input=input<<1;                            //左移一位
 }
 return 1;


3.8  單字節(jié)讀子函數(shù)
單字節(jié)讀子函數(shù)用于從I2C數(shù)據(jù)總線讀入單個(gè)字節(jié)的數(shù)據(jù)。程序中,可以通過for循環(huán)語(yǔ)句,逐位將數(shù)據(jù)讀入。該函數(shù)在使用之前,同樣需要先使用起始信號(hào)子函數(shù)啟動(dòng)I2C總線數(shù)據(jù)傳輸。單字節(jié)讀子函數(shù)的流程圖,如圖所示。單字節(jié)讀子函數(shù)示例如下:

3.9  多字節(jié)寫子函數(shù)
多字節(jié)寫子函數(shù)用于主器件發(fā)送多個(gè)字節(jié)的數(shù)據(jù)。首先發(fā)送起始位,接著是尋址字節(jié),然后是數(shù)據(jù)的所要存入單元的首地址,外圍器件此時(shí)產(chǎn)生正確的應(yīng)答后,主器件便將開始多個(gè)字節(jié)的數(shù)據(jù)傳輸。多字節(jié)寫子函數(shù)的流程圖,如圖所示。多字節(jié)寫子函數(shù)示例如下:

3.10  多字節(jié)讀子函數(shù)
多字節(jié)讀子函數(shù)用于主器件從SDA線上讀取多個(gè)字節(jié)的數(shù)據(jù)。在讀多個(gè)字節(jié)的操作中,除了發(fā)送尋址字節(jié)外,還要發(fā)送器件的子地址。因此,在讀多個(gè)字節(jié)操作前,要進(jìn)行一個(gè)字節(jié)的寫操作,然后重新開始讀操作,將從器件內(nèi)的字節(jié)數(shù)據(jù)讀出。多字節(jié)寫讀函數(shù)的流程圖,如圖16.10所示。多字節(jié)寫讀函數(shù)示例如下:
4  C51讀寫EEPROM實(shí)例
I2C總線接口器件以體積小,占用引腳少,接口簡(jiǎn)單,讀寫操作方便等優(yōu)點(diǎn)而得到廣泛的應(yīng)用。目前Philips、Atmel、Maxim以及其他集成電路制造商推出了很多基于I2C總線的單片機(jī)和外圍器件,如24系列E2PROM、串行實(shí)時(shí)時(shí)鐘芯片DS1302、USB2.0芯片CY7C68013A等。
這里以普通的51系列單片機(jī)為例,通過實(shí)例介紹如何使用C51模擬I2C總線接口來讀寫I2C總線的EEPROM存儲(chǔ)器。
4.1  電路設(shè)計(jì)
這里給出單片機(jī)AT89S51讀寫I2C總線接口的AT24C08存儲(chǔ)器的電路原理圖圖,該電路圖中所使用的元器件的參數(shù)及數(shù)量,如表所示。
4.2  程序設(shè)計(jì)
這里采用C51語(yǔ)言在Keil μVison3集成開發(fā)環(huán)境中編寫程序。
本程序的功能是利用單片機(jī)的P1.0、P1.1作為I2C串行總線的SCL、SDA接口,向AT24C08寫入10個(gè)字節(jié)的數(shù)據(jù),然后再將寫入的數(shù)據(jù)讀出,并比較讀寫的數(shù)據(jù)是否完全一致。如果數(shù)據(jù)的讀寫一致,則點(diǎn)亮LED,表示寫入正確;否則熄滅LED報(bào)警。
4.3  仿真分析
為了加深對(duì)I2C串行總線協(xié)議的理解,可以在Keil μVison3集成開發(fā)環(huán)境中對(duì)整個(gè)程序進(jìn)行仿真。通過信號(hào)仿真,可以查看I2C總線中起始信號(hào)、終止信號(hào)以及數(shù)據(jù)讀寫的時(shí)序。具體操作步驟如下

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多