51單片機學習筆記(郭天祥版)(9)——IIC、EEPROM

 

IIC是兩根線,單總線,只有一根數據線,發送數據和讀取收據都是一根線,像咱們以前學的AD、DA都是許多線,許多線的話,這樣作系統能夠少浪費資源,少浪費控制IO口的資源,這種並行的處理速度快。因此線越多,速度越快。編程

咱們用的較多的是SIP和IIC,單總線用得少,通常就BS18B20用。electron

 

這兩條線能夠接不少I²C設備,凡是具備I²C通訊功能的設備均可以接在這總線上。要和哪一個設備通訊,先發送一個地址碼給總線,總線全會響應這個地址碼,這條總線上全部I²C芯片會檢測這個地址,哪個地址和它相符,就和主機創建通訊,創建起後只有這個惟一的設備和總線通訊。函數

I²C比較重要,不過也比較簡單,實際上就是時序圖。ui

凡是I²C總線設備必須接上拉電阻,Rp阻值通常爲10Kurl

先傳送最高位記住。spa

 

隨便兩條線均可以模仿I²C總線3d


 

接下來講E²PROM(electronic erase program read only memory)電可擦除可編程只讀存儲器code

其實就是Flash,例如U盤插上去,數據寫完後拔走,就存在裏面了。blog

這裏第二條最高位錯了,最高位不是不變,是補0.接口

這裏用的實際上是24C02

 A0~A2就是三位地址線,WP(write protect)寫保護,U盤就有這功能,爲1時不能寫,不知道能不能讀。

接下來看看datasheet

低電壓和標準電壓都支持,這裏使用的是2.7~5.5V。

內部構造2K~16K。

兩線接口。

施密特觸發器、濾波用來抑制噪聲。

雙向數據傳輸協議。

電壓越高傳輸速率越快(電壓越高運行速度越快,越快功耗越高),1.8V->100kHz,5V->400kHz

2K一頁,4K+是多頁,C02一頁的不用管。

最多可讀寫1Million次

數據保存時間100年。

NC是不鏈接的意思。

這裏有四種封裝

總線時序圖

寫:

數據有效性:

起始信號和中止信號:

應答信號:

地址:

寫:

頁寫(無論)

當前地址讀取(即已經知道了讀取的地址):

隨機讀取:

順序讀取:


 如今寫程序:

有起始信號,中止信號,應答信號,寫一個字節,讀一個字節,從任意字節讀,向任意字節寫,咱們把這些都寫成帶參數的函數(例如write(地址變量,數據變量)),主函數直接調用就能夠了,這就能夠當成是一個I²C的模板。

 

 1 #include<reg51.h>
 2 
 3 #define uchar unsigned char
 4 #define uint unsigned int
 5 
 6 sbit SDA=P2^0;  7 sbit SCL=P2^1;  8 
 9 //uchar code Table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};  10 // 0 1 2 3 4 5 6 7 8 9 A B C D E F 無顯示
 11 
 12 void Delay1ms();  13 void delay1(int n);  14 void delay();  15 void start();  16 void stop();  17 void responds();  18 void init();  19 void write_byte(uchar date);  20 uchar read_byte();  21 
 22 void main()  23 {  24  init();  25  start();  26     write_byte(0xa0);  27  responds();  28     write_byte(0);  29  responds();  30     write_byte(0xfe);  31  responds();  32  stop();  33     
 34     delay1(1000);//這裏要有延時,中止後不能直接啓動
 35     
 36  start();  37     write_byte(0xa0);  38  responds();  39     write_byte(0);  40  responds();  41  start();  42     write_byte(0xa1);  43  responds();  44     P1=read_byte();  45  stop();  46     while(1);  47 }  48 void write_byte(uchar date)  49 {  50     //寫一個字節
 51     uchar i=0,temp;  52     temp=date;  53     SCL=0;  54  delay();  55     for(i=0;i<8;i++)  56  {  57         temp=temp<<1;  58         SDA=CY;  59  delay();  60         SCL=1;  61  delay();  62         SCL=0;  63  delay();  64  }  65     SDA=1;  66  delay();  67 }  68 uchar read_byte()  69 {  70     //讀一個字節
 71  uchar i,j,k;  72     SCL=0;  73  delay();  74     SDA=1;  75  delay();  76     for(i=0;i<8;i++)  77  {  78         SCL=1;  79  delay();  80         j=SDA;  81         k=(k<<1)|j;  82         SCL=0;  83  delay();  84  }  85     return k;  86 }  87 void init()  88 {  89     SDA=1;  90     SCL=1;  91 }  92 void start()  93 {  94     //起始信號
 95     SDA=1;  96  delay();  97     SCL=1;  98  delay();  99     SDA=0; 100  delay(); 101     
102 } 103 void stop() 104 { 105     //中止信號
106     SDA=0; 107  delay(); 108     SCL=1; 109  delay(); 110     SDA=1; 111  delay(); 112 } 113 void responds() 114 { 115     //應答信號
116     uchar i=0; 117     SCL=1; 118  delay(); 119     while((SDA==1)&&(i<250)) 120  { 121         i++; 122  } 123     SCL=0; 124  delay(); 125 } 126 void delay() 127 { 128     
129 } 130 void delay1(int n) 131 { 132     while(n--) 133  { 134  Delay1ms(); 135  } 136 } 137 void Delay1ms()        //@12.000MHz
138 { 139     unsigned char i, j; 140 
141     i = 2; 142     j = 239; 143     do
144  { 145         while (--j); 146     } while (--i); 147 }

 

1.寫入時間是在你傳入EEPROM數據後纔開始進行的,傳送數據過程當中,不能算寫入時間,EEPROM在IIC在中止位後纔開始寫入動做,從這一刻開始至6MS之間算爲寫入時間;

(資料來源https://www.baidu.com/link?url=GmfN6JMOsWVFgIB6hDzhhJcKdWzwvsnfOB6IC8skYfUoabglVRyz1gaWIKND0Xha&wd=&eqid=f1e2a27a000817f9000000025cb9d508)

相關文章
相關標籤/搜索