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)