欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: I2C總線入門(PCF8591T和AT24C02的使用) [打印本頁]

作者: piaolin    時間: 2015-10-29 17:43
標題: I2C總線入門(PCF8591T和AT24C02的使用)
1) 最近學習51單片機,學到A/D,D/A轉換的時候發現我板子上的轉換芯片不是書上所講的ADC0804和DAC0832而是PCF8591T,看了一下它的數據手冊,發現它并不是書上所說的并行傳輸數據,是使用 I2C 總線傳輸的。搞了兩天才搞懂,寫出來給大家分享一下,不足之處請務必不吝指出。



以上是I2C總線的簡單介紹。


就比如說AT24C02存儲芯片,和PCF8591數模模數轉換芯片都支持I2C端口。(如下圖)
         



2) 接下來看如何使用I2C總線進行通信


以上是I2C總線通信的格式。
由上圖可以看出進行通信需要以下幾個步驟
a.初始化I2C總線
就是把SDA和SCL都變成高電平。

[cpp] view plaincopyprint?


delay()為延時函數

[cpp] view plaincopyprint?




b.發送起始信號
就是保持SCL為高電平,而SDA從高電平降為低電平(這是I2C總線的規定,別問我為什么)

[cpp] view plaincopyprint?





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(此時芯片就會讀取總線上的數據)
下面是代碼

[cpp] view plaincopyprint?




[cpp] view plaincopyprint?



    發送地址的時候只需把地址傳給該函數即可。
                       
  d.應答(ACK)
    每接受或發送一字節數據后都需要發送一位應答,來表是否收到了前面一個字節的數據。



[cpp] view plaincopyprint?






e.發送/接受數據(取決于前面地址字的最后一位讀/寫位)
    發送數據和上面的發送地址調用同一個函數,只要穿給他數據即可。
    接收數據其實和發送數據差不多,只不過要把接收到的數據一位一位拼裝成一字節數據,看代碼~

[cpp] view plaincopyprint?





f.應答
g.·······如此循環,直到數據一個字一個字的發完
h.發送終止信號
    就是SCL在高電平的時候SDA由低電平變成高電平

[cpp] view plaincopyprint?



以上就是整個數據傳輸的過程了




為了更好的掌握I2C總線我在此放兩個例子,一個是書上(郭天祥的,你們懂的)EPROM存儲定時時間的例子,還有就是用PCF8591進行D/A轉換的例子。

1.EPROM存儲定時時間
[cpp] view plaincopyprint?



這是電路圖


2.DA轉換

[cpp] view plaincopyprint?








作者: 騰飛的龍    時間: 2015-10-29 22:58
高手啊學習分享學習啦
作者: 公子墨    時間: 2017-7-3 09:45
樓主,感謝分享,我的板子沒有時鐘輸入端,只有數據輸入端,數據輸出端,Gnd,關于數模轉換的那個怎么弄

作者: chaoself    時間: 2018-1-26 22:12
高手啊學習分享學習啦
作者: INSIST    時間: 2018-3-20 20:21
void write_byte(uchar date) //寫一字節數據 {     uchar i,temp;     temp=date;     for(i=0;i<8;i++)     {         temp=temp<<1; //左移一位 移出的一位在CY中         SCL=0;          //只有在scl=0時sda能變化值         delay();         SDA=CY;         delay();         SCL=1;         delay();     }     SCL=0;     delay();     SDA=1;     delay(); }
作者: INSIST    時間: 2018-3-20 20:22
可以在詳細說一下,是怎樣說一字節的數據嗎
作者: QQ572008555    時間: 2020-2-18 23:00
我目前看了一半 不過大體上都看懂了 后面的還沒看懂 不過具體等實戰




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1