I2C總線入門(很詳細,很經典).doc_第1頁
I2C總線入門(很詳細,很經典).doc_第2頁
I2C總線入門(很詳細,很經典).doc_第3頁
I2C總線入門(很詳細,很經典).doc_第4頁
I2C總線入門(很詳細,很經典).doc_第5頁
免費預覽已結束,剩余11頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

I2C總線入門1) 最近學習51單片機,學到A/D,D/A轉換的時候發現我板子上的轉換芯片不是書上所講的ADC0804和DAC0832而是PCF8591T,看了一下它的數據手冊,發現它并不是書上所說的并行傳輸數據,是使用 I2C 總線傳輸的。搞了兩天才搞懂,寫出來給大家分享一下,不足之處請務必不吝指出。以上是I2C總線的簡單介紹。就比如說AT24C02存儲芯片,和PCF8591數模模數轉換芯片都支持I2C端口。(如下圖) 2) 接下來看如何使用I2C總線進行通信以上是I2C總線通信的格式。由上圖可以看出進行通信需要以下幾個步驟a.初始化I2C總線就是把SDA和SCL都變成高電平。void init()/初始化SDA=1;delay();SCL=1;delay();delay()為延時函數void delay()/延時4-5個微秒;b.發送起始信號就是保持SCL為高電平,而SDA從高電平降為低電平(這是I2C總線的規定,別問我為什么)void start()/起始信號SDA=1;delay();SCL=1;delay();SDA=0;delay();c.發送地址字(芯片的硬件地址)(8591的數據手冊) 前四位對同一種芯片來說是固定的,不同的芯片之間不同。就像pcf8591是1001而at24c02是1010 接下來三位A0,A1,A2是可編程的三個地址位,這里說說的編程并不是通過軟件編程,而是把A0,A1,A2三個引腳接不同的電壓來確定數值。接VCC表示1,接GND表示0。為什么要有這三個呢?因為有可能你在I2C總線上“并聯”了不止一個相同的元件(比如說接了三個8591),那你如何來分辨你要操作的是哪一個芯片呢,就是通過設置A0,A1,A2的數值,來區別??删幊痰牡刂芬粋€有三位,也就是說最多可以接8個相同的芯片在同一個I2C總線上。 最后一位是 讀/寫 位,1為讀,0為寫。如何寫數據寫數據只需要按照時序圖1.先將SCL置0(只有它為0的時候SDA才允許變化)2.改變SDA是數值(就是你當前要穿的一位是0還是1)3.把SCL置1(此時芯片就會讀取總線上的數據)下面是代碼#define uchar unsigned char#define uint unsigned intvoid write_byte(uchar date)/寫一字節數據uchar i,temp;temp=date;for(i=0;i8;i+)temp=temp1;/左移一位 移出的一位在CY中SCL=0;/只有在scl=0時sda能變化值delay();SDA=CY;delay();SCL=1;delay();SCL=0;delay();SDA=1;delay();發送地址的時候只需把地址傳給該函數即可。 d.應答(ACK) 每接受或發送一字節數據后都需要發送一位應答,來表是否收到了前面一個字節的數據。void respons()/應答 相當于一個智能的延時函數uchar i;SCL=1;delay();while(SDA=1)&(i250)/沒收到應答,我等!i+;/等了250次沒收到就不管他了,就當他收到了-_- /其實沒收到的話可以結束程序的SCL=0;delay();e.發送/接受數據(取決于前面地址字的最后一位讀/寫位)發送數據和上面的發送地址調用同一個函數,只要穿給他數據即可。 接收數據其實和發送數據差不多,只不過要把接收到的數據一位一位拼裝成一字節數據,看代碼uchar read_byte()uchar i,k;SCL=0;delay();SDA=1;delay();for(i=0;i8;i+)SCL=1;delay();k=(k1)|SDA;/先左移一位,再在最低位接受當前位SCL=0;delay();return k;f.應答g.如此循環,直到數據一個字一個字的發完h.發送終止信號 就是SCL在高電平的時候SDA由低電平變成高電平void stop()/停止信號SDA=0;delay();SCL=1;delay();SDA=1;delay();以上就是整個數據傳輸的過程了 為了更好的掌握I2C總線我在此放兩個例子,一個是書上(郭天祥的,你們懂的)EPROM存儲定時時間的例子,還有就是用PCF8591進行D/A轉換的例子。1.EPROM存儲定時時間/JP10(P0)接JP12/我發現數據手冊(電路圖pdf)上錯了 SCL連的是P21 而SDA連的P20/程序功能:在數碼管上顯示數字,每隔1s增加1/ 但是每次復位或者掉電程序都會把當前數值存儲到AT24C02中,并在下次啟動時讀取#include #define uchar unsigned char#define uint unsigned intbit write=0;/寫24c02的標志sbit SCL=P21; /串行時鐘輸入端sbit SDA=P20; /串行數據輸入端sbit LS138A=P22;/138譯碼器的3位 控制數碼管的 sbit LS138B=P23;sbit LS138C=P24;uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/數顯管字模uchar second,tempt;/second用來計秒數 ,tempt用來臨時存放0.05s的次數 滿20即1s寫入void delay()/延時4-5個微秒;void delay_1ms(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void start()/起始信號SDA=1;delay();SCL=1;delay();SDA=0;delay();void stop()/停止信號SDA=0;delay();SCL=1;delay();SDA=1;delay();void respons()/應答 相當于一個智能的延時函數uchar i;SCL=1;delay();while(SDA=1)&(i250)/沒收到應答,我等!i+;/等了250次沒收到就不管他了,就當他收到了-_- /其實沒收到的話可以結束程序的SCL=0;delay();void init()/初始化SDA=1;delay();SCL=1;delay();void write_byte(uchar date)/寫一字節數據uchar i,temp;temp=date;for(i=0;i8;i+)temp=temp1;/左移一位 移出的一位在CY中SCL=0;/只有在scl=0時sda能變化值delay();SDA=CY;delay();SCL=1;delay();SCL=0;delay();SDA=1;delay();uchar read_byte()uchar i,k;SCL=0;delay();SDA=1;delay();for(i=0;i8;i+)SCL=1;delay();k=(k=100)second=0;TMOD=0x01;/定時器工作方式1ET0=1;EA=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;/開始計時while(1)display(second/10,second%10);if(write=1)write=0;write_add(2,second);void t0() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;tempt+;if(tempt=20)tempt=0;second+;write=1;if(second=100)second=0;這是電路圖為了更好的掌握I2C總線我在此放兩個例子,一個是書上(郭天祥的,你們懂的)EPROM存儲定時時間的例子,還有就是用PCF8591進行D/A轉換的例子。1.EPROM存儲定時時間/I2C總線很強大/程序功能:通過DA轉換把輸出電壓逐漸增大,使加在上面的發光二級管慢慢變亮/ 到最亮后再變暗,如此循環#include #define uchar unsigned char#define uint unsigned int#define PCF8591 0x90 /PCF8591 地址sbit SCL=P21; /串行時鐘輸入端sbit SDA=P20; /串行數據輸入端void delay()/延時4-5個微秒;void delay_1ms(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void start()/開始信號SDA=1;delay();SCL=1;delay();SDA=0;delay();void stop()/停止信號SDA=0;delay();SCL=1;delay();SDA=1;delay();void respons()/應答 相當于一個智能的延時函數uchar i;SCL=1;delay();while(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論