關(guān)鍵詞:I2C;單片機(jī);AT24C256
The Application Of I2C Bus In the Single Chip Processor System of Series 8051

国产精品久久人妻互换毛片,国产av国片偷人妻麻豆,国产精品第12页,国产高清自产拍av在线,潮喷大喷水系列无码久久精品

技術(shù)頻道

I2C總線在8051單片機(jī)系統(tǒng)中的應(yīng)用

摘要:介紹了I2C總線技術(shù)及其技術(shù)標(biāo)準(zhǔn)。結(jié)合ATMEL公司具有I2C總線的AT24C256,給出了8051單片機(jī)虛擬I2C總線的硬件設(shè)計(jì)及C語(yǔ)言的軟件實(shí)現(xiàn)。
  關(guān)鍵詞:I2C;單片機(jī);AT24C256
The Application Of I2C Bus In the Single Chip Processor System of Series 8051
  PENG Qing_xiang
  Abstract: The paper introduces the technique and standard of I2C bus. Unifies the AT24C256 chip having I2C bus produced by ATMEL Corporation ,the paper gives the hardware design and C language software realization of virtual technique of I2C bus in the single chip processor system of series 8051.
  Key words: I2C;Single Computer;AT24C256
  1、引言
  I2C總線是PHILIPS公司推出的一種具備多主機(jī)系統(tǒng)所需的包括裁決和高低速設(shè)備同步等功能的高性能串行總線。它使用兩條線:串行數(shù)據(jù)線(SDA)和串行時(shí)鐘線(SCL),使連接到該總線上可訪問(wèn)的器件之間傳送信息,屬于多主控制總線??偩€上的每個(gè)器件都有唯一的地址識(shí)別,而且都可以作為一個(gè)發(fā)送器或接收器。由于I2C總線的使用可以簡(jiǎn)化電路,省掉了很多常規(guī)電路中的接口器件,提高產(chǎn)品的可靠性,在許多領(lǐng)域尤其在目前使用的IC卡獲得了廣泛的應(yīng)用。
  現(xiàn)今,8051系列的單片機(jī)應(yīng)用很廣,但是它們都沒(méi)有I2C總線接口。但是分析I2C總線的時(shí)序可知, I2C總線規(guī)定其時(shí)鐘線(SCL線)和和數(shù)據(jù)線(SDA線)是各設(shè)備對(duì)應(yīng)輸出狀態(tài)相“與”的結(jié)果,任一設(shè)備都可以用輸出低電平的方法延長(zhǎng)SCL低電平時(shí)間,迫使高速設(shè)備進(jìn)入等待狀態(tài),實(shí)現(xiàn)不同速度設(shè)備間的時(shí)鐘同步。因此,即使時(shí)鐘脈沖的高、低電平時(shí)間長(zhǎng)短不一,也能實(shí)現(xiàn)數(shù)據(jù)的可靠傳送,因此我們可以通過(guò)軟件控制單片機(jī)的普通I/O口做I2C接口,實(shí)現(xiàn)I2C總線功能。本文以ATMEL公司的具有I2C總線的AT24C256為例介紹I2C總線在8051單片機(jī)系統(tǒng)中的應(yīng)用并給出C語(yǔ)言的軟件實(shí)現(xiàn)。
  2、I2C總線構(gòu)成及時(shí)序
  2.1 I2C總線組成
  I2C總線是一個(gè)多主機(jī)總線,即可以連接多于一個(gè)能控制總線的器件到總線。I2C串行總線有兩根信號(hào)線:一根雙向的數(shù)據(jù)線SDA;另一根是時(shí)鐘線SCL。SDA和SCL都是雙向I/O口線,當(dāng)總線空閑時(shí)這兩條線路都是高電平。所有接到I2C總線上的器件的串行數(shù)據(jù)線都接到總線的SDA線,各器件的時(shí)鐘線都接到SCL總線上。其結(jié)構(gòu)如圖一所示。

圖一:I2C總線的組成
圖一:I2C總線的組成



  2.2 I2C總線時(shí)序

  所有主機(jī)在SCL線上產(chǎn)生自己的時(shí)鐘來(lái)傳輸I2C總線上的數(shù)據(jù),數(shù)據(jù)只在時(shí)鐘的高電平周期有效,每傳輸一個(gè)數(shù)據(jù)位就產(chǎn)生一個(gè)時(shí)鐘脈沖,數(shù)據(jù)線的高或低電平狀態(tài)只有在SCL線的時(shí)鐘信號(hào)是低電平時(shí)才能改變,當(dāng)SCL為高電平時(shí),SDA的改變表示“開(kāi)始”和“停止”狀態(tài),即SDA由高電平轉(zhuǎn)入低電平表示開(kāi)始,該命令必須在其它命令前執(zhí)行;SDA由低電平轉(zhuǎn)入高電平表示停止?fàn)顟B(tài),該命令可終止所有通訊。在開(kāi)始條件后,SCL低電平期間,SDA允許變化,每位數(shù)據(jù)需一個(gè)時(shí)鐘脈沖,當(dāng)SCL為高時(shí),SDA必須穩(wěn)定,主控器在應(yīng)答時(shí)鐘脈沖高電平期間釋放SDA線,轉(zhuǎn)由接收器控制。相同總線上的設(shè)備在收到數(shù)據(jù)后,以置SDA為低電平的方式對(duì)其確認(rèn)??偩€不忙時(shí),數(shù)據(jù)線和時(shí)鐘線保持為高電平。I2C的時(shí)序如圖二所示。

圖二:I2C總線時(shí)序圖
圖二:I2C總線時(shí)序圖



  3、8051單片機(jī)系統(tǒng)中I2C總線的實(shí)現(xiàn)

  8051系列單片機(jī)上并不帶I2C總線,因此必須根據(jù)I2C總線的時(shí)序用單片機(jī)上的I/O口模擬I2C總線時(shí)序?qū)崿F(xiàn)其功能?,F(xiàn)以單片機(jī)應(yīng)用系統(tǒng)中較為常見(jiàn)的E2PROM中AT24C256為例,介紹在8051上利用普通I/O口實(shí)現(xiàn)I2C串行總線的方法和軟件設(shè)計(jì)。

  AT24C256是ATMEL公司256kbit串行電可擦的可編程存儲(chǔ)器,8引腳雙排直插式封裝,具有結(jié)構(gòu)緊湊、存儲(chǔ)容量大等特點(diǎn),其引腳排列如圖三所示。

圖三:AT24C256引腳圖
圖三:AT24C256引腳圖



  其中A0、A1為地址選擇輸入端。A0、A1用來(lái)區(qū)分各芯片地址,地址分布從0到3。A0、A1懸空時(shí)為0。SCL為串行時(shí)鐘輸入,上升沿將SDA上的數(shù)據(jù)寫(xiě)入存儲(chǔ)器,下降沿從存儲(chǔ)器讀出數(shù)據(jù)送SDA上。SDA是雙向串行數(shù)據(jù)輸入輸出口,用于存儲(chǔ)器與單片機(jī)之間的數(shù)據(jù)交換。WP為寫(xiě)保護(hù)輸入。此引腳與地相連時(shí),允許寫(xiě)操作;與VCC相連時(shí),所有的寫(xiě)存儲(chǔ)器操作被禁止。如果不連,芯片內(nèi)部下拉到地;VCC接+5V電源;GND接地;NC懸空。

  AT24C256在開(kāi)始狀態(tài)后需緊接一個(gè)8位器件地址,以進(jìn)行相應(yīng)的讀寫(xiě)操作。設(shè)備尋址碼的高4位為1、0、1、0,尋址碼高4位后面的三位是器件尋址碼,與它們的硬連線管腳相對(duì)應(yīng)。最低應(yīng)是讀寫(xiě)選擇位,置0時(shí)可激發(fā)寫(xiě)操作,置1激發(fā)讀操作。器件的具體的格式為:1010A2A1A0R/W,其中當(dāng)R/W為0時(shí),為寫(xiě)AT24C256,當(dāng)為1時(shí)為讀操作。

  因?yàn)锳T24C256片內(nèi)地址是以8位為單元的,其總存儲(chǔ)容量為256K,所以其片內(nèi)地址為從0到32767的任意數(shù)值。因此在編寫(xiě)軟件時(shí)設(shè)置其片內(nèi)地址數(shù)據(jù)類(lèi)型時(shí)要設(shè)置為unsigned int型,而不能為unsigned char型。

  圖四所示為AT89S51單片機(jī)和AT24C256的接口圖,分別用I/O口P1.6、P1.7連接SDA和SCL總線。通過(guò)控制P1.7口的高低電平得到I2C的虛擬時(shí)鐘,P1.6口作為數(shù)據(jù)傳輸?shù)碾p向端口,作為單片機(jī)和AT24C256之間的數(shù)據(jù)線。




  4、虛擬I2C總線軟件結(jié)構(gòu)

  對(duì)于虛擬I2C總線來(lái)說(shuō)要實(shí)現(xiàn)其功能主要是要軟件要注意I2C器件的操作時(shí)序,總線的運(yùn)行由主機(jī)控制。所謂主機(jī)即啟動(dòng)數(shù)據(jù)的傳送即發(fā)出啟動(dòng)信號(hào),發(fā)出時(shí)鐘信號(hào),傳送結(jié)束時(shí)發(fā)出停止信號(hào)的設(shè)備,通常主機(jī)是微處理器。被主機(jī)尋訪的設(shè)備都稱(chēng)為從機(jī)。為了進(jìn)行通訊,每個(gè)接到I2C總線的設(shè)備都有一個(gè)唯一的地址,以便于主機(jī)尋訪。主機(jī)和從機(jī)的數(shù)據(jù)傳送,可以由主機(jī)發(fā)送數(shù)據(jù)到從機(jī),也可以是從機(jī)發(fā)到主機(jī)。凡是發(fā)送數(shù)據(jù)到總線的設(shè)備稱(chēng)為發(fā)送器,從總線上接收數(shù)據(jù)的設(shè)備被稱(chēng)為接受器。根據(jù)I2C的時(shí)序,軟件分為開(kāi)始、停止、應(yīng)答、檢查應(yīng)答、不產(chǎn)生應(yīng)答、讀操作、寫(xiě)操作。以下為C程序清單調(diào)試成功。


  #include
  Sbit sda=P1^7;
  Sbit scl=P1^6;


  啟動(dòng)函數(shù),在SCL為高時(shí),SDA的下降沿為啟動(dòng)信號(hào)。

void Start(void)

{ scl=0; //SCL處于低電平時(shí),SDA才能改變
sda=1;// 一個(gè)"開(kāi)始"狀態(tài),該狀態(tài)必須在其他命令之前執(zhí)行
scl=1; // 當(dāng)scl為高電平時(shí)sda的下降沿表示開(kāi)始狀態(tài)
_nop_(); _nop_(); _nop_(); //給一個(gè)延時(shí)
sda=0; //給下降沿表示開(kāi)始
_nop_(); _nop_(); _nop_(); _nop_();
scl=0; //恢復(fù)低電平以改變sda的值
sda=1; }
  停止函數(shù),在SCL為高時(shí),SDA的上升沿為停止信號(hào)。
void Stop(void)
{scl=0; //SCL處于低電平時(shí),SDA改變數(shù)值 */
sda=0; //scl為高電平時(shí),sda的上升沿表示停止,
scl=1; //scl為高電平時(shí)改變sda的狀態(tài)表示啟動(dòng),停止
_nop_(); _nop_(); _nop_(); // 延時(shí)
sda=1;
_nop_(); _nop_(); _nop_();
scl=0; }
/* * * * * 檢查應(yīng)答位 * * * * */
bit RecAck(void)
{ scl=0; //在scl為0的時(shí)候改變sda的值
sda=1;
scl=1; //在scl為1的時(shí)候等待sda值的變化,在器件接受到數(shù)據(jù)后會(huì)把sda拉低。
_nop_(); _nop_(); _nop_(); _nop_();
CY=sda; // 因?yàn)榉祷刂悼偸欠旁贑Y中的
scl=0;
_nop_();
return(CY); //如果為CY為低則表示接受成功,如果為高,則表示接受失敗。
}
/* * * * *對(duì)I2C總線產(chǎn)生應(yīng)答(一般用在讀操作中) * * * * */
void Ack(void)
{
sda=0;// EEPROM通過(guò)在收到每個(gè)地址或數(shù)據(jù)之后,
_nop_();_nop_();
scl=1;//置SDA低電平的方式確認(rèn)表示收到讀SDA口狀態(tài)
_nop_(); _nop_(); _nop_(); _nop_();
scl=0;
_nop_();
sda=1;
}

/* * * * * * * * * 不對(duì)I2C總線產(chǎn)生應(yīng)答 * * * * */
void NoAck(void)
{ sda=1;
scl=1;
_nop_(); _nop_(); _nop_(); _nop_();
scl=0;
}

  向I2C總線寫(xiě)數(shù)據(jù),每次寫(xiě)8位數(shù)據(jù)。

void Send(uchar sendbyte)
{uchar j=8;
for(;j>0;j--)
{scl=0;//拉低scl準(zhǔn)備給上升沿
delay(5);//延時(shí)
sendbyte <<= 1;// 使CY=sendbyte^7;
sda=CY; // CY 進(jìn)位標(biāo)志位
scl=1; //給上升沿,發(fā)出sda的狀態(tài)值
}
scl=0;
}

  從I2C總線上讀數(shù)據(jù)子程序 ,每次讀8位數(shù)據(jù)。

uchar Receive(void)
{ register receivebyte,i=8;
scl=0;
while(i--)
{ scl=1; //拉高scl準(zhǔn)備給下降沿
receivebyte=(receivebyte <<1)|sda; //接受值左移一位把低位和sda相或得到sda的狀態(tài)值
scl=0; //給下降沿發(fā)出sda的狀態(tài)值
}
return(receivebyte);
}
  5、結(jié)論

  本文介紹了I2C總線的組成及時(shí)序,并以ATMEL公司的AT24C256為例給出了用8051C語(yǔ)言模擬I2C總線的時(shí)序的起始、停止及CPU向I2C總線的發(fā)送和接收8位字節(jié)的程序。

文章版權(quán)歸西部工控xbgk所有,未經(jīng)許可不得轉(zhuǎn)載。