I2C總線在如今比較流行的串行擴(kuò)展總線中,以其嚴(yán)格的規(guī)范和眾多支持I2C接VI的外圍器件而獲得了廣泛的應(yīng)用。它適合于較復(fù)雜單片機(jī)應(yīng)用系統(tǒng)中元件與芯片之間的短距離通信,主要應(yīng)用于板級(jí)的IC通信。本文介紹了基于單片機(jī)的I2C總線系統(tǒng)設(shè)計(jì)過(guò)程,其中包括了硬件和軟件的設(shè)計(jì)。
1.I2C總線介紹
I2C(inter—integrated circuit)總線是一種由PHILIPS公司開(kāi)發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。I2C總線產(chǎn)生于80年代,最初為音頻和視頻設(shè)備開(kāi)發(fā),如今主要應(yīng)用于板級(jí)的IC通信需要,即主要被用作硬件系統(tǒng)中的電路板上各個(gè)IC芯片的相互通信的線路,I2C總線在系統(tǒng)設(shè)計(jì)中十分常見(jiàn)。
I2C總線最主要的優(yōu)點(diǎn)是其簡(jiǎn)單性和有效性。由于接口直接在組件之上,因此I2C總線占用的空間非常小,減少了電路板的空間和芯片管腳的數(shù)量,降低了互聯(lián)成本。總線的長(zhǎng)度可高達(dá)25英尺,并且能夠以l0kbps的最大傳輸速率支持40個(gè)組件。I2C總線的另一個(gè)優(yōu)點(diǎn)是,它支持多主控(multimastering),其中任何能夠進(jìn)行發(fā)送和接收的設(shè)備都可以成為主總線。一個(gè)主控能夠控制信號(hào)的傳輸和時(shí)鐘頻率。當(dāng)然,在任何時(shí)間點(diǎn)上只能有一個(gè)主控。
2.I2C總線硬件接口設(shè)計(jì)
在進(jìn)行I2C總線硬件接口設(shè)計(jì)時(shí)使用的是Philips公司生產(chǎn)的P89C66X系列單片機(jī),其片內(nèi)的I2C總線邏輯提供了符合I2C總線規(guī)范的串口,它們具有性能穩(wěn)定、速度快、使用方便等優(yōu)點(diǎn)。
2.1單片機(jī)I2C總線接口引腳設(shè)計(jì)
P89C66X系列單片機(jī)有44引腳的LQFP封裝和PLCC封裝,其中P1.6/SCL和P1.7/SDA分別為I2C總線的時(shí)鐘信號(hào)線和數(shù)據(jù)信號(hào)線,由于芯片內(nèi)部都采用了漏極開(kāi)路工藝,所以當(dāng)把這兩個(gè)引腳作為I2C總線的接口使用時(shí),需要外接上拉電阻,如圖1所示。
圖1 P89C66X的I2C總線接口引腳
2.2單片機(jī)I2C總線相關(guān)寄存器
P89C66X系列單片機(jī)內(nèi)部與I2C總線相關(guān)的寄存器共有4個(gè),其功能列于表1,通過(guò)對(duì)這4個(gè)寄存器的編程實(shí)現(xiàn)I2C總線的功能。
表1I2C總線寄存器
2.3設(shè)計(jì)要點(diǎn)
在硬件系統(tǒng)中應(yīng)用I2C總線進(jìn)行連接控制,可以有效的減少單片機(jī)I/O端口資源的占用,這在單片機(jī)應(yīng)用中是十分重要的,這也是I2C總線得以廣泛應(yīng)用的主要原因。此外,I2C總線在設(shè)計(jì)思想上也是十分突出的,其模塊化的設(shè)計(jì)思想符合硬件系統(tǒng)設(shè)計(jì)的潮流。應(yīng)用I2C總線進(jìn)行設(shè)計(jì),可以將整個(gè)硬件系統(tǒng)分為不同的功能模塊,每個(gè)功能模塊分別設(shè)計(jì),不會(huì)受到其它模塊的影響,設(shè)計(jì)完成后,使用統(tǒng)一的I2C總線接口連入系統(tǒng),這樣的系統(tǒng)各個(gè)部分不會(huì)相互干擾,每一個(gè)模塊只與自身電路相關(guān),大大簡(jiǎn)化了設(shè)計(jì)和調(diào)試的過(guò)程,也提高了通用設(shè)備的復(fù)用率。
3.I2C總線接口軟件設(shè)計(jì)
針對(duì)P89C66X系列單片機(jī)的I2C總線進(jìn)行軟件程序設(shè)計(jì),首先要了解I2C總線的26個(gè)狀態(tài),其次要根據(jù)應(yīng)用中要求的模式來(lái)設(shè)定各個(gè)寄存器,最后編寫(xiě)出完整的應(yīng)用程序。下面是P89C66X系列單片機(jī)的I2C總線以主模式工作的軟件設(shè)計(jì)方法。
3.1向無(wú)子地址器件發(fā)送字節(jié)數(shù)據(jù)
當(dāng)單片機(jī)在主模式下向從器件發(fā)送字節(jié)數(shù)據(jù)時(shí),首先,單片機(jī)要申請(qǐng)總線,在得到總線的控制權(quán)后,發(fā)送器件的7bit地址編碼,這時(shí)判斷狀態(tài)寄存器SlSTA的值是否為0x18(0xl8代表的狀態(tài)為主器件已經(jīng)發(fā)送SLA+W,并且收到應(yīng)答),如果不是0x18,則表示發(fā)送發(fā)生錯(cuò)誤;如果是0x18,則繼續(xù)發(fā)送數(shù)據(jù)字節(jié)。然后判斷S1STA的值是否為0x28(0x28代表的狀態(tài)是主器件已經(jīng)發(fā)送數(shù)據(jù)寄存器SIDAT中的數(shù)據(jù),并受到應(yīng)答),如果是0x28,則表示發(fā)送數(shù)據(jù)成功,此時(shí)要將控制寄存器SICON的SI復(fù)位,結(jié)束此次傳送。
3.2從無(wú)子地址器件讀字節(jié)數(shù)據(jù)
當(dāng)單片機(jī)在主模式下向從器件讀字節(jié)數(shù)據(jù)時(shí),單片機(jī)在申請(qǐng)到總線后發(fā)送從器件地址,隨后檢測(cè)總線狀態(tài),如果S1STA寄存器的值為0x40(0x40代表的狀態(tài)為主器件已經(jīng)發(fā)送SLA+R,并且收到應(yīng)答),表明地址發(fā)送成功,程序準(zhǔn)備接收數(shù)據(jù)字節(jié),否則表示發(fā)送發(fā)生錯(cuò)誤。程序在接收字節(jié)后判斷SISTA的值是否為Ox58(0x58代表的狀態(tài)是主器件已經(jīng)收到數(shù)據(jù)字節(jié),并返回應(yīng)答),如果是0x58,則表示發(fā)送數(shù)據(jù)成功,此時(shí)要將控制寄存器SICON的SI復(fù)位,結(jié)束此次傳送。
3.3向有子地址器件發(fā)送和接收字節(jié)數(shù)據(jù)
在I2C總線器件中,每個(gè)器件除了擁有其自身的從地址外,部分器件還可以具有子地址。在對(duì)子地址指向的空間通信時(shí),主器件需要依次發(fā)送從地址和子地址才可以正常尋址。其實(shí)現(xiàn)過(guò)程與前面發(fā)送和接收字節(jié)的過(guò)程基本相同,只是要注意發(fā)送器件從地址后,還要發(fā)送一個(gè)子地址信息才可以繼續(xù)發(fā)送或者接收數(shù)據(jù)。其編程流程如圖2所示。
圖2 有子地址器件發(fā)送和接收數(shù)據(jù)流程圖
總結(jié)
以上就是基于單片機(jī)的I2C總線系統(tǒng)設(shè)計(jì)與開(kāi)發(fā)介紹了。在進(jìn)行I2C總線的設(shè)計(jì)與開(kāi)發(fā)時(shí),需要首先將整體系統(tǒng)的功能進(jìn)行劃分,對(duì)各個(gè)不同的功能部分進(jìn)行獨(dú)立的設(shè)計(jì),最后使用12C總線接口將整個(gè)系統(tǒng)連接到一起。值得注意的是,在設(shè)計(jì)的過(guò)程中,每完成一個(gè)功能模塊的設(shè)計(jì),就應(yīng)該進(jìn)行調(diào)試,直到完全達(dá)到設(shè)計(jì)的要求,再開(kāi)始下一個(gè)模塊的設(shè)計(jì),這樣所有模塊設(shè)計(jì)完成后,可以直接連入系統(tǒng)進(jìn)行最后的整合工作,如此整個(gè)調(diào)試過(guò)程中出現(xiàn)的任何問(wèn)題都可以直接找到對(duì)應(yīng)的部分,降低系統(tǒng)調(diào)試的難度。
電話:18923864027(同微信)
QQ:709211280
〈烜芯微/XXW〉專(zhuān)業(yè)制造二極管,三極管,MOS管,橋堆等,20年,工廠直銷(xiāo)省20%,上萬(wàn)家電路電器生產(chǎn)企業(yè)選用,專(zhuān)業(yè)的工程師幫您穩(wěn)定好每一批產(chǎn)品,如果您有遇到什么需要幫助解決的,可以直接聯(lián)系下方的聯(lián)系號(hào)碼或加QQ/微信,由我們的銷(xiāo)售經(jīng)理給您精準(zhǔn)的報(bào)價(jià)以及產(chǎn)品介紹