《新編單片機原理與應(yīng)用實驗》課件第11章_第1頁
《新編單片機原理與應(yīng)用實驗》課件第11章_第2頁
《新編單片機原理與應(yīng)用實驗》課件第11章_第3頁
《新編單片機原理與應(yīng)用實驗》課件第11章_第4頁
《新編單片機原理與應(yīng)用實驗》課件第11章_第5頁
已閱讀5頁,還剩83頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

實驗11I2C?總?線?接?口一、實驗?zāi)康亩?、實驗設(shè)備與器材三、實驗原理與電路

四、實驗內(nèi)容、過程及要求

一、實驗?zāi)康?/p>

(1)

理解I2C總線接口傳輸協(xié)議。

(2)

理解I2C總線接口器件接口信號的含義及操作時序。

(3)

掌握通過軟件模擬方式讀/寫I2C總線接口存儲器的程序設(shè)計方法。理解I2C總線接口EEPROM存儲器、日歷時鐘芯片PCF8563的功能及讀/寫方法。

二、實驗設(shè)備與器材仿真器及其附件、圖1所示的實驗電路板各一套。

三、實驗原理與電路本實驗涉僅涉及實驗板上的U101、U110(24WC01)、U406(PCF8563日歷時鐘芯片),而與其他元器件無關(guān)。接通電源前,JP101、JP102的1-2與2-3引腳均置為開路狀態(tài),以便將P1.0引腳作為I2C總線的串行時鐘信號SCL,將P1.1引腳作為I2C總線的串行數(shù)據(jù)輸入/輸出引腳SDA。由于多數(shù)MCS-51芯片沒有提供I2C總線接口部件,因此只能用軟件方式訪問I2C總線接口器件。

通過軟件方式訪問I2C總線接口器件具有普遍意義。一方面,多數(shù)MCS-51芯片沒有內(nèi)置I2C總線接口部件,只能通過軟件模擬方式讀/寫I2C總線接口器件;另一方面,即使某些型號的MCS-51兼容芯片內(nèi)置了I2C總線接口部件,但I(xiàn)2C總線接口部件初始化過程過于復(fù)雜,不易掌握,透明度差,許多單片機應(yīng)用系統(tǒng)開發(fā)人員寧愿通過軟件模擬方式讀/寫I2C總線接口器件。

1.二線制I2C總線CMOS24系列串行EEPROM存儲器

24系列串行EEPROM電可擦寫只讀存儲器采用I2C總線結(jié)構(gòu),僅需要很少的連線,即可實現(xiàn)讀/寫操作。容量在128?B~1?MB之間,如24C01芯片的存儲容量為128×8位(即1?KB),24C08芯片的存儲容量為1024×8位(即8KB),引腳排列如圖11-1所示。

SCL:串行時鐘輸入端。

圖11-1DIP封裝的24系列串行EEPROM存儲器

SDA:串行數(shù)據(jù)/地址線,雙向,漏極開路。每寫入/讀出一位信息時,均需要主控器件,如CPU輸出串行時鐘信號SCL作為寫入/讀出的同步信號。寫入時,用SCL信號的上升沿作為同步信號;讀出時,用SCL的下降沿作為同步信號。

A2~A0:片選信號輸入端,具體含義與芯片容量有關(guān),如表11-1所示。

WP:芯片寫保護(hù),輸入,高電平有效。當(dāng)WP引腳接高電平時,不能寫入。

表11-1I2C總線存儲器頁面大小及從器件地址格式

1)I2C總線特性

I2C總線協(xié)議是Philips公司開發(fā)的兩線制(即串行時鐘信號SCL和串行數(shù)據(jù)/地址線SDA)串行通信接口,I2C總線協(xié)議主要特點如下:

(1)在I2C通信協(xié)議中,通信過程由產(chǎn)生SCL時鐘信號的主器件(如微處理器)控制,即主器件除了產(chǎn)生作為讀/寫同步信號的SCL外,還發(fā)出“啟動”和“停止”總線操作的控制信號。

(2)在I2C總線協(xié)議中,允許總線上掛接多個從器件(如存儲器),形成“一主多從”結(jié)構(gòu)(采用總線仲裁方式后,可允許同時存在多個主器件,不過在單片機系統(tǒng)中很少見,因此不介紹)。每個從器件均有惟一“從片地址”,主器件啟動了

I2C總線后,所有從器件均處于接收狀態(tài),接收主器件送來的地址信息(廣播形式),并與自身的“從片地址”比較:如果相符,則通過SDA引腳回送低電平的“應(yīng)答信號”;反之,不做任何響應(yīng)。在7位地址格式中,從片地址由7位從片地址(最多可以連接128個從器件)和控制數(shù)據(jù)傳輸方向的讀/寫標(biāo)志位(R/W)組成。例如,采用I2C總線接口的EEPROM存儲器的從片地址格式為

。

1010A2A1A0

(3)

對于主器件來說,SCL引腳為漏極開路輸出;對于從器件來說,SCL引腳為輸入。串行數(shù)據(jù)/地址引腳SDA為漏極開路輸入/輸出引腳。

(4)在I2C總線協(xié)議中,把數(shù)據(jù)發(fā)送到SDA線的器件稱為“發(fā)送器”,接收數(shù)據(jù)的器件稱為“接收器”。例如,主器件(如CPU)把數(shù)據(jù)或從器件地址寫入從器件(如存儲器)時,主器件是發(fā)送器,從器件是接收器;當(dāng)主器件讀取從器件存儲單元信息時,從器件是發(fā)送器,主器件是接收器。接收器收到發(fā)送器一個字節(jié)的數(shù)據(jù)后,必須向發(fā)送器回送低電平的應(yīng)答信號,否則發(fā)送器將停止發(fā)送數(shù)據(jù)。

當(dāng)SCL、SDA引腳均為高電平時,總線處于空閑狀態(tài),只有當(dāng)總線處于空閑狀態(tài)時,數(shù)據(jù)傳輸才能被初始化。在數(shù)據(jù)傳送期間,只要SCL為高電平,而SDA由高電平變?yōu)榈碗娖綍r,I2C總線即被啟動,如圖11-2所示,啟動后即可對從片進(jìn)行讀/寫操作;在讀/寫期間,只要SCL為高電平,而SDA由低電平變?yōu)楦唠娖綍r,I2C總線即被關(guān)閉,從片進(jìn)入空閑狀態(tài)。因此讀/寫操作時,在SCL脈沖處于高電平期間,SDA端的電平必須保持穩(wěn)定,即寫入時,先將SCL置為低電平,再由主器件將數(shù)據(jù)輸出到SDA,然后把SCL置為高電平,最后將SCL置為低電平(形成SCL的同步脈沖頭),方可撤消SDA端上寫入的信息。

圖11-2I2C總線操作時序

從圖11-2可以看出,I2C總線接收器在SCL時鐘上升沿鎖存SDA引腳上的輸入數(shù)據(jù)。I2C總線發(fā)送時,先輸出高位(即MSB),后輸出低位(這與UART串行口剛好反相)。因此,接收方將先收到一個字節(jié)的最高位。

在I2C總線中,主、從器件均可以接收或發(fā)送數(shù)據(jù)。I2C總線EEPROM存儲器只能作從器件使用,讀/寫過程(啟動及停止信號)、讀/寫移位時鐘SCL均由主器件(一般為CPU)提供。在寫入(包括寫入從片地址、存儲單元地址以及數(shù)據(jù))時,從器件接收了一個字節(jié)(8位)信息后,會向發(fā)送器(即主器件)回送一個應(yīng)答信號(低電平有效)通知發(fā)送方,因此在寫入過程中,主器件輸出一個字節(jié)的數(shù)據(jù)后,必須再發(fā)送第九個SCL脈沖,以便主器件檢測從器件回送的應(yīng)答信號。讀出時,EEPROM存儲器作為發(fā)送器,主器件(CPU)作為接收器,CPU接收了一個字節(jié)的信息后也要向發(fā)送器(EEPROM)回送一個低電平的應(yīng)答信號,否則發(fā)送器將停止發(fā)送數(shù)據(jù)操作。為提高訪問速度,主器件對從器件送來的最后一個字節(jié)不產(chǎn)生應(yīng)答信號,但為了能夠輸出由低到高的“停止”信號,需要將SDA置高電平(使用CPU的I/O模擬SDA引腳時,同樣需要發(fā)送第九個SCL脈沖,如圖11-4所示)。

(5)

I2C總線標(biāo)準(zhǔn)約定的時間參數(shù)。在I2C總線標(biāo)準(zhǔn)中,對下列時間寬度有嚴(yán)格要求:

(1)讀/寫同步信號SCL高電平和低電平最小時間。

(2)“停止”操作時,SCL由低電平變?yōu)楦唠娖?即SCL信號上升沿)到SDA變?yōu)楦唠娖降淖钚r間。

(3)“啟動”操作時,SDA由高電平變?yōu)榈碗娖?即SDA信號下降沿)到SCL變?yōu)榈碗娖降淖钚r間。以上時間不得小于4.7μs。

(4)最大數(shù)據(jù)傳輸率,傳輸?shù)臄?shù)據(jù)量不得超過100?kb/s,即同步信號SCL頻率最大為100kHz。

2)二線制I2C總線24系列串行EEPROM存儲器寫入過程二線制I2C總線24系列串行EEPROM存儲器支持字節(jié)寫入方式和頁面寫入方式。

(1)字節(jié)寫入方式。字節(jié)寫入過程如下:啟動→給出芯片控制字節(jié)→等待EEPROM芯片回送應(yīng)答信號→輸出EEPROM存儲單元地址字→等待EEPROM芯片回送應(yīng)答信號→輸出寫入存儲單元的數(shù)據(jù)→等待EEPROM芯片回送應(yīng)答信號→停止。

芯片控制字節(jié)包含了7位從片地址信息和數(shù)據(jù)傳輸方向標(biāo)志。對于1KB(128字節(jié))和2KB(256字節(jié))芯片來說,EEPROM存儲單元地址字為8位;對于4KB(512字節(jié))、8KB(1K字節(jié))和16KB(2K字節(jié))芯片來說,存儲單元地址在9~11位之間,為了提高存取效率,高8位地址a8~a10合并到控制字節(jié)的片選信號A2~A0位置(當(dāng)然這將減少可以掛接在I2C總線上的從器件數(shù)目),存儲單元地址字僅僅是低8位地址信息;對于32KB以上容量芯片,控制字節(jié)依然是7位從片地址信息和數(shù)據(jù)傳輸方向標(biāo)志,EEPROM存儲單元地址字占用兩個字節(jié)(高8位在前,低8位在后)。

(2)頁面寫入。串行EEPROM存儲器內(nèi)部有頁寫入緩沖器(頁寫入緩沖器容量的大小與芯片生產(chǎn)廠家、型號有關(guān),如表11-1所示),因此可以使用頁面寫入方式:啟動→給出芯片控制字節(jié)→等待EEPROM芯片回送應(yīng)答信號→輸出EEPROM存儲單元地址字(n)→等待EEPROM芯片回送應(yīng)答信號→輸出寫入存儲單元的數(shù)據(jù)(n)→等待EEPROM芯片回送應(yīng)答信號→輸出寫入存儲單元的數(shù)據(jù)(n+1)→等待EEPROM芯片回送應(yīng)答信號→…→輸出寫入存儲單元的數(shù)據(jù)(n+P)→等待EEPROM芯片回送應(yīng)答信號→停止。

(3)寫周期結(jié)束查詢。無論是字節(jié)寫入還是頁面寫入,在停止信號有效前,寫入的數(shù)據(jù)存放在EEPROM內(nèi)部的頁緩沖器內(nèi),并沒有寫入到對應(yīng)的EEPROM存儲單元中,只有主器件發(fā)出停止總線操作信號后,24XXX芯片才啟動內(nèi)部的寫入操作過程。由于EEPROM內(nèi)部寫入周期較長(停止信號到內(nèi)部寫入結(jié)束最長時間可達(dá)10ms),而在內(nèi)部寫入周期內(nèi)不能對器件進(jìn)行任何操作,因此可采用軟件延遲或查詢方式確保后續(xù)操作的可靠性。對于軟件延遲方式,完成數(shù)據(jù)寫入緩沖區(qū),收到EEPROM的應(yīng)答信號后,發(fā)“停止總線”操作指令,延遲10ms,再對EEPROM器件進(jìn)行新的操作。

對于查詢方式,就是利用內(nèi)部寫入周期未結(jié)束時禁止數(shù)據(jù)輸入的特性,發(fā)出停止信號,然后不斷重復(fù)“啟動→寫入從器件地址”,直到出現(xiàn)“應(yīng)答信號”為止(表明內(nèi)部寫操作結(jié)束,可以對器件進(jìn)行新的操作),如圖11-3所示。圖11-3寫操作完成檢查

3)讀操作讀操作的初始化過程與寫操作類似,可以使用下列三種方式之一讀出存儲單元的內(nèi)容。

(1)立即地址讀操作。由于串行EEPROM存儲單元地址計數(shù)器具有自動加1功能,因此對串行EEPROM進(jìn)行讀或?qū)懖僮骱?,存儲單元地址計?shù)器就指向上一次讀或?qū)懖僮鲉卧南乱粏卧?。因此立即地址讀操作過程為:啟動→發(fā)從器件控制字節(jié)()→等待EEPROM芯片回送應(yīng)答信號→主器件讀數(shù)據(jù)→主器件給出非應(yīng)答信號→停止,如圖11-4所示。

圖11-4立即地址讀操作

接收器(CPU)不給應(yīng)答信號時,從器件將停止數(shù)據(jù)傳送,當(dāng)接收到主器件發(fā)來的停止信號后結(jié)束當(dāng)前的操作。為了能使CPU給出由低到高的SDA信號,在發(fā)出停止信號前需要額外的第九個串行時鐘SCL。

(2)讀指定存儲單元(字節(jié)讀)。當(dāng)需要讀出指定存儲單元的內(nèi)容時,可先執(zhí)行“啞寫”操作,使存儲單元地址計數(shù)器指向指定存儲單元內(nèi)容,然后再按立即讀方式進(jìn)行,其過程可用圖11-5描述。

圖11-5字節(jié)讀操作

讀指定存儲單元的操作過程為:啟動→給出從器件地址()→等待從器件應(yīng)答信號→給出待讀出存儲單元地址字→等待從器件應(yīng)答信號→重新“啟動”(完成了“啞寫”操作,EEPROM存儲單元地址計數(shù)器已指向待讀出的存儲單元)→給出從器件地址(=1)→等待從器件應(yīng)答信號→主器件讀數(shù)據(jù)→主器件給出非應(yīng)答→停止。

(3)連續(xù)讀。從當(dāng)前單元讀出數(shù)據(jù)或從指定單元讀出數(shù)據(jù)后,主器件(CPU)送應(yīng)答信號(低電平),就可以接著讀出隨后單元的數(shù)據(jù),直到主器件給出非應(yīng)答信號和停止信號,如圖11-6所示。

圖11-6連續(xù)讀操作

4)串行EEPROM與MCS-51接口在沒有I2C總線接口部件的MCS-51應(yīng)用系統(tǒng)中,使用I2C總線串行EEPROM時,需要使用兩根I/O引腳分別模擬SCL串行時鐘信號和SDA串行數(shù)據(jù)輸出/輸入端,如圖11-7所示。在圖11-7(a)中A0~A2接地(一般情況下,很少使用多片,因此從器件片選引腳接地或接電源VCC),因此從器件讀/寫地址分別為A1H、A0H;寫允許端WP接地,即芯片處于可讀/寫狀態(tài);串行時鐘信號SCL接P1.0引腳,即由CPU通過P1.0引腳模擬生產(chǎn)SCL讀/寫同步時鐘信號;串行數(shù)據(jù)輸出/輸入端SDA接CPU的P1.1引腳。

圖11-7I2C總線存儲器與MCS-51的連接

在圖11-7(b)中,采用16位容量芯片,存儲單元地址a8占用了控制字節(jié)中的片選信號A0,因此A0必須懸空,且I2C總線上最多允許連接四塊EEPROM存儲器芯片(即只能使用A1、A2作為從器件的片選信號)。在圖11-7(c)中,采用64位容量芯片,存儲單元地址a8、a9分別占用了控制字節(jié)中的片選信號A0、A1,因此A0、A1也必須懸空,且I2C總線上最多允許連接兩塊EEPROM存儲器芯片(即只能用A2作為從器件的片選信號)。

在圖11-7(d)中,采用128位容量芯片,存儲單元地址a8、a9、a10分別占用了控制字節(jié)中的片選信號A0、A1、A2位置,因此A0、A1、A2均懸空,且I2C總線上只能使用一片EEPROM存儲器芯片。在某些應(yīng)用系統(tǒng)中,I2C總線上需要連接一片I2C總線接口的EEPROM存儲器和一片與I2C總線接口EEPROM存儲器相同地址格式的日歷時鐘芯片(如PCF8563),如圖11-8所示。由于日歷時鐘芯片多采用固定地址格式,例如PCF8563芯片從器件地址固定為1010001,即寫入控制字為0A2H,讀控制字為0A3H,顯然PCF8563日歷時鐘芯片不能與16KB容量的I2C總線接口的EEPROM存儲器芯片(如24WC16)相連。

圖11-8I2C總線器件的連接

由于I2C總線接口器件串行數(shù)據(jù)或地址輸入/輸出引腳SDA一般采用漏極開路輸出方式,SCL引腳驅(qū)動電流也較大,因此MCS-51芯片與I2C總線接口器件相連時,一般需要在I/O引腳接6.8~10kΩ的上拉電阻,如圖11-8中的R1、R2。

5)用軟件模擬在P1.0、P1.1引腳產(chǎn)生I2C總線定時信號參考程序;說明:ByteCnt?DATA28H;I2C總線收/發(fā)字節(jié)計數(shù)器SlvAdrDATA29H ;從器件地址(控制信息)SubAdrDATA2AH;對于256位(4KB)存儲容量及以上器件來說,待讀/寫 ;單元地址為兩字節(jié),分別存放在SubAdr和SubAdr+1單元中RcvDatDATA30H ;接收數(shù)據(jù)緩沖區(qū)(長度為8字節(jié))XmtDatDATA38H ;發(fā)送數(shù)據(jù)緩沖區(qū)(長度為8字節(jié))FHbitBIT00H ;發(fā)送及接收成功標(biāo)志:0表示成功,1表示失敗

NOACKBIT01H ;讀操作時主器件非應(yīng)答標(biāo)志位,1表示非應(yīng)答,0表示應(yīng)答SCLBITP1.0 ;模擬I2C總線時鐘信號,輸出SDABITP1.1 ;模擬I2C總線數(shù)據(jù)/地址引腳,雙向;“啟動”I2C總線串行EEPROM子程序START:;SETBSCL ;由于空閑時,SCL、SDA為高電平,因此該指令可省略

CLRSDA ;當(dāng)SCL為高電平時,使SDA由高電平變?yōu)榈碗娖?,啟動I2C總線

NOP ;SDA下降沿到SCL下降沿的時間必須大于啟動信號的保持時間(4.0μs)

NOP;當(dāng)晶振頻率為12MHz時,對于12時鐘來說,需要延遲五個器件周期

NOP;當(dāng)晶振頻率為12MHz時,對于六時鐘來說,需要延遲九個機器周期

NOP

NOP

CLRSCL ;將SCL時鐘置為低電平,以便發(fā)送或接收數(shù)據(jù)

RET

;“停止”I2C總線串行EEPROM子程序

STOP: CLRSDA ;由于完成字節(jié)發(fā)送時,SDA引腳鎖存器為1。目的是為了檢測

NOP ;從器件回送的應(yīng)答信號;而在讀操作結(jié)束時,也通過SDA引腳

NOP ;輸出了高電平非應(yīng)答信號,因此執(zhí)行停止總線操作時,CLRSDA ;指令不能少

SETBSCL NOP ;SCL上升沿到SDA上升沿的時間必須大于停止信號的建立時間(4.0μs) NOP ;當(dāng)晶振頻率為12MHz時,對于12時鐘來說,需要延遲四個器件周期

NOP ;當(dāng)晶振頻率為12MHz時,對于六時鐘來說,需要延遲八個機器周期

NOP NOP SETBSDA ;當(dāng)SCL為高電平時,將SDA由低電平拉為高電平,停止I2C總線操作

RET

;“停止”總線操作結(jié)束后,SCL、SDA均處于高電平狀態(tài),即總線處于空閑狀態(tài)

;字節(jié)發(fā)送(寫入)子程序;用于將從器件地址字節(jié)或數(shù)據(jù)字節(jié)發(fā)送到從器件(串行EEPROM)中;入口參數(shù):發(fā)送字節(jié)信息存放在寄存器A中

;出口參數(shù):返回標(biāo)志存放在Fhbit(位地址)中;0表示成功;1表示失敗(從器件不應(yīng)答,發(fā)送失敗);使用資源:PSW、ACC、R3PROCSentByteSentByte:

CLRFHbit ;清除失敗標(biāo)志

MOVR3,#08H ;初始化發(fā)送數(shù)據(jù)位長度

SentLOOP:

CLRSCL ;寫操作時,主器件處于發(fā)送狀態(tài),在SCL;以便從器件(接收方)接收

RLCA ;將ACC.7位移到進(jìn)位標(biāo)志C中,即先送高位

MOVSDA,C ;將數(shù)據(jù)位發(fā)送到SDA引腳。由于寫入時用SCL上升沿同步,因此送數(shù)據(jù)后將SCL置為高電平

NOP ;SCL同步時鐘低電平時間大于4.7μsNOP;根據(jù)CPU時鐘頻率可插入0~8條空操作指令

NOP ;當(dāng)晶振頻率為12MHz時,對于12時鐘來說,需要延遲四個NOP

NOP ;當(dāng)晶振頻率為12MHz時,對于六時鐘來說,需要延遲八個NOPSETBSCL ;將時鐘引腳置為高電平

NOP ;SCL同步時鐘高電平時間大于4.7μsNOP ;根據(jù)CPU時鐘頻率可以插入0~6條空操作指令;NOP;當(dāng)晶振頻率為12MHz時,對于12時鐘來說,需要延遲三個NOP;NOP;當(dāng)晶振頻率為12MHz時,對于六時鐘來說,需要延遲六個NOPDJNZR3,SentLOOP

;R3減1不為0,則繼續(xù)

CLRSCL

;當(dāng)R3=0時,表示已發(fā)送ACC.0位,將SCL置為低電平

;形成發(fā)送ACC.0位的時鐘脈沖

NOP ;SCL同步時鐘低電平時間大于4.7μsNOP ;根據(jù)CPU時鐘頻率可插入0~6條空操作指令

NOP ;當(dāng)晶振頻率為12MHz時,對于12時鐘來說,需要延遲三個NOPNOP ;當(dāng)晶振頻率為12MHz時,對于六時鐘來說,需要延遲七個NOP

SETBSDA ;將與SDA引腳相連的I/O引腳鎖存器位置1,以便將SDA作輸入引腳,

;檢測從器件回送的應(yīng)答信號(這一指令不能少,否則當(dāng)發(fā)送的ACC.0位

;為0時,I/O引腳鎖存器為0,結(jié)果輸入信號總被鉗位在低電平)這正是

;SDA引腳必須選擇OC、OD或準(zhǔn)雙向輸出方式的原因

SETBSCL ;輸出應(yīng)答信號檢測脈沖頭

NOP ;延遲兩個機器周期后,再讀接收方回送的應(yīng)答信號

NOPJNBSDA,SeACK ;如果SDA為低電平,則表示收到應(yīng)答信號

SETBFHbit ;否則,將FHbit置1,表示發(fā)送失敗SeACK:NOPNOPNOP ;注:完成字節(jié)寫入后,SDA引腳鎖存器已經(jīng)為1CLRSCL ;將SCL引腳置為低電平,結(jié)束應(yīng)答檢測脈沖

RETEND;字節(jié)讀;用于接收從器件(串行EEPROM)發(fā)送來的存儲單元信息;入口參數(shù):發(fā)送字節(jié)信息存放在寄存器A中;出口參數(shù):接收到的數(shù)據(jù)信息存放在ACC中;返回標(biāo)志存放在Fhbit(位地址)中;0表示成功;1表示失敗(從器件不應(yīng)答,發(fā)送失敗);使用資源:PSW、ACC、R3PROCReceByteReceByte: SETBSDA;在單字節(jié)(立即讀或選擇性讀)讀程序中,接收總是發(fā)生在寫入從器件地址后;為了能檢測從器件回送的低電平應(yīng)答信號,SDA已被置為輸入狀態(tài),在接;收子程序中,可以省去“SETBSDA”指令。但在連續(xù)讀程序中,主器件每收;到一個字節(jié)的數(shù)據(jù)后,向從器件發(fā)送一個低電平的應(yīng)答信號,這時SDA引;腳對應(yīng)的I/O鎖存器處于輸出狀態(tài),且I/O鎖存器為0不能省去該指令

MOVR3,#08H

;初始化接收數(shù)據(jù)位長度ReceLOOP:

CLRSCL

NOP

;SCL同步時鐘低電平時間大于4.7μs

NOP

;根據(jù)CPU時鐘頻率可插入0~8條空操作指令

NOP;當(dāng)晶振頻率為12MHz時,對于12時鐘來說,需要延遲四個NOP

NOP

;當(dāng)晶振頻率為12MHz時,對于六時鐘來說,需要延遲八個NOP

SETBSCL ;形成SCL上升沿

MOVC,SDA ;在SCL上升沿后,無需延遲,可立即讀輸入數(shù)據(jù)

RLCA

NOP

;SCL同步時鐘高電平時間大于4.7μs

NOP

;根據(jù)CPU時鐘頻率可以插入0~5條空操作指令

;NOP;當(dāng)晶振頻率為12MHz時,對于12時鐘來說,需要延遲兩個NOP ;NOP

;當(dāng)晶振頻率為12MHz時,對于六時鐘來說,需要延遲五個NOP DJNZR3,ReceLOOP CLRSCL

;當(dāng)R3=0時,則表示已接收到ACC.7位,將SCL置為低;電平,形成接收ACC.7位的時鐘脈沖

JNBNOACK,SNOACK ;如果非應(yīng)答標(biāo)志NOACK為0,需給出應(yīng)答信號

CLRNOACK ;清除非應(yīng)答標(biāo)志

SETBSDA ;非應(yīng)答標(biāo)志有效(為1),輸出高電平的非應(yīng)答信號

SJMPNEXTSNOACK: CLRSDA

;主器件未讀出所有指定字節(jié),輸出低電平應(yīng)答信號

NOPNEXT: NOP NOP SETBSCL ;將SCL置為高電平,輸出第9個SCL同步脈沖

NOP ;以便發(fā)送方檢測接收方(主設(shè)備)輸出的應(yīng)答信號

NOP ;SCL同步時鐘高電平時間大于4.7μs NOP ;根據(jù)CPU的時鐘頻率可插入0~5條空操作指令

NOP;當(dāng)晶振頻率為12MHz時,對于12時鐘來說,需要延遲二個NOP

NOP;當(dāng)晶振頻率為12MHz時,對于六時鐘來說,需要延遲五個NOP

CLRSCL ;將SCL置為低電平,以便接收數(shù)據(jù)或發(fā)送停止信號

RETEND

;多字節(jié)寫——數(shù)據(jù)發(fā)送子程序;串行EEPROM、日歷時鐘讀/寫子程序;發(fā)送數(shù)據(jù)子程序;名稱:SendData;描述:發(fā)送ByteCnt個字節(jié)給從器件,如I2C總線串行EEPROM;從器件地址在SlvAdr中,存儲單元地址在SubAdr中;發(fā)送數(shù)據(jù)在XmtDat緩沖區(qū)中;成功發(fā)送數(shù)據(jù),F(xiàn)Hbit標(biāo)志為0;當(dāng)FHbit為1時,表示從器件無應(yīng)答或損壞;使用資源:PSW、ACC、R0、R3;****************************************************************ProcSendDataSendData: LCALLSTART ;啟動I2C總線

MOVA,SlvAdr ;將從器件地址放入累加器A中

LCALLSentByte ;發(fā)送從器件總線地址

JBFHBIT,SenReturn ;從器件不應(yīng)答返回

;發(fā)送存儲單元地址

;對于存儲器單元地址為16位的EEPROM存儲器; MOVR0,#SubAdr+1; MOVA,@R0 ;存儲單元地址高8位送累加器ACC,即先發(fā)送高8位地址A15~A8; LCALLSentByte ;發(fā)存儲單元地址; JBFHbit,SenReturn ;從器件不應(yīng)答返回

;對于存儲單元地址為8位的器件僅保留如下內(nèi)容

MOVR0,#SubAdr MOVA,@R0 ;存儲單元地址低8位送累加器ACC,再發(fā)送低8位地址A7~A0 LCALLSentByte ;發(fā)存儲單元地址

JBFHbit,SenReturn ;從器件不應(yīng)答返回

MOVR0,#XmtDat ;取發(fā)送數(shù)據(jù)緩沖區(qū)首址SentNext: MOVA,@R0 LCALLSentByte ;發(fā)送一次數(shù)據(jù)

JBFHbit,SenReturn ;出錯返回

INCR0 ;取下一個數(shù)據(jù)

DJNZByteCnt,SentNext

;重復(fù)操作直到發(fā)送完最后一個數(shù)據(jù)

LCALLSTOP

;停止I2C總線操作;查詢方式檢測內(nèi)部寫入周期是否已完成LOOP: NOP ;兩次操作之間的延遲

NOP NOP NOP LCALLSTART ;啟動I2C總線

MOVA,SlvAdr ;將從器件地址放入累加器A中

LCALLSentByte ;發(fā)送從器件總線地址

JBFHBIT,LOOP ;從器件不應(yīng)答返回

LCALLSTOP ;停止I2C總線操作;*********************************************************SenReturn: RETEND;多字節(jié)讀——接收子程序;*********************************************************;接收數(shù)據(jù)子程序;名稱:ReceData;描述:自從器件(如I2C總線串行EEPROM)讀出ByteCnt個字節(jié)數(shù)據(jù)信息

;從器件地址在SlvAdr中,待讀出的存儲單元地址在SubAdr中;接收數(shù)據(jù)放在RevDat緩沖區(qū)中;成功接收數(shù)據(jù),F(xiàn)Hbit標(biāo)志為0;當(dāng)FHbit為1時,表示從器件無應(yīng)答或損壞;使用資源:PSW、ACC、R0、R3;**************************************************************PROCReceDataReceData: LCALLSTART ;啟動I2C總線

MOVA,SlvAdr ;從器件地址送累加器ACC LCALLSentByte ;發(fā)送從器件地址

JBFHBIT,RevReturn ;從器件不應(yīng)答返回

;發(fā)送存儲單元地址 ;對于存儲器單元地址為16位的EEPROM存儲器

;MOVR0,#SubAdr+1 ;MOVA,@R0 ;存儲單元地址高8位送累加器ACC,即先送高8位地址A8~A15 ;LCALLSentByte ;發(fā)存儲單元地址

;JBFHbit,RevReturn ;從器件不應(yīng)答返回

;對于存儲單元地址為8位的器件僅保留如下內(nèi)容

MOVR0,#SubAdr MOVA,@R0 ;存儲單元地址低8位送累加器ACC,送低8位地址A7~A0

LCALLSentByte ;發(fā)存儲單元地址(只完成存儲單元定位操作既不給數(shù)據(jù),也沒執(zhí)行

;“停止總線”操作,因此并沒有寫操作,故稱為“啞寫” JBFHbit,RevReturn ;從器件不應(yīng)答返回

;完成“啞寫”過程,將從器件地址計數(shù)器定位到將要讀出的存儲單元

LCALLSTART ;重新啟動I2C總線

MOVA,SlvAdr ;從器件地址送累加器ACC SETBACC.0 ;將從器件控制字改為讀狀態(tài)

LCALLSentByte ;發(fā)送從器件地址(控制字) JBFHBIT,RevReturn ;從器件不應(yīng)答返回

;接收數(shù)據(jù)

CLRNOACK ;清除非應(yīng)答標(biāo)志

MOVR0,#Rcvdat ;接收數(shù)據(jù)緩沖區(qū)首地址送R0 DJNZByteCnt,Next ;繼續(xù)接收下一字節(jié)信息

SJMPReceLast

;減1為0,說明僅接收一字節(jié)信息(也是最后一個字節(jié))Next:

LCALLReceByte ;接收下一字節(jié)數(shù)據(jù)

MOV@R0,A ;接收到的數(shù)據(jù)送接收緩沖區(qū)

INCR0 ;指針下移,指向緩沖區(qū)下一存儲單元

DJNZByteCnt,Next ;重復(fù)進(jìn)行直到剩余最后一個字節(jié)ReceLast: SETBNOACK ;在接收最后一個字節(jié)時,主器件無需應(yīng)答

LCALLReceByte ;接收最后一個字節(jié)數(shù)據(jù)

MOV@R0,A ;接收到的數(shù)據(jù)送接收緩沖區(qū)

LCALLSTOP ;停止總線操作RevReturn: RETEND

2.8563日歷時鐘芯片功能及使用

Philips公司低功耗的CMOS實時時鐘日歷芯片PCF8563通過I2C總線完成數(shù)據(jù)輸入/輸出,最大數(shù)據(jù)傳輸率為400kb/s,電源電壓范圍寬(1.0~5.5V),功率低,靜態(tài)電流典型值為0.25μA。可廣泛應(yīng)用于電話、便攜式或電池供電的儀器儀表等產(chǎn)品中,其主要功能如下:

(1)

內(nèi)置了日歷時鐘電路(實現(xiàn)年月日時分秒的計數(shù)),并具有分、時、日、星期報警功能。

(2)內(nèi)置了可編程時鐘輸出電路,可編程輸出32.768kHz、1024Hz、32Hz、1Hz方波信號。

圖11-9引腳排列與典型應(yīng)用電路(a)引腳排列;(b)典型應(yīng)用電路

OSCI:內(nèi)部振蕩器輸入端。一般需要在OSCI引腳接小容量電容,如圖11-9(b)中的C1,以調(diào)節(jié)振蕩頻率。

OSCO:內(nèi)部振蕩器輸出端。

SCL:I2C總線串行時鐘輸入端。

SDA:I2C總線串行數(shù)據(jù)輸入/輸出端,雙向。:報警或倒數(shù)計數(shù)器回零中斷輸出端,漏極開路(OD)。報警有效時,輸出低電平;倒數(shù)計數(shù)器回零時,可編程選擇輸出低電平信號或負(fù)脈沖信號。

CLKOUT:可編程時鐘輸出端,漏極開路(OD)。

VDD:電源輸入端。PCF8563屬于CMOS器件,電源電壓在1.0~5.5V之間。

VSS:電源地。

1)PCF8563從器件地址及存儲單元分配

PCF8563芯片從器件地址固定為,即讀操作從器件地址為A3H,寫入操作從器件地址為A2H。

PCF8563共有16字節(jié)存儲單元,各存儲單元(位)分配如表11-2所示。

表11-216字節(jié)存儲單元用途

表11-216字節(jié)存儲單元用途

2)寄存器位含義

(1)下面介紹控制/狀態(tài)寄存器1。

TESTC:電源復(fù)位功能。1表示有效(缺省值);0表示無效。

STOP:芯片時鐘運行/停止。0表示運行(缺省);1表示停止。

TEST:模式控制(0表示普通模式,1表示測試模式),缺省值為0(即處于普通模式)。因此,一般并不需要初始化控制/狀態(tài)寄存器1。

(2)下面介紹與日歷有關(guān)的寄存器位。

VL(b7):表示精確時間(復(fù)位時為1),0表示精確時間。完成時間設(shè)定后,可將VL位清零,表示時間已校準(zhǔn)過。

C:表示世紀(jì)。C=0表示年份為20XX,C=1表示年份為19XX,上電缺省值為0,即21世紀(jì))。

(3)下面介紹與報警功能有關(guān)的寄存器位。與報警功能有關(guān)的寄存器位涉及報警時間有效控制位AE、?控制/狀態(tài)寄存器2中的AIE和AF。

AE:報警時間使能。當(dāng)AE=0時,表示對應(yīng)報警時間有效,上電缺省值為1,即上電后沒有使用定時報警功能。

AF:報警狀態(tài)(中斷標(biāo)志)位,當(dāng)報警有效時,硬件置1(只能由軟件清除),同時使INT有效(即輸出0電平)。但值得注意的是,當(dāng)AF有效時,INT總是輸出低電平信號,與TI/TP位設(shè)置無關(guān)。

AIE:允許報警中斷(1表示允許)。在AE=0(位于報警時間字節(jié)的b7位)時,即啟用報警功能后,當(dāng)日歷時間與所設(shè)定的報警時間相等時,AF標(biāo)志有效;如果AIE為1(報警時允許INT中斷有效時),INT有效,輸出低電平信號,即報警功能觸發(fā)中斷條件為

;AE為0,即必須啟動報警功能

;AIE為1,即允許報警中斷

;AF為1的含義是當(dāng)前時間等于某一報警寄存器設(shè)的定時間

(4)下面介紹與倒數(shù)計數(shù)器控制有關(guān)的寄存器位。與倒數(shù)計數(shù)器控制有關(guān)的寄存器位包括了倒數(shù)計數(shù)器使能位TE、計數(shù)脈沖頻率選擇位FD1及FD0、控制/狀態(tài)寄存器2中的TIE、TF,以及計數(shù)器回零INT輸出方式選擇位TI/TP。

TE:允許/禁止計數(shù)器計數(shù)。0表示禁止(上電缺省值);1表示允許。

TF:計數(shù)器回零(即定時時間到)標(biāo)志位,倒數(shù)計數(shù)器回零時,硬件置1(需軟件清除)。

TIE:允許計數(shù)器回零觸發(fā)中斷。1表示允許;0表示禁止。

TI/TP:選擇倒數(shù)計數(shù)器回零時INT中斷輸出方式。1表示脈沖輸出方式,即倒數(shù)計數(shù)器回零時,在INT引腳上輸出負(fù)的窄脈沖,窄脈沖脈沖頭寬度與OEH單元定義的計數(shù)脈沖頻率及倒數(shù)計數(shù)器初值n有關(guān),如表11-3所示。0表示電平輸出方式,即當(dāng)TF有效時,INT引腳輸出低電平,直到通過軟件方式清除TF標(biāo)志。在電平輸出方式中,由倒數(shù)計數(shù)器觸發(fā)的中斷有效條件為

;TE為1,即必須使能倒數(shù)計數(shù)器

;TIE為1,即允許倒數(shù)計數(shù)器回零中斷

;TF為1的含義是倒數(shù)計數(shù)器回零

表11-3FD1、FD0定義的計數(shù)脈沖源頻率

可見,當(dāng)計數(shù)脈沖頻率≤64Hz時,INT引腳負(fù)脈沖頭寬度固定為1/64(即15.625ms),周期與倒數(shù)計數(shù)器數(shù)值寄存器內(nèi)容有關(guān),即INT引腳脈沖周期為

(5)下面介紹與CLKOUT可編程時鐘輸出有關(guān)寄存器位。

FE位用于定義允許/禁止CLKOUT引腳時鐘輸出功能。0表示禁止(上電缺省值);1表示允許。而FD1、FD0位則定義CLKOUT輸出頻率,如表11-4所示。

表11-4FD1、FD0定義CLKOUT輸出頻率

3)初始化舉例

(1)

日歷時鐘初始化。通過I2C總線主設(shè)備按I2C總線讀/寫規(guī)范,將年、月、日、星期、時、分、秒初值寫入02H~08H存儲單元,即可完成日歷時鐘的初始化,片內(nèi)日歷時鐘便從設(shè)定時間開始計時。參考程序段如下:

MOVR0,#XmtDat ;發(fā)送緩沖區(qū)首地址送R0 MOV@R0,#00H ;秒初值

INCR0 MOV@R0,#30H ;分初值

INCR0 MOV@R0,#12H ;時初值

INCR0 MOV@R0,#09H ;日初值

INCR0 MOV@R0,#03H ;星期初值

INCR0 MOV@R0,#11H ;世紀(jì)及月初值

INCR0 MOV@R0,#04H ;年初值

MOVByteCnt,#07H ;傳送7字節(jié)

MOVSlvAdr,#0A2H ;PCF8563日歷時鐘器件地址為0A2HMOVSubAdr,#02H ;寫入歷時鐘02H~08H單元開始LCALLSendData ;調(diào)用EEPROM多字節(jié)寫入過程,將發(fā)送緩沖區(qū)內(nèi)信息寫入;PCF8563日歷芯片內(nèi)指定單元值得注意的是:讀日歷時鐘信息時,未定義位狀態(tài)不確定。

(2)?CLKOUT可編程時鐘輸出初始化。初始化0DH單元。將FE位置1,允許CLKOUT時鐘輸出;定義FD1、FD0位,選擇時鐘的頻率即可,如:

MOVR0,#XmtDat ;發(fā)送緩沖區(qū)首地址送R0 MOV@R0,#83H ;允許CLKOUT輸出,F(xiàn)D1、FD0為11 ;即時鐘頻率為1Hz MOVByteCnt,#01H ;傳送1字節(jié)

MOVSlvAdr,#0A2H ;PCF8563日歷時鐘器件地址為A2

溫馨提示

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

最新文檔

評論

0/150

提交評論