I2C總線入門很詳細很經(jīng)典_第1頁
I2C總線入門很詳細很經(jīng)典_第2頁
I2C總線入門很詳細很經(jīng)典_第3頁
I2C總線入門很詳細很經(jīng)典_第4頁
I2C總線入門很詳細很經(jīng)典_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、.i2c總線入門1) 最近學習51單片機,學到a/d,d/a轉(zhuǎn)換的時候發(fā)現(xiàn)我板子上的轉(zhuǎn)換芯片不是書上所講的adc0804和dac0832而是pcf8591t,看了一下它的數(shù)據(jù)手冊,發(fā)現(xiàn)它并不是書上所說的并行傳輸數(shù)據(jù),是使用 i2c 總線傳輸?shù)?。搞了兩天才搞懂,寫出來給大家分享一下,不足之處請務必不吝指出。以上是i2c總線的簡單介紹。就比如說at24c02存儲芯片,和pcf8591數(shù)模模數(shù)轉(zhuǎn)換芯片都支持i2c端口。(如下圖)精品. 2) 接下來看如何使用i2c總線進行通信以上是i2c總線通信的格式。精品.由上圖可以看出進行通信需要以下幾個步驟a.初始化i2c總線就是把sda和scl都變成高電平。

2、void init()/初始化sda=1;delay();scl=1;delay();delay()為延時函數(shù)void delay()/延時4-5個微秒;b.發(fā)送起始信號就是保持scl為高電平,而sda從高電平降為低電平(這是i2c總線的規(guī)定,別問我為什么)void start()/起始信號sda=1;delay();scl=1;delay();sda=0;delay();精品.c.發(fā)送地址字(芯片的硬件地址)(8591的數(shù)據(jù)手冊) 前四位對同一種芯片來說是固定的,不同的芯片之間不同。就像pcf8591是1001而at24c02是1010 接下來三位a0,a1,a2是可編程的三個地址位,這里說

3、說的編程并不是通過軟件編程,而是把a0,a1,a2三個引腳接不同的電壓來確定數(shù)值。接vcc表示1,接gnd表示0。為什么要有這三個呢?因為有可能你在i2c總線上“并聯(lián)”了不止一個相同的元件(比如說接了三個8591),那你如何來分辨你要操作的是哪一個芯片呢,就是通過設置a0,a1,a2的數(shù)值,來區(qū)別。可編程的地址一個有三位,也就是說最多可以接8個相同的芯片在同一個i2c總線上。 最后一位是 讀/寫 位,1為讀,0為寫。如何寫數(shù)據(jù)寫數(shù)據(jù)只需要按照時序圖1.先將scl置0(只有它為0的時候sda才允許變化)2.改變sda是數(shù)值(就是你當前要穿的一位是0還是1)精品.3.把scl置1(此時芯片就會讀取

4、總線上的數(shù)據(jù))下面是代碼#define uchar unsigned char#define uint unsigned intvoid write_byte(uchar date)/寫一字節(jié)數(shù)據(jù)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();精品.發(fā)送地址的時候只需把地址傳給該函數(shù)即可。 d.應答(ack) 每接受或發(fā)送一字節(jié)數(shù)據(jù)后都需要發(fā)送

5、一位應答,來表是否收到了前面一個字節(jié)的數(shù)據(jù)。void respons()/應答 相當于一個智能的延時函數(shù)uchar i;scl=1;delay();while(sda=1)&(i250)/沒收到應答,我等!i+;/等了250次沒收到就不管他了,就當他收到了-_- /其實沒收到的話可以結(jié)束程序的scl=0;delay();e.發(fā)送/接受數(shù)據(jù)(取決于前面地址字的最后一位讀/寫位)發(fā)送數(shù)據(jù)和上面的發(fā)送地址調(diào)用同一個函數(shù),只要穿給他數(shù)據(jù)即可。 精品.接收數(shù)據(jù)其實和發(fā)送數(shù)據(jù)差不多,只不過要把接收到的數(shù)據(jù)一位一位拼裝成一字節(jié)數(shù)據(jù),看代碼uchar read_byte()uchar i,k;scl=0;de

6、lay();sda=1;delay();for(i=0;i8;i+)scl=1;delay();k=(k1)|sda;/先左移一位,再在最低位接受當前位scl=0;delay();return k;f.應答g.如此循環(huán),直到數(shù)據(jù)一個字一個字的發(fā)完h.發(fā)送終止信號 就是scl在高電平的時候sda由低電平變成高電平void stop()/停止信號sda=0;delay();scl=1;delay();sda=1;delay();以上就是整個數(shù)據(jù)傳輸?shù)倪^程了 精品.為了更好的掌握i2c總線我在此放兩個例子,一個是書上(郭天祥的,你們懂的)eprom存儲定時時間的例子,還有就是用pcf8591進行d/

7、a轉(zhuǎn)換的例子。1.eprom存儲定時時間/jp10(p0)接jp12/我發(fā)現(xiàn)數(shù)據(jù)手冊(電路圖pdf)上錯了 scl連的是p21 而sda連的p20/程序功能:在數(shù)碼管上顯示數(shù)字,每隔1s增加1/ 但是每次復位或者掉電程序都會把當前數(shù)值存儲到at24c02中,并在下次啟動時讀取#include #define uchar unsigned char#define uint unsigned intbit write=0;/寫24c02的標志sbit scl=p21; /串行時鐘輸入端sbit sda=p20; /串行數(shù)據(jù)輸入端sbit ls138a=p22;/138譯碼器的3位 控制數(shù)碼管的 s

8、bit ls138b=p23;sbit ls138c=p24;uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/數(shù)顯管字模uchar second,tempt;/second用來計秒數(shù) ,tempt用來臨時存放0.05s的次數(shù) 滿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

9、=0;delay();void stop()/停止信號sda=0;delay();scl=1;delay();sda=1;delay();void respons()/應答 相當于一個智能的延時函數(shù)uchar i;scl=1;delay();while(sda=1)&(i250)/沒收到應答,我等!i+;/等了250次沒收到就不管他了,就當他收到了-_- /其實沒收到的話可以結(jié)束程序的scl=0;delay();void init()/初始化sda=1;delay();scl=1;delay();void write_byte(uchar date)/寫一字節(jié)數(shù)據(jù)uchar i,temp;te

10、mp=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;/定時器工作方式1精品.et0=1;ea=1;th0=(65536-50000)/256;tl0=(

11、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存儲定時時間的例子,還有就是用

12、pcf8591進行d/a轉(zhuǎn)換的例子。1.eprom存儲定時時間/i2c總線很強大/程序功能:通過da轉(zhuǎn)換把輸出電壓逐漸增大,使加在上面的發(fā)光二級管慢慢變亮/ 到最亮后再變暗,如此循環(huán)#include #define uchar unsigned char#define uint unsigned int#define pcf8591 0x90 /pcf8591 地址sbit scl=p21; /串行時鐘輸入端sbit sda=p20; /串行數(shù)據(jù)輸入端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()/應答 相當于一個智能的延時函數(shù)uchar i;scl=1;de

溫馨提示

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

評論

0/150

提交評論