最近在學習幾種串行通訊協議,感受收穫不少,這篇文章是學習IIC總線協議的第一篇文章,之後還會再寫一篇關於PCF8591 IIC通訊的ADDA轉換芯片的文章.函數
IIC 即Inter-Integrated Circuit(集成電路總線),這種總線類型是由飛利浦半導體公司在八十年代初設計出來的一種簡單、雙向、二線制、同步串行總線,主要是用來鏈接總體電路(ICS) ,IIC是一種多向控制總線,也就是說多個芯片能夠鏈接到同一總線結構下,同時每一個芯片均可以做爲實時數據傳輸的控制源。主要包括啓始、中止、讀、寫、應答信號。這種方式簡化了信號傳輸總線接口。學習
IIC總線上能夠掛多個器件,而每一個器件都有惟一的地址,這樣能夠標識通訊目標。數據的通訊的方式採用主從方式,主機負責主動聯繫從機,而從機則被動迴應數據。ui
AT24C02是一個2K位串行CMOS E2PROM, 內部含有256個8位字節,CATALYST公司的先進CMOS技術實質上減小了器件的功耗。AT24C02有一個8字節頁寫緩衝器。該器件經過IIC總線接口進行操做,有一個專門的寫保護功能。在單片機上的應用普遍, 能夠實現掉電數據不丟失功能。spa
SCL=1期間,SDA必須保持穩定,SCL=0時,SDA才容許改變。設計
從時序圖能夠看出,起始信號爲,SCL=1,SDA降低沿;終止信號爲SCL=1,SDA爲上升沿,保持的時間是有限制的:3d
具體的程序實現以下:code
起始信號:SDA=1保持時間大於4。7us,隨後SDA=0保持時間大於4usblog
1接口 2內存 3 4 5 6 7 8 9 |
|
終止信號:SDA=0保持時間大於4us,隨後SDA=1保持時間大於4。7us
1 2 3 4 5 6 7 8 9 |
|
傳送的每個字節必須保證是8位長度。數據傳送時,先傳送最高位(MSB),每個被傳送的字節後面都必須跟隨一位應答信號(即一幀共有9位)。
如:主機往總線上發送一個字節的數據後,釋放總線,從機會把總線拉低(即應答信號),以表示這一字節發送成功
同理主機從總線上讀取完一個字節的數據後,主機會把總線拉低,"告訴"從機這一字節的數據接收成功
程序實現
應答信號:
1 2 3 4 5 6 7 8 9 |
|
根據數據手冊和原理圖能夠看出器件地址爲:0x90/0x91其中最後一位是讀寫方向位,若下一個字節爲向總線上發送數據,則爲0x90,若下一個字節是從總線上讀取數據,則爲0x91。
程序實現:先寫最高位,經過左移運算符,將一字節的數據一位一位的傳送到總線上,其中CY存儲的是左移後的進位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
程序實現:帶返回值,先讀高位,而後經過移位運算符,一位一位讀入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
程序實現:此函數無返回值,有兩個形參, 內存單元地址,範圍0-255;要寫的數據,如0xfe;
1 2 3 4 5 6 7 8 9 10 11 |
|
具體程序實現:此函數有返回值,一個形參;單元地址,範圍:0-255;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
1 2 3 4 |
|
void I2C_init() //初始化 { SDA = 1; delay(); SCL = 1; delay(); }
有了以上幾個函數,咱們就能夠寫主函數了, 功能是向內存單元211,寫入數據0xae,而後在從內存單元211中讀取出來,送給P1口led顯示.注意:寫完後要延時一會才能讀取,不然不能成功讀取.
1 2 3 4 5 6 7 |
|
經過IIC 總線通訊協議的學習,能夠看出,IIC總線用IO口模擬操做起來仍是很簡單的,使用起來仍是比較方便的,並且還能夠多個IIC器件掛接在一條總線上,只須要SDA和SCL兩根線便可,固然也有缺點,因爲是隻有一根數據線,因此不能全雙工傳輸,傳輸速度也有必定的限制.