作者:Liklon IIC 即Inter-Integrated Circuit(集成電路總線(xiàn)),這種總線(xiàn)類(lèi)型是由飛利浦半導體公司在八十年代初設計出來(lái)的,主要是用來(lái)連接整體電路(ICS) ,IIC是一種多向控制總線(xiàn),也就是說(shuō)多個(gè)芯片可以連接到同一總線(xiàn)結構下,同時(shí)每個(gè)芯片都可以作為實(shí)時(shí)數據傳輸的控制源。這種方式簡(jiǎn)化了信號傳輸總線(xiàn)。 I2C串行總線(xiàn)一般有兩根信號線(xiàn),一根是雙向的數據線(xiàn)SDA,另一根是時(shí)鐘線(xiàn)SCL。所有接到I2C總線(xiàn)設備上的串行數據SDA都接到總線(xiàn)的SDA上,各設備的時(shí)鐘線(xiàn)SCL接到總線(xiàn)的SCL上。以51單片機和AT24C02介紹IO模擬IIC通信。 啟始與停止 ![]() 啟始條件:必須在所有命令之前發(fā)送,時(shí)鐘線(xiàn)保持高電平期間,數據線(xiàn)電平從高到低的跳變作為IIC總線(xiàn)的啟動(dòng)信號。 停止條件:時(shí)鐘線(xiàn)保持高電平期間,數據線(xiàn)電平從低到高的跳變作為IIC總線(xiàn)的停止信號。操作結束時(shí)必須發(fā)送停止條件。 void startbit() { clrSCL(); setSDA(); setSCL(); //時(shí)鐘為高時(shí) clrSDA(); //SDA下降沿 clrSCL(); } void stopbit() { clrSCL(); clrSDA(); setSCL(); //時(shí)鐘為高時(shí) setSDA(); //SDA上升沿 clrSCL(); } 應答信號 ![]() 每次數據傳送成功后,從設備發(fā)送一個(gè)應答信號。當第九個(gè)時(shí)鐘信號產(chǎn)生時(shí),產(chǎn)生應答信號的器件將SDA下拉為低,通知已經(jīng)接收到8位數據。 void respond() { unsigned char i = 0; setSDA(); //釋放總線(xiàn) setSCL(); //時(shí)鐘 while(SDA != 0) { i++; if(i > 200) break; } clrSCL(); } 讀寫(xiě)字節操作 ![]() IIC總線(xiàn)協(xié)議定義如下: 1. 只有在總線(xiàn)非忙時(shí)才被允許進(jìn)行數據傳輸。 2. 在數據傳輸時(shí),當時(shí)鐘線(xiàn)為高電平,數據線(xiàn)必須為固定狀態(tài),不允許跳變,時(shí)鐘線(xiàn)為高電平時(shí)數據線(xiàn)的任何電平變化都會(huì )被當做總線(xiàn)的啟動(dòng)或停止條件 void writeByte(unsigned char dat) { unsigned char i = 0; for(i = 0;i < 8;i++) { clrSCL(); //拉低時(shí)鐘線(xiàn),改變SDA線(xiàn)的電平 if(dat & 0x80) setSDA(); else clrSDA(); setSCL(); //SDA電平穩定后,拉高時(shí)鐘線(xiàn) dat <<= 1; } clrSCL(); } unsigned char readByte() { unsigned char i = 0,tmp = 0; for(i = 0;i < 8;i++) { clrSCL(); //拉低時(shí)鐘線(xiàn) tmp <<= 1; //準備讀取數據 setSCL(); //拉高時(shí)鐘線(xiàn) if(SDA) tmp |= 0x01; } clrSCL(); return tmp; } AT24C02讀寫(xiě)操作 ![]() void writeAT24XX(unsigned char addr,unsigned char dat) { startbit(); //起始信號 writeByte(0xa0); //器件地址 respond(); writeByte(addr); //器件內部地址 respond(); writeByte(dat); //數據 respond(); stopbit(); //停止 } ![]() unsigned char readAT24XX(unsigned char addr) { unsigned char dat; startbit(); //起始信號 writeByte(0xa0); //器件地址 respond(); writeByte(addr); //器件內部地址 respond(); startbit(); //起始信號 writeByte(0xa1); //器件地址 respond(); dat = readByte(); //數據 stopbit(); //停止 return dat; } 主函數部分內容以及程序運行效果: void main() { unsigned char dat; initUart(); sendString("UART INIT OK!!!\n"); //串口通信初始化 sendString("write 0x05 --> addr 0x00 \n");//寫(xiě)入5到期間內部地址0 writeAT24XX(0x00,0x05); //寫(xiě)入數據 sendString("read dat <-- addr 0x00 \n"); //讀出寫(xiě)入數據 dat = readAT24XX(0x00); //讀出數據 sendString("dat-->"); //打印 sendByte(dat + '0'); while(1); } ![]() |