找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 16583|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

24C08 I2C存儲芯片實(shí)驗(yàn)及中文資料下載

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:195394 發(fā)表于 2017-5-5 23:15 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
24C08中文資料下載:
24cxx中文資料.pdf (576.32 KB, 下載次數(shù): 157)


1.  I2C總線概念

I2C(InterIntegrated Circuit Bus)總線是一種雙向二線制總線,是Philps公司推出的串行總線標(biāo)準(zhǔn)(為二線制)�?偩€上擴(kuò)展的外圍器件及外設(shè)接口通過總線尋址。它的結(jié)構(gòu)簡單,可靠性和抗干擾性能好。目前很多公司都推出了基于I2C總線的外圍器件,例如我們學(xué)習(xí)板上的24c08芯片,就是一個(gè)帶有I2C總線接口的E2PROM存儲器,具有掉電記憶的功能,方便進(jìn)行數(shù)據(jù)的長期保存。

2. I2C總線結(jié)構(gòu)

I2C總線結(jié)構(gòu)很簡單,只有兩條線,包括一條數(shù)據(jù)線(SDA)和一條串行時(shí)鐘線(SCL)。具有I2C接口的器件可以通過這兩根線接到總線上,進(jìn)行相互之間的信息傳遞。連接到總線的器件具有不同的地址,CPU根據(jù)不同的地址進(jìn)行識別,從而實(shí)現(xiàn)對硬件系統(tǒng)簡單靈活的控制。

一個(gè)典型的I2C總線應(yīng)用系統(tǒng)的組成結(jié)構(gòu)如下圖1所示(假設(shè)圖中的微控制器、LCD驅(qū)動、E2PROM、ADC各器件都是具有I2C總線接口的器件):

  
  

我們知道單片機(jī)串行通訊的發(fā)送和接收一般都各用一條線TXD和RXD,而I2C總線的數(shù)據(jù)線既可以發(fā)送也可以接受,工作方式可以通過軟件設(shè)置。所以,I2C總線結(jié)構(gòu)的硬件結(jié)構(gòu)非常簡潔。當(dāng)某器件向總線上發(fā)送信息時(shí),它就是發(fā)送器,而當(dāng)其從總線上接收信息時(shí),又成為接收器。

3. I2C總線特點(diǎn)

    組成系統(tǒng)結(jié)構(gòu)簡單,占用空間小。芯片管腳的數(shù)量少,無需片選信號,價(jià)格低,允許若干兼容器件共享總線,應(yīng)用比較廣泛,總線的長度可達(dá)7.6m,傳送速度可達(dá)400kbps,標(biāo)準(zhǔn)速率為100kbps,支持多個(gè)組件,I2C上所有的設(shè)備的SDA,SCL引腳必須外加上拉電阻

4.  I2C總線上的數(shù)據(jù)傳送

下面我們看看I2C總線是如何進(jìn)行數(shù)據(jù)傳送的。我們知道,在一根數(shù)據(jù)線上傳送數(shù)據(jù)時(shí)必須一位一位的進(jìn)行,所以我們首先研究位傳送。

1) 位傳輸

I2C總線每傳送一位數(shù)據(jù)必須有一個(gè)時(shí)鐘脈沖。被傳送的數(shù)據(jù)在時(shí)鐘SCL的高電平期間保持穩(wěn)定,只有在SCL低電平期間才能夠改變,示意圖如下圖1所示,在標(biāo)準(zhǔn)模式下,高低電平寬度必須不小于4.7us。


                  圖1    位傳輸時(shí)序圖

那么是不是所有I2C總線中的信號都必須符合上述的有效性呢?只有兩個(gè)例外,就是開始和停止信號。

開始信號:當(dāng)SCL為高電平時(shí),SDA發(fā)生從高到低的跳變,出現(xiàn)開始信號以后,總線被認(rèn)為“忙”。

停止信號:當(dāng)SCL為高電平時(shí),SDA發(fā)生從低到高的跳變,停止信號過后,總線被認(rèn)為“空閑”。

開始和結(jié)束信號的時(shí)序圖如下圖所示:


2) 數(shù)據(jù)傳輸?shù)淖止?jié)格式

SDA傳送數(shù)據(jù)是以字節(jié)為單位進(jìn)行的。每個(gè)字節(jié)必須是8位,但是傳輸?shù)淖止?jié)數(shù)量不受限制,首先傳送的是數(shù)據(jù)的最高位。每次傳送一個(gè)字節(jié)完畢,必須接收到從機(jī)發(fā)出的一個(gè)應(yīng)答位,才能開始下一個(gè)字節(jié)的傳輸。如果沒有接受到應(yīng)答位,主機(jī)則產(chǎn)生一個(gè)停止條件結(jié)束本次的傳送。那么從機(jī)應(yīng)該發(fā)出什么信號算是產(chǎn)生了應(yīng)答呢?這個(gè)過程是這樣的。當(dāng)主器件傳送一個(gè)字節(jié)后,在第9個(gè)SCL時(shí)鐘內(nèi)置高SDA線,而從器件的響應(yīng)信號將SDA拉低,從而給出一個(gè)應(yīng)答位。了解了I2C傳輸數(shù)據(jù)的格式,下面我們來研究雙方傳送的協(xié)議問題。

3) I2C數(shù)據(jù)傳輸協(xié)議

I2C總線的數(shù)據(jù)傳輸協(xié)議如下:

(1)、主器件發(fā)出開始信號

(2)、主器件發(fā)出第一個(gè)字節(jié),用來選通相應(yīng)的從器件。其中前7位為地址碼,第8位為方向位(R/W)。方向位為“0”表示發(fā)送,方向位為“1”表示接受。

(3)、從機(jī)產(chǎn)生應(yīng)答信號,進(jìn)入下一個(gè)傳送周期,如果從器件沒有給出應(yīng)答信號,此時(shí)主器件產(chǎn)生一個(gè)結(jié)束信號使得傳送結(jié)束,傳送數(shù)據(jù)無效。

(4)、接下來主、從器件正式進(jìn)行數(shù)據(jù)的傳送,這時(shí)在I2C總線上每次傳送的數(shù)據(jù)字節(jié)數(shù)不限,但每一個(gè)字節(jié)必須為8位(傳送的時(shí)候先送高位,再送低位)。當(dāng)一個(gè)字節(jié)傳送完畢時(shí),再發(fā)送一個(gè)應(yīng)答位(第9位),如上一條所述,這樣每次傳送一個(gè)字節(jié)都需要9個(gè)時(shí)鐘脈沖。數(shù)據(jù)的傳送過程如下圖所示:


                       圖2 I2C總線數(shù)據(jù)傳輸協(xié)議

4) 24c08芯片相關(guān)介紹

AT24c08是帶有I2C總線接口的E2PROM存儲器,具有掉電記憶的功能,并且可以象普通RAM一樣用程序改寫。它的容量是1024個(gè)字節(jié),有A2、A1、A0三位地址,可見I2C總線上可以連接8片AT24c08,它的尋址字節(jié)是1010 A2A1A0 R/W。板上面24c08的電路連接如圖所示:


              圖3 24C08的硬件接線圖

我們對引腳的功能作一個(gè)簡單的解釋:

         VCC,GND:  電源、地引腳

         A2A1A0:    地址引腳

         SCLK、SDA: 通信引腳

         WP:        寫保護(hù)引腳

從上面的電路連接知:A2A1A0=000,可見如果要對24c08進(jìn)行寫操作,尋址字節(jié)是1010 000 0;如果對24c08進(jìn)行讀操作,尋址字節(jié)是1010 000 1。用單片機(jī)的P3.4腳作為串行時(shí)鐘線,用P3.5腳作串行數(shù)據(jù)線。

         寫過程:

(1)、主機(jī)首先發(fā)出開始信號

(2)、發(fā)出寫24c08的尋址字節(jié)1010000 0,即0A0H

(3)、發(fā)數(shù)據(jù)寫入24c08的地址,本例中為01H

(4)、往24c08中寫入數(shù)據(jù),這里是3個(gè)字節(jié),分別為48h,0ebh,52h。

(5)、寫完畢發(fā)出停止信號

         讀過程:

(1)、主機(jī)發(fā)出start信號

(2)、發(fā)寫24c08的尋址字節(jié)1010000 0

(大家可能要問:我們是讀數(shù)據(jù),為什么要發(fā)寫信號呢?這是因?yàn)槟闶紫纫统鲆粋€(gè)信號,說明從24c08中的哪個(gè)地址讀取數(shù)據(jù)。)

(3)、發(fā)要讀取的數(shù)據(jù)在24c08中的地址,即01h

(4)、主機(jī)發(fā)start信號

(5)、發(fā)讀24c08的尋址字節(jié)1010000 1

(5)、從24 C02中讀取數(shù)據(jù)

(6)、讀取完畢發(fā)出停止信號

5.實(shí)例演練

1)  實(shí)驗(yàn)?zāi)康?br />
從地址0x00 開始連續(xù)寫入16個(gè)數(shù)據(jù)(LED流水燈顯示碼),然后再從地址0x00 開始讀出所寫入的16個(gè)數(shù)據(jù),由P0口的LED燈顯示出來(先從右到左流,再從左到右流)。

2) 實(shí)驗(yàn)電路


3) 實(shí)驗(yàn)步驟

將JPLED P0跳線的跳線帽插好

不要插1602LCD 以免干擾P0口LED燈

4) 流程圖


5) C語言源程序

通電后 數(shù)碼管從00開始計(jì)數(shù) 每過1秒加1 直到99 計(jì)數(shù)。過程中你可以關(guān)閉電源,然后再開啟電源,可以看到數(shù)值并沒有從00開始計(jì)數(shù),而是從你關(guān)閉電源前的數(shù)值開始,這證明我們通過24C08設(shè)計(jì)的斷電記憶功能的計(jì)時(shí)器設(shè)計(jì)成功。按鍵K1鍵 可以使數(shù)值清零 清零后從00開始計(jì)數(shù)。

//24c08地址為0xa0

#include <reg52.h>

#define uchar unsigned char

unsigned char codetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

unsigned char sec=0; //定義計(jì)數(shù)值,每過1秒,sec加1   

unsigned int count; //定時(shí)中斷次數(shù)     

bit  write=0; //寫24C08的標(biāo)志;

sbit gewei=P2^7; //個(gè)位選通定義         

sbit shiwei=P2^6; //十位選通定義     

/////////24C08讀寫驅(qū)動程序////////////////////

sbit scl=P3^4; // 24c08 SCL            

sbit sda=P3^5; // 24c08 SDA      

sbit K5=P1^4; //清0按鍵      


/***********************************************/

void delay()  //delay 5us

{ ;; }


/**********************************************/

void delay1(uchar x)

{

       uchar a,b;

       for(a=x;a>0;a--)

       for(b=100;b>0;b--);

}

/**********************************************/

void start()  //開始信號

{      

       sda=1;

       delay();

       scl=1;

       delay();

       sda=0;

       delay();

}


/************************************************/

void stop()   //停止信號

{

       sda=0;

       delay();

       scl=1;

       delay();

       sda=1;

       delay();

}

/**************************************************/

void respons() //應(yīng)答

{

       uchar i;

       scl=1;

       delay();

       while((sda==1)&&(i<250))i++;

       scl=0;

       delay();

}


/**************************************************/

void init_24c08() //初始化24C02

{

       sda=1;

       delay();

       scl=1;

       delay();

}

/************************************************/

void write_byte(uchar date)

{

       uchari,temp;

       temp=date;

       for(i=0;i<8;i++)

       {

              temp=temp<<1;

              scl=0;

           delay();

              sda=CY;

              delay();

              scl=1;

              delay();

       //     scl=0;

     // delay();

       }

       scl=0;

       delay();

       sda=1;

       delay();

}

/**********************************************/

uchar read_byte()

{

       uchar i,k;

       scl=0;

       delay();

       sda=1;

       delay();

       for(i=0;i<8;i++)

       {

              scl=1;

              delay();  

              k=(k<<1)|sda;

              scl=0;

              delay();  

       }

       return k;

}


/*****************************************************************/


void write_24c08(uchar address,uchar shuju) //給指定地址中寫入數(shù)據(jù)

{

       start();

       write_byte(0xa0);    //  最低位為0寫,1讀

       respons();

       write_byte(address);

       respons();

       write_byte(shuju);

       respons();

       stop();

}


/*****************************************************************/

uchar read_24c08(uchar address) //從24c08指定地址中讀出數(shù)據(jù)

{

       uchardate;

       start();

       write_byte(0xa0);

       respons();

       write_byte(address);

       respons();


       start();

       write_byte(0xa1);

       respons();

       date=read_byte();

       stop();

       returndate;

}


/////////////24C02讀寫驅(qū)動程序完/////////////////////



/***********************************************************/

void LEDshow() //LED顯示函數(shù)   

{

      

   P0=table[sec/10];

    shiwei=0;

       delay1(40);

       shiwei=1;


       P0=table[sec%10];

    gewei=0;

       delay1(40);

       gewei=1;

}


/***********************************************************/

void main(void)

{


       TMOD=0x01;//定時(shí)器工作在方式1

       ET0=1;

    EA=1;

       init_24c08();//初始化24C08

       sec=read_24c08(2);//讀出保存的數(shù)據(jù)賦于sec

       TH0=(65536-50000)/256;//對TH0 TL0賦值

       TL0=(65536-50000)%256;//使定時(shí)器0.05秒中斷一次

       TR0=1; //開始計(jì)時(shí)

              while(1)

              {

                  LEDshow();

                     if(write==1)//判斷計(jì)時(shí)器是否計(jì)時(shí)一秒      

                     {

                     write=0;//清零

                     write_24c08(2,sec);//在24c08的地址2中寫入數(shù)據(jù)sec   

                     }


                if(K5==0){

                   delay1(10);

                     if(K5==0){

                      sec=0;

                     }

         }

              }

}



/**************************************************************/


void t0(void) interrupt 1 using 0 //定時(shí)中斷服務(wù)函數(shù)   

{

       TH0=(65536-50000)/256;//對TH0 TL0賦值   

       TL0=(65536-50000)%256;//重裝計(jì)數(shù)初值  

       count++;//每過50ms tcnt加一     

       if(count==20)//計(jì)滿20次(1秒)時(shí)      

       {

              count=0;//重新再計(jì)

              sec++;

              write=1;//1秒寫一次24C08

              if(sec==100)//定時(shí)100秒,在從零開始計(jì)時(shí)

              {sec=0;}

       }

}



6  拓展訓(xùn)練

   1)用24C08與1602LCD設(shè)計(jì)電子密碼鎖

   2)12864LCD顯示24C08保存的開機(jī)畫面。即運(yùn)行時(shí),單片機(jī)程序從24C08中讀取該畫面并顯示在12864LCD液晶顯示屏上。


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:255272 發(fā)表于 2018-4-26 16:05 | 只看該作者
看了很多資料了,希望自己能學(xué)會
回復(fù)

使用道具 舉報(bào)

板凳
ID:255272 發(fā)表于 2018-4-26 16:06 | 只看該作者
每次開始學(xué)習(xí)新知識都會不知所措,不知道什么事重點(diǎn),從何處下手
回復(fù)

使用道具 舉報(bào)

地板
ID:417093 發(fā)表于 2018-10-31 09:04 | 只看該作者
配圖在哪里可以看到呢?
回復(fù)

使用道具 舉報(bào)

5#
ID:765667 發(fā)表于 2020-5-31 13:12 | 只看該作者
了解了解
回復(fù)

使用道具 舉報(bào)

6#
ID:466997 發(fā)表于 2022-5-19 14:23 | 只看該作者
值 得學(xué)習(xí),MARKING!
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表