新聞中心

        關(guān)于I2C的總結(jié)

        作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò) 收藏
        這兩天在看I2C,為了加深印象,把我遇到的一些問(wèn)題寫(xiě)出來(lái)吧。

        本文引用地址:http://www.104case.com/article/201611/322145.htm

        1——————

        最先遇到的問(wèn)題是AT24C02的操作時(shí)序,AT24C02內(nèi)部有一個(gè)指針,指向儲(chǔ)存空間的某一個(gè)字節(jié),另外AT24C系列支持頁(yè)操作,對(duì)于AT24C02一個(gè)頁(yè)是8字節(jié),也就是說(shuō)地址的高5位是頁(yè)地址,在同一次寫(xiě)入中,頁(yè)地址不變,低3位地址一次增加,當(dāng)增加到7之后再加1就變成0了,而由于頁(yè)地址不變,相當(dāng)于指針回到了頁(yè)首,如果繼續(xù)寫(xiě)那前面的內(nèi)容會(huì)被覆蓋。寫(xiě)數(shù)據(jù)的時(shí)序,先是I2C的開(kāi)始信號(hào),發(fā)送設(shè)備地址,之后寫(xiě)入希望寫(xiě)入的數(shù)據(jù)地址,然后依次寫(xiě)入數(shù)據(jù)。當(dāng)然,可以只寫(xiě)一個(gè)字節(jié)的數(shù)據(jù)。

        對(duì)于讀取,是不存在頁(yè)的概念的,時(shí)序是先發(fā)送啟動(dòng)信號(hào),然后發(fā)送設(shè)備地址(注意,是寫(xiě)設(shè)備的時(shí)候的地址,也就是說(shuō)最低位是1),接著發(fā)送數(shù)據(jù)地址,完了之后重新發(fā)送一次啟動(dòng)信號(hào),接著就可以讀取了,讀取完一個(gè)字節(jié)的數(shù)據(jù)后要發(fā)送一個(gè)ACK,對(duì)于最后一個(gè)字節(jié)的數(shù)據(jù)要發(fā)送一個(gè)NACK來(lái)告訴AT24C數(shù)據(jù)已經(jīng)接收完畢,之后發(fā)送結(jié)束信號(hào)斷開(kāi)連接即可。也可以只接收一個(gè)數(shù)據(jù),這時(shí)候一個(gè)ACK都沒(méi)有,第一次接收好直接發(fā)送一個(gè)NACK。

        24C02的內(nèi)部有連續(xù)的子地址空間,對(duì)這些空間進(jìn)行n個(gè)字節(jié)的連續(xù)讀/寫(xiě)時(shí),都具有地址自動(dòng)加1功能。只要設(shè)定好要讀/寫(xiě)的器件內(nèi)起始子地址及字節(jié)數(shù),就能完成整個(gè)操作。
        注意:對(duì)于24C02連續(xù)寫(xiě)的字節(jié)數(shù)不應(yīng)超過(guò)頁(yè)容量8,一次連續(xù)寫(xiě)所形成的總線(xiàn)傳送結(jié)束后(主機(jī)發(fā)出停止信號(hào)后),24C02執(zhí)行內(nèi)部擦寫(xiě)過(guò)程,大約需要10ms左右,24C02不再應(yīng)答主器件的任何請(qǐng)求。
        24C02內(nèi)有一個(gè)8位的地址計(jì)數(shù)器,連續(xù)讀操作時(shí),24C02每次輸出一個(gè)數(shù)據(jù)字節(jié)后,地址計(jì)數(shù)器自動(dòng)加1,當(dāng)?shù)刂酚?jì)數(shù)器加到255,并輸出一個(gè)字節(jié)數(shù)據(jù)后,地址計(jì)數(shù)器將翻轉(zhuǎn)到0,并繼續(xù)輸出數(shù)據(jù)字節(jié),這樣整個(gè)存儲(chǔ)區(qū)域可以在一個(gè)讀操作內(nèi)全部讀完。

        #define SLAW 0xA0
        uchar delay(uchar j)
        { uchar k,l;
        for(l=0;l<=j;l++)
        for(k=0;k<=250;k++);
        return 0;
        }
        void main()
        {
        uchar sbuf[5]={0x00,0x12,0x55,0x30,0x12};
        uchar rbuf[5];
        I2C_SendStr(SLAW,0x10,tbuf,0x5);

        delay(100);
        I2C_RcvStr(SLAW,0x10,rbuf,0x5);

        while(1);
        }
        }

        2——————

        在次我只發(fā)表對(duì)I2C確認(rèn)信號(hào)的看法,至于它的一整套時(shí)序就不多羅嗦了。

        1)MASTER向SLAVE發(fā)送數(shù)據(jù):
        MASTER沒(méi)向SLAVE端發(fā)送8位數(shù)據(jù)后,就會(huì)將SDA置1,等待SLAVE端的確認(rèn);SLAVE端如果正確接受到數(shù)據(jù),就會(huì)自動(dòng)將SDA置0。我們程序員所能做的只能是檢測(cè)確認(rèn)信號(hào),即每發(fā)送完8位數(shù)據(jù)后就檢測(cè)一次SDA的狀態(tài),如果是0,則讓程序繼續(xù)往下執(zhí)行,如果是1則強(qiáng)迫MASTER將剛才的8位數(shù)據(jù)再發(fā)送一遍;當(dāng)然,如果SDA一直是1,也就是SLAVE一直未能正確接受到數(shù)據(jù),我們也不能一直讓MASTER反復(fù)發(fā)送,要做TIMEOUT處理,以防系統(tǒng)死機(jī)!

        2) MASTER從SLAVE讀取數(shù)據(jù):
        MASTER從SLAVE端讀取數(shù)據(jù),情況與發(fā)送數(shù)據(jù)有所區(qū)別,在讀到最后8位數(shù)據(jù)時(shí),要將SDA置1,也就是做UNACK動(dòng)作,讓系統(tǒng)知道讀取數(shù)據(jù)到此結(jié)束;這個(gè)置1動(dòng)作由程序員來(lái)做,而不是MASTER本身,因?yàn)閿?shù)據(jù)讀到哪里結(jié)束,只有我們程序員知道!

        3) 說(shuō)明:MASTER 指主控制端,在一般系統(tǒng)中就是我們常說(shuō)的單片機(jī)了;SLAVE是指具備I2C協(xié)議的專(zhuān)用IC,比如ATMEL的24系列(24C16、14C32等)和PHILPS的SAA711X系列(VIDEO DECODER)。



        評(píng)論


        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 黄浦区| 正蓝旗| 安新县| 南川市| 烟台市| 突泉县| 米易县| 海淀区| 济南市| 河源市| 贡觉县| 无锡市| 成都市| 天峻县| 桃园县| 黄陵县| 安西县| 五家渠市| 调兵山市| 常山县| 安国市| 红桥区| 镇康县| 常德市| 大新县| 沈阳市| 镇宁| 乐昌市| 乳山市| 敦煌市| 衡阳市| 博野县| 剑阁县| 沧州市| 小金县| 栾城县| 万载县| 徐闻县| 错那县| 汤原县| 扎兰屯市|