0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何通過(guò)I2C總線(xiàn)I/O口實(shí)現(xiàn)系統(tǒng)的多個(gè)功能?

電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2018-08-30 10:05 ? 次閱讀

1 引言

隨著單片機(jī)控制系統(tǒng)的不斷擴(kuò)大以及控制功能不斷增多,有限的單個(gè)單片機(jī)通用I/O口已不能滿(mǎn)足同一系統(tǒng)中控制多個(gè)受控對(duì)象需要,隨著FC總線(xiàn)研究的深入,用I2C總線(xiàn)擴(kuò)展單片機(jī)I/O口的方法在全自動(dòng)、半自動(dòng)儀器的開(kāi)發(fā)領(lǐng)域得到了廣泛應(yīng)用,本文介紹了一個(gè)測(cè)試系統(tǒng)通過(guò)FC總線(xiàn)擴(kuò)展I/O口實(shí)現(xiàn)了系統(tǒng)的多個(gè)功能。給出了系統(tǒng)的硬件連接以及Atmega128與三個(gè)Atmega168之間的軟件通信流程圖。

2 系統(tǒng)的硬件結(jié)構(gòu)

圖1是作者所研究的測(cè)試系統(tǒng)的整體框圖,本系統(tǒng)中主要芯片PHILIPS公司LPC2292,在此系統(tǒng)中鍵盤(pán)上其中三個(gè)按鈕分別控制三個(gè)電機(jī),系統(tǒng)的主要功能是LPC2292將掃描到的鍵盤(pán)信息發(fā)給Atmega128單片機(jī),Atmega128單片機(jī)通過(guò)I2C總線(xiàn)尋址Atmega168,并向被尋址的Atmega168發(fā)送電機(jī)控制命令,最后,電機(jī)根據(jù)Atmega168控制策略正常運(yùn)行。電機(jī)啟動(dòng)同時(shí),數(shù)據(jù)采集模塊也開(kāi)始正常運(yùn)行,數(shù)據(jù)采集模塊把采到數(shù)據(jù)送到LPC2292的A/D轉(zhuǎn)換接口,然后將ADC輸出的數(shù)據(jù)發(fā)送到LCD。系統(tǒng)中的撥碼開(kāi)關(guān)用于設(shè)置相應(yīng)的Atmega168單片機(jī)的地址,當(dāng)單片機(jī)Atmega128接收到LPC2292發(fā)來(lái)的控制命令時(shí),通過(guò)I2C總線(xiàn)尋址Atmega168,當(dāng)某個(gè)Atmega168的地址與Atmega128廣播地址相同時(shí),它就開(kāi)始根據(jù)Atmega128發(fā)送的命令控制電機(jī)開(kāi)始工作。

如何通過(guò)I2C總線(xiàn)I/O口實(shí)現(xiàn)系統(tǒng)的多個(gè)功能?

圖1基于I2C總線(xiàn)的I/O擴(kuò)展框圖

3 I2C總線(xiàn)

I2C總線(xiàn)是PHILIPS公司推出的芯片間串行數(shù)據(jù)傳輸總線(xiàn),軟、硬件協(xié)議十分巧妙,2根線(xiàn)(SDA,SCL)HP可實(shí)現(xiàn)完善的全雙工同步數(shù)據(jù)傳送,能夠十分方便地構(gòu)成單主系統(tǒng)或多主系統(tǒng)和外同器件擴(kuò)展系統(tǒng)。不過(guò),多主系統(tǒng)(即系統(tǒng)中有多個(gè)I2C總線(xiàn)接口的單片機(jī))會(huì)出現(xiàn)多主競(jìng)爭(zhēng)的復(fù)雜狀態(tài)。I2C器件是把I2C的協(xié)議植入器件的I/O接口,使用時(shí)器件直接掛到I2C總線(xiàn)上,這一特點(diǎn)給用戶(hù)在設(shè)計(jì)應(yīng)用系統(tǒng)時(shí)帶來(lái)了極大的方便。I2C器件無(wú)須片選信號(hào),是否選中是由主器件發(fā)出的I2C從地址決定的。

所有掛到I2C總線(xiàn)的外圍器件,各自都有一個(gè)唯一確定的地址。任何時(shí)刻總線(xiàn)上只有一個(gè)主控器件對(duì)總線(xiàn)實(shí)行控制權(quán),分時(shí)實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)的數(shù)據(jù)傳送。I2C總線(xiàn)上所有外闈器件都有規(guī)范的器件地址,器件地址由7位組成,它和1位方向位(R/W)構(gòu)成了I2C總線(xiàn)器件的尋址字節(jié)SLA,格式如下:

如何通過(guò)I2C總線(xiàn)I/O口實(shí)現(xiàn)系統(tǒng)的多個(gè)功能?

器件地址(A6,A5,A4,A3)是I2C總線(xiàn)外圍接口器件同有的地址編碼(4位或5位),器件出廠(chǎng)時(shí)已固化好。引腳地址(A2,A1,A0)和器件在電路中的實(shí)際接法有關(guān)(地址線(xiàn)、電源或地),形成地址數(shù)據(jù)。數(shù)據(jù)方向位(R/W)規(guī)定了總線(xiàn)上的主節(jié)點(diǎn)對(duì)從節(jié)點(diǎn)的數(shù)據(jù)傳送方向,當(dāng)(R/W)位置1時(shí)接收,當(dāng)(R/W)為0時(shí)發(fā)送。圖1中的撥碼開(kāi)關(guān)設(shè)置了從單片機(jī)Atmega168的地址,也就是從機(jī)地址的低三位(A2,AI,A0),當(dāng)某個(gè)撥碼開(kāi)關(guān)的某個(gè)開(kāi)關(guān)閉合時(shí),相應(yīng)的地址位為零,否則相應(yīng)位為1,因此可以通過(guò)撥碼開(kāi)關(guān)上開(kāi)關(guān)的狀態(tài)來(lái)設(shè)定從單片機(jī)Atmega168的地址,比如某個(gè)撥碼開(kāi)關(guān)與A0、A2位對(duì)應(yīng)的開(kāi)關(guān)閉合,與Al對(duì)應(yīng)的開(kāi)關(guān)斷開(kāi),那么這個(gè)單片機(jī)地址的低三位為010。

4 I2C通信的流程圖

根據(jù)I2C總線(xiàn)的傳輸協(xié)議規(guī)范和硬件連接,作者給出了如圖2和圖3基本程序流程圖和部分程序。開(kāi)發(fā)語(yǔ)言為c語(yǔ)言,與匯編語(yǔ)言相比,可以提高軟件的執(zhí)行速度。

4.1 主機(jī)發(fā)送/從機(jī)接收I2C子程序流程圖

圖2和圖3給出了主機(jī)發(fā)送,從機(jī)接收I2C子程序流程圖,通過(guò)I2C總線(xiàn)發(fā)送/接收數(shù)據(jù)時(shí),I2C總線(xiàn)的控制寄存器的中斷位必須先置位,為了避免因?yàn)槟撤N原因不能使控制寄存器的中斷位置位而導(dǎo)致程序進(jìn)入死循環(huán),作者在I2C總線(xiàn)通信程序發(fā)送/接收數(shù)據(jù)前編寫(xiě)了中斷循環(huán)等待和錯(cuò)誤處理程序,大大提高了程序的可靠性,具體程序如下:

while(!(TWCR & (1<

if(j>10000) return O:

應(yīng)用I2C總線(xiàn)發(fā)送數(shù)據(jù)時(shí),作者采用了狀態(tài)位查詢(xún)方法,并且給出了錯(cuò)誤標(biāo)志置位、錯(cuò)誤跳出程序,下面的程序是發(fā)送從機(jī)地址的部分程序:

switch(TWSR & 0XF8)

{

case Oxl8: flag=0; break;

case 0x20:flag=1; break;

case 0x38:flag=l; break;

default:return 0:

}

if(flag) continue;

如何通過(guò)I2C總線(xiàn)I/O口實(shí)現(xiàn)系統(tǒng)的多個(gè)功能?

圖2 I2C主機(jī)發(fā)送程序框圖

程序中的flag=0表示從機(jī)地址發(fā)送成功,flag=1表示從機(jī)地址發(fā)送失敗,當(dāng)TWSR寄存器中的狀態(tài)碼為0x18時(shí),表明從機(jī)地址已發(fā)送,并且接收到ACK,同時(shí)錯(cuò)誤標(biāo)志“flag”置0,下一步通過(guò)心發(fā)送數(shù)據(jù),當(dāng)TWSR寄存器中的狀態(tài)碼為0x20時(shí),表明從機(jī)地址已發(fā)送,但是接收到NO ACK,同時(shí)錯(cuò)誤標(biāo)志”flag”置1,下一步執(zhí)行“if(flag)continue;”語(yǔ)句,結(jié)束本次循環(huán),當(dāng)TWSR寄存器中的狀態(tài)碼為0x38時(shí),表明從機(jī)地址仲裁失敗,同時(shí)錯(cuò)誤標(biāo)志“flag”置1,下一步執(zhí)行“if(flag)continue;"語(yǔ)句,結(jié)束本次循環(huán)。總線(xiàn)將釋放,并進(jìn)入未尋址從機(jī)模式,總線(xiàn)空閑后將發(fā)送“start”。程序中“if(flag)continue;”語(yǔ)句使得當(dāng)數(shù)據(jù)發(fā)送失敗時(shí),結(jié)束本次循環(huán),返回到開(kāi)始等待發(fā)送命令,這樣避免了由于偶爾數(shù)據(jù)發(fā)送失敗造成整個(gè)程序無(wú)法運(yùn)行,甚至整個(gè)設(shè)備無(wú)法運(yùn)行,因而,用“if(flag)continue;”語(yǔ)句結(jié)束錯(cuò)誤傳輸??商岣逫2C通信的質(zhì)量,同時(shí)也提高了使用I2C總線(xiàn)通信的設(shè)備的效率。

如何通過(guò)I2C總線(xiàn)I/O口實(shí)現(xiàn)系統(tǒng)的多個(gè)功能?

圖3 從機(jī)接收流程圖

4.2 編程中的注意事項(xiàng)

a)在主機(jī)或從機(jī)初始化時(shí),一定要設(shè)定數(shù)據(jù)傳輸方向;

b)由于每次發(fā)送/接收數(shù)據(jù)時(shí)TWCR寄存器的中斷標(biāo)志位必須置位,因此程序中要有等待TWCR寄存器中斷位置位程序,同時(shí),為了避免由于某種原因?qū)е轮袛辔徊荒苤梦辉斐傻却绦蜻M(jìn)入死循環(huán),在等待中斷位置位程序中要有等待超時(shí)返回程序。

c)I2C總線(xiàn)的使用,除了基本的啟動(dòng)、結(jié)束、應(yīng)答、非應(yīng)答子程序外,還應(yīng)有應(yīng)答位檢查、發(fā)送和接收單字節(jié)、發(fā)送和接收多字節(jié)等子程序。

5 結(jié)論

作者在程序流程的每個(gè)關(guān)鍵部分都設(shè)置了錯(cuò)誤查詢(xún)和錯(cuò)誤處理,使得I2C程序能夠從錯(cuò)誤中自動(dòng)恢復(fù),避免了由于I2C通信導(dǎo)致的錯(cuò)誤而使得系統(tǒng)無(wú)法正常工作,文中還給出了部分發(fā)送子程序和編程注意事項(xiàng)。對(duì)于圖2和圖3的I2C通信流程,作者已在多個(gè)科研項(xiàng)目中進(jìn)行了編程使用。實(shí)踐證明,按上述流程編寫(xiě)I2C通信程序,主從單片機(jī)之間的通信非??煽?。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 芯片
    +關(guān)注

    關(guān)注

    452

    文章

    50005

    瀏覽量

    419706
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5273

    瀏覽量

    119659
  • I2C總線(xiàn)
    +關(guān)注

    關(guān)注

    8

    文章

    386

    瀏覽量

    60743
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    GPIO模擬I2C總線(xiàn)的驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

    I2C總線(xiàn)簡(jiǎn)單方便,是我們經(jīng)常使用的一種總線(xiàn)。但有時(shí)候我們的MCU沒(méi)有足夠多的I2C控制器來(lái)實(shí)現(xiàn)我們的應(yīng)用,所幸我可以使用普通的GPIO引腳
    發(fā)表于 12-14 14:19 ?5245次閱讀
    GPIO模擬<b class='flag-5'>I2C</b><b class='flag-5'>總線(xiàn)</b>的驅(qū)動(dòng)設(shè)計(jì)與<b class='flag-5'>實(shí)現(xiàn)</b>

    i2c總線(xiàn)ppt(I2C總線(xiàn)器件應(yīng)用)

    I2C總線(xiàn)器件應(yīng)用第一節(jié) I2C總線(xiàn)器件應(yīng)用概述I2C總線(xiàn)工作原理
    發(fā)表于 08-13 17:34 ?0次下載

    用嵌入式系統(tǒng)的SPI模塊實(shí)現(xiàn)I2C總線(xiàn)通信

    I2C一般用于單主機(jī)系統(tǒng)中。在單主機(jī)系統(tǒng)中,通信系統(tǒng)的主機(jī)可能沒(méi)有I2C接口模塊, 而直接使用主機(jī)的I
    發(fā)表于 04-15 11:47 ?38次下載

    i2c總線(xiàn)的特點(diǎn)

    i2c總線(xiàn)的特點(diǎn):2 I2C 總線(xiàn)使設(shè)計(jì)人員和廠(chǎng)商都得益.. 3 2.1 設(shè)計(jì)人員的得益.. 4 2.2 廠(chǎng)商的得益. 5
    發(fā)表于 08-05 09:05 ?26次下載

    用Verilog HDL實(shí)現(xiàn)I2C總線(xiàn)功能

    簡(jiǎn)述了I2C總線(xiàn)的特點(diǎn);介紹了開(kāi)發(fā)FPGA時(shí)I2C總線(xiàn)模塊的設(shè)計(jì)思想;給出并解釋了用Verilog HDL實(shí)現(xiàn)部分
    發(fā)表于 10-19 10:49 ?104次下載

    I2C總線(xiàn)

    I2C BUS(Inter IC BUS)是NXP 推出的芯片間串行傳輸總線(xiàn),它以2 根連線(xiàn)實(shí)現(xiàn)了完善的雙向同步數(shù)據(jù)傳送,可以極方便地構(gòu)成多機(jī)系統(tǒng)
    發(fā)表于 11-03 11:26 ?49次下載

    I2C總線(xiàn)在Linux系統(tǒng)中的驅(qū)動(dòng)設(shè)計(jì)

    介紹I2C總線(xiàn)的基本概念和工作原理,敘述I2C總線(xiàn)擴(kuò)展器件ZLG7290的功能特點(diǎn)。在以S3C2
    發(fā)表于 12-29 16:52 ?40次下載

    什么是i2c總線(xiàn)

    什么是i2c總線(xiàn)  下載請(qǐng)點(diǎn)擊: i2c總線(xiàn)協(xié)議中文版 
    發(fā)表于 11-05 09:26 ?2898次閱讀

    用Verilog HDL實(shí)現(xiàn)I2C總線(xiàn)功能

    摘要: 簡(jiǎn)述了I2C總線(xiàn)的特點(diǎn);介紹了開(kāi)發(fā)FPGA時(shí)I2C總線(xiàn)模塊的設(shè)計(jì)思想;給出并解釋了用Verilog HDL實(shí)現(xiàn)部分
    發(fā)表于 06-20 13:17 ?6848次閱讀
    用Verilog HDL<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>I2C</b><b class='flag-5'>總線(xiàn)</b><b class='flag-5'>功能</b>

    I2C I/O擴(kuò)展芯片特性分析

    簡(jiǎn)介   I/O口擴(kuò)展芯片可用于MCU/DSP通用I/O口的擴(kuò)展,通過(guò)I2C
    發(fā)表于 07-20 09:54 ?1.3w次閱讀

    基于CPLD的I2C總線(xiàn)接口設(shè)計(jì)

    在電路設(shè)計(jì)中,I2C總線(xiàn)是比較常用的兩線(xiàn)式串行通信方式,大多數(shù)的CPU都擅長(zhǎng)于并口操作,不具備直接操作I2C總線(xiàn)接口的能力。為了使不具備I2C
    發(fā)表于 02-12 16:11 ?95次下載
    基于CPLD的<b class='flag-5'>I2C</b><b class='flag-5'>總線(xiàn)</b>接口設(shè)計(jì)

    NIOS實(shí)現(xiàn)I2C總線(xiàn)

    I2C 總線(xiàn)實(shí)現(xiàn)關(guān)鍵是SDA,他是雙向線(xiàn),如果對(duì)與一個(gè)芯片只寫(xiě)而不讀,I2C 實(shí)現(xiàn)起來(lái)很容易.使用NIOS
    發(fā)表于 11-01 14:28 ?37次下載

    I2C總線(xiàn)應(yīng)用系統(tǒng)設(shè)計(jì)運(yùn)用

    I2C總線(xiàn)應(yīng)用系統(tǒng)設(shè)計(jì)運(yùn)用
    發(fā)表于 09-22 11:44 ?10次下載
    <b class='flag-5'>I2C</b><b class='flag-5'>總線(xiàn)</b>應(yīng)用<b class='flag-5'>系統(tǒng)</b>設(shè)計(jì)運(yùn)用

    上電和復(fù)位 16 位 PCA I2C 總線(xiàn) I/O 擴(kuò)展器

    上電和復(fù)位 16 位 PCA I2C 總線(xiàn) I/O 擴(kuò)展器
    發(fā)表于 11-15 20:32 ?1次下載
    上電和復(fù)位 16 位 PCA <b class='flag-5'>I2C</b> <b class='flag-5'>總線(xiàn)</b> <b class='flag-5'>I</b>/<b class='flag-5'>O</b> 擴(kuò)展器

    I2C串行總線(xiàn)協(xié)議是什么?I2C總線(xiàn)有哪些優(yōu)點(diǎn)?

    1982年發(fā)明并推廣,用于連接智能傳感器和存儲(chǔ)器器件,以及控制和監(jiān)控外設(shè)。該協(xié)議是一種主從式通信協(xié)議,允許多個(gè)從設(shè)備連接到同一總線(xiàn)上,并在總線(xiàn)上進(jìn)行數(shù)據(jù)交換。I2C
    的頭像 發(fā)表于 09-12 11:18 ?1444次閱讀