最近在學習幾種序列通訊協議,感覺收穫很多,這篇文章是學習iic匯流排協議的第一篇文章,以後還會再寫一篇關於pcf8591 iic通訊的adda轉換晶元的文章.
iic 即inter-integrated circuit(積體電路匯流排),這種匯流排型別是由飛利浦半導體公司在八十年代初設計出來的一種簡單、雙向、二線制、同步序列匯流排,主要是用來連線整體電路(ics) ,iic是一種多向控制匯流排,也就是說多個晶元可以連線到同一匯流排結構下,同時每個晶元都可以作為實時資料傳輸的控制源。主要包括啟始、停止、讀、寫、應答訊號。這種方式簡化了訊號傳輸匯流排介面。
iic匯流排上可以掛多個器件,而每個器件都有唯一的位址,這樣可以標識通訊目標。資料的通訊的方式採用主從方式,主機負責主動聯絡從機,而從機則被動回應資料。
at24c02是乙個2k位序列cmos e2prom, 內部含有256個8位位元組,catalyst公司的先進cmos技術實質上減少了器件的功耗。at24c02有乙個8位元組頁寫緩衝器。該器件通過iic匯流排介面進行操作,有乙個專門的寫保護功能。在微控制器上的應用廣泛, 可以實現掉電資料不丟失功能。
scl=1期間,sda必須保持穩定,scl=0時,sda才允許改變。
從時序圖可以看出,起始訊號為,scl=1,sda下降沿;終止訊號為scl=1,sda為上公升沿,保持的時間是有限制的:
具體的程式實現如下:
起始訊號:sda=1保持時間大於4。7us,隨後sda=0保持時間大於4us
/*sda下降沿*/
void
start()
終止訊號:sda=0保持時間大於4us,隨後sda=1保持時間大於4。7us
/*sda上公升沿*/
傳送的每乙個位元組必須保證是8位長度。資料傳送時,先傳送最高位(msb),每乙個被傳送的位元組後面都必須跟隨一位應答訊號(即一幀共有9位)。
如:主機往匯流排上傳送乙個位元組的資料後,釋放匯流排,從機會把匯流排拉低(即應答訊號),以表示這一位元組傳送成功
同理主機從匯流排上讀取完乙個位元組的資料後,主機會把匯流排拉低,"告訴"從機這一位元組的資料接收成功
程式實現
應答訊號:
程式實現:先寫最高位,通過左移運算子,將一位元組的資料一位一位的傳送到匯流排上,其中cy儲存的是左移後的進製
void
write_byte(uchar dat)
scl = 0;
// delay();
sda = 1;
//釋放sda
delay();
}
程式實現:帶返回值,先讀高位,然後通過移位運算子,一位一位讀入
程式實現:此函式無返回值,有兩個形參, 記憶體單元位址,範圍0-255;要寫的資料,如0xfe;
具體程式實現:此函式有返回值,乙個形參;單元位址,範圍:0-255;
uchar read_at24c02(uchar unit_addr)
void
delay()
//短暫5us延時
void i2c_init() //初始化有了以上幾個函式,我們就可以寫主函式了, 功能是向記憶體單元211,寫入資料0xae,然後在從記憶體單元211中讀取出來,送給p1口led顯示.注意:寫完後要延時一會才能讀取,否則不能成功讀取.
void
main()
通過iic 匯流排通訊協議的學習,可以看出,iic匯流排用io口模擬操作起來還是很簡單的,使用起來還是比較方便的,而且還可以多個iic器件掛接在一條匯流排上,只需要sda和scl兩根線即可,當然也有缺點,由於是只有一根資料線,所以不能全雙工傳輸,傳輸速度也有一定的限制.
我是初學者,以上內容如有錯誤,歡迎指正.
51微控制器 IIC
iic inter intergrated circuit 匯流排是一種由philips公司開發的兩線式序列匯流排。用於連線微控制器及其外圍裝置。iic只需兩根線sda 資料線 scl 時鐘 iic支援多主控,當然,在任何時間點上只能有乙個主控,而spi是一主多從。iic各種被控制電路均併聯在這條匯...
基於51微控制器IIC通訊的AT24C02學習筆記
最近在學習幾種序列通訊協議,感覺收穫很多,這篇文章是學習iic匯流排協議的第一篇文章,以後還會再寫一篇關於pcf8591 iic通訊的adda轉換晶元的文章.iic 即inter integrated circuit 積體電路匯流排 這種匯流排型別是由飛利浦半導體公司在八十年代初設計出來的一種簡單 ...
基於51微控制器IIC通訊的AT24C02學習筆記
最近在學習幾種序列通訊協議,感覺收穫很多,這篇文章是學習iic匯流排協議的第一篇文章,以後還會再寫一篇關於pcf8591 iic通訊的adda轉換晶元的文章.iic 即inter integrated circuit 積體電路匯流排 這種匯流排型別是由飛利浦半導體公司在八十年代初設計出來的一種簡單 ...