《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 其他 > 業(yè)界動態(tài) > 基于MDB/ICP協(xié)議的自動售賣系統(tǒng)的主控制器實(shí)現(xiàn)

基于MDB/ICP協(xié)議的自動售賣系統(tǒng)的主控制器實(shí)現(xiàn)

2008-12-09
作者:洪強(qiáng)寧 齊國生 葉 丹

  摘? 要: 介紹一種以DALLAS DS5002FP單片機(jī)為主控制器" title="主控制器">主控制器的MDB/ICP協(xié)議實(shí)現(xiàn)。從硬件和軟件描述了如何控制MDB總線,并給出一個較成熟的控制外設(shè)" title="外設(shè)">外設(shè)會話的總線驅(qū)動程序。該協(xié)議實(shí)現(xiàn)清晰、簡單,采用MCS-51兼容單片機(jī)降低成本,充分體現(xiàn)了MDB/ICP的優(yōu)越性。?

  關(guān)鍵詞: 單片機(jī) 自動售賣系統(tǒng) 主控制器?

?

  隨著國民經(jīng)濟(jì)和技術(shù)的發(fā)展,自動售賣系統(tǒng)由于其方便性、易管理性和低成本,正得到越來越廣泛的應(yīng)用。而自動售賣系統(tǒng)的外設(shè)也越來越復(fù)雜,從投幣機(jī)到讀鈔機(jī)到非現(xiàn)金交易(如IC記帳卡),導(dǎo)致對主控制器的要求越來越高。為了簡化設(shè)計,采用一個簡單、穩(wěn)定的內(nèi)部通訊總線協(xié)議" title="總線協(xié)議">總線協(xié)議非常必要。?

  本文介紹了歐洲售貨機(jī)制造者協(xié)會(EVMMA)制定的MDB/ICP總線協(xié)議。該協(xié)議簡潔明了,功能強(qiáng)大,可擴(kuò)展性強(qiáng),并且對外掛設(shè)備數(shù)目沒有限制,是理想的自動售賣系統(tǒng)內(nèi)部總線協(xié)議。本文從主控制器的角度給出了對MDB/ICP總線進(jìn)行操作控制的硬件和軟件實(shí)現(xiàn)。?

1 MDB/ICP協(xié)議簡介?

  MDB/ICP協(xié)議(Multi-Drop Bus / Internal Communication Protocol)是歐洲售貨機(jī)制造者協(xié)會制定的一套用于協(xié)調(diào)自動售賣機(jī)的主控制器(VMC)與多個外設(shè)之間通信的協(xié)議。硬幣機(jī)和讀鈔機(jī)的標(biāo)準(zhǔn)首先是由Coinco在美國可口可樂公司的指定下開發(fā)的。這個標(biāo)準(zhǔn)于1993年被NAMA協(xié)會采用,經(jīng)過一個專門的工作組修訂后,于1994年被EVMMA采用。第二階段的非現(xiàn)金交易標(biāo)準(zhǔn)由Debitek代表NAMA開發(fā),并于1994年被NAMA采用。EVMMA加入了一些兼容的指令后于1995年采用。?

  MDB接口實(shí)際上是工作于9600波特率的主從型串行總線接口,所有外圍設(shè)備(例如硬幣機(jī)、讀鈔機(jī)、讀卡器等)均為主控制器(傳統(tǒng)上稱為售貨機(jī)控制器——VMC)的從機(jī)。所有外圍設(shè)備與VMC之間的通信方式都一致。?

  MDB協(xié)議的串行位格式為:1個起始位,8個數(shù)據(jù)位,1個方式位與1個停止位,共11位。位傳遞的順序如圖1所示。其中方式位根據(jù)傳遞的方式不同置0或置1。在MDB總線上,VMC通過廣播方式向外發(fā)送命令。第一字節(jié)為地址字節(jié)(實(shí)際上只有高5位尋址信息,低3位為對外設(shè)的指令),該字節(jié)被所有的外設(shè)讀取,但只有符合地址字節(jié)所指定的外設(shè)才處理其后的數(shù)據(jù)字節(jié),并做出反應(yīng)。在VMC到外設(shè)的數(shù)據(jù)中,地址字節(jié)的方式位被置1,數(shù)據(jù)字節(jié)的方式位被置0,外設(shè)通過檢驗接收到的方式位確認(rèn)是地址命令還是數(shù)據(jù)。當(dāng)數(shù)據(jù)從外設(shè)發(fā)送到主機(jī)時,最后送出的字節(jié)方式位被置1,標(biāo)志著數(shù)據(jù)發(fā)送完畢。?

  VMC向外設(shè)傳送的指令由一個地址字節(jié)、一些可選的數(shù)據(jù)字節(jié)與一個校驗和(CHK)字節(jié)構(gòu)成。發(fā)送指令后,外設(shè)應(yīng)答VMC的通信塊可以由一個數(shù)據(jù)塊" title="數(shù)據(jù)塊">數(shù)據(jù)塊和一個CHK字節(jié)組成,或者一個應(yīng)答字節(jié)(ACK),或者一個無應(yīng)答字節(jié)(NAK)。如果外設(shè)應(yīng)答數(shù)據(jù)塊的話,VMC將通過一個應(yīng)答字節(jié)(ACK)、無應(yīng)答字節(jié)(NAK)或重發(fā)字節(jié)(RET)應(yīng)答外設(shè)傳回的數(shù)據(jù)。?

  圖2至圖5為幾個典型的會話例子,其中“*”表示傳送時方式位置1,“ADD”表示地址字節(jié),“CHK”表示傳送數(shù)據(jù)的校驗和。?

?

?

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

  在MDB/ICP總線協(xié)議基礎(chǔ)上,筆者構(gòu)建了一個實(shí)際的自動售賣系統(tǒng),系統(tǒng)原理圖如圖6所示。VMC通過MDB總線與投幣機(jī)、讀鈔機(jī)和讀卡器交互,控制外設(shè)的運(yùn)轉(zhuǎn),并從外設(shè)獲得用戶的支付情況。同時,VMC也負(fù)責(zé)處理與用戶之間的交互,驅(qū)動液晶顯示,處理鍵盤輸入,驅(qū)動符合用戶需要的電機(jī)運(yùn)轉(zhuǎn)出貨。在本項目中,VMC還需通過MODEM自動撥號連接公司總部的服務(wù)器,將銷售數(shù)據(jù)傳送回公司。?

?

?

  如圖6所示,所有MDB外設(shè)均掛在同一總線上,由總線提供24V和5V的電源,數(shù)據(jù)線與單片機(jī)的串口" title="串口">串口相連。?

  本項目中選用的單片機(jī)為DALLAS DS5002FP。該單片機(jī)代碼級兼容MCS-51系列單片機(jī),在使用外存的情況下仍然可以使用4個PO作為數(shù)據(jù)I/O,帶外設(shè)的能力較強(qiáng)。但它只有一個串口,控制MDB總線和控制MODEM都需要使用串口,因此必須將串口進(jìn)行復(fù)用。通過一個譯碼器實(shí)現(xiàn)選通功能。?

3 MDB/ICP會話控制?

  將VMC與外設(shè)之間通過MDB總線的會話分為四個層次:?

  (1)串口初始化?

  初始化串口時,主要工作是設(shè)置波特率(9600)和傳輸方式(11位)。為順利獲得9600波特率,單片機(jī)采用的晶振為11.0592MHz。源代碼如下(采用Franklin C51語言編寫):?

// 一些常量定義?

#define uchar unsigned char?

#define T_RESPONSE 0xee ??? ??/*5.0毫秒*/?

#define MAX_BLOCK_SIZE 36? /*數(shù)據(jù)塊最大長度*/?

#define ERR_TIME_OUT 0x81? /*超時*/?

#define ERR_NO_MODE_BIT 0x82/*未收到最后字節(jié)*/?

#define ERR_CHECKSUM 0x83 /*校驗和錯*/?

#define ACK 0x00?

#define RET 0xaa?

#define NAK 0xff?

// 初始化串口?

void InitSerialPort()?

{?

??? SCON = 0xd0;??????? // 設(shè)置串口為方式3(9bit)?

??? TMOD &= 0x0f;?

??? TMOD |= 0x20;?????? // 設(shè)置定時器1為方式2?

??? TR1 = 1;??????????? // 定時器1使能?

??? TH1 = 0xfd;???????? // 設(shè)定波特率: 9600 NRZ?

??? PCON &= 0x7f;?????? // Set SMOD=0?

??? RI = 0;?

??? TI = 0;?

}?

  (2)字節(jié)的傳送?

  這里需要注意的是:發(fā)送數(shù)據(jù)時要根據(jù)需要設(shè)置方式位,而接收數(shù)據(jù)時要返回方式位的值,以判斷是否收完所有數(shù)據(jù)。?

??? // 傳送字節(jié)?

void TransmitByte(uchar byte, bit mode)?

??? // 形參:byte——準(zhǔn)備發(fā)送的字節(jié)?

??? //?????? mode——預(yù)備要設(shè)置的方式位?

{?

??? TB8 = mode;???????? // 設(shè)置方式位?

??? SBUF = byte;??????????? // 發(fā)送字節(jié)?

??? while(!TI);???????? // 等待發(fā)送完畢?

??? TI = 0;?

}?

??? // 接收字節(jié)?

#pragma disable?

uchar ReceiveByte(uchar *byte, uchar *bMode)?

??? // 形參:*byte——返回接收到的字節(jié)值?

??? //?????? *bMode——返回接收到的字節(jié)的方式位?

??? // 返回值:0—超時,1—成功接收?

{?

??? TMOD &= 0xf0;?

??? TMOD |= 0x01;?????????? // 設(shè)置定時器0為方式1(16位)?? ?

??? TH0 = T_RESPONSE;?

??? TL0 = 0x00;???????????? // 設(shè)置超時門限?

??? TF0 = 0;?

??? TR0 = 1;??????????????? // 定時器0使能?

??? while (!RI && !TF0)?

??????? ;?????????????????? // 等待接收字節(jié)直至超時?

??? TF0 = 0;?

??? if (RI) {?????????????????? // 已接收字節(jié)?

??????? RI = 0;?

??????? *byte = SBUF;?????? // 返回字節(jié)值?

??????? *bMode = RB8;?????? // 返回方式位?

??????? return 1;?

??? } else {??????????????????? // 超時?

??????? RI = 0;?

??????? return 0;?

??? }?

}?

  (3) 數(shù)據(jù)塊的傳送?

  這部分與下面的會話部分放在一個函數(shù)體內(nèi)實(shí)現(xiàn)。?

  (4) 會話?

  這是MDB會話控制的核心部分。根據(jù)需要傳送數(shù)據(jù)包,計算校驗字節(jié),控制方式位,在時序允許的響應(yīng)時間內(nèi)接受外設(shè)返回的數(shù)據(jù),做出ACK或NAK等反應(yīng)。并且按照MDB/ICP標(biāo)準(zhǔn)中推薦的方式處理異常情況,當(dāng)接受數(shù)據(jù)超時或校驗和錯時,重復(fù)發(fā)送命令多次,以增強(qiáng)容錯性能。將接收到的數(shù)據(jù)返回給調(diào)用者,并返回結(jié)果碼。源程序如下:?

//與外設(shè)會話,在調(diào)用之前確認(rèn)譯碼器選通MDB總線?

uchar Session(uchar add, uchar dat[], uchar count)?

// 形參:add——VMC發(fā)送的地址指令字節(jié)?

// ??????dat[]——VMC發(fā)送的數(shù)據(jù)塊?

//?????? count——數(shù)據(jù)塊的大小?

// 返回值:0——外設(shè)應(yīng)答ACK?

//?? 非0且小于0x80——外設(shè)應(yīng)答的數(shù)據(jù)塊的大小?

//?? 大于等于0x80——會話中出錯?

// 外設(shè)應(yīng)答的數(shù)據(jù)塊存放在全局?jǐn)?shù)組uchar recBuff[]?

{?

??? uchar data check, i, j, err;?

??? uchar data mode;?

?????

??? for (j=0; j<5; j++) {? //最多重復(fù)發(fā)送命令5次?

??????? check = 0;?

??????? err = 0;?

??????? TransmitByte(add, 1);?????????? //發(fā)送地址字節(jié)?

??????? check += add;?????????????? //計算CHK?

??????? for (i=0; i

??????????? TransmitByte(dat[i], 0);?

??????????? check += dat[i];?

??????? }?

??????? TransmitByte(check, 0); ??????? //發(fā)送CHK?

??????? for (i=0, check=0, mode=0;?

??????? !mode && i

??????? i++)?

??????? { // 反復(fù)接收字節(jié)直至方式位為1或出錯?

??????? // 接收到的數(shù)據(jù)存在全局?jǐn)?shù)組recBuff[]里?

??????????? if (!ReceiveByte(recBuff+i, &mode))?

??????????? //超時。外設(shè)可用超時表示NAK?

??????????????? err = i?ERR_TIME_OUT:NAK;?

??????????? else if (i==0 && recBuff[i]==NAK ?

??????????? && mode)?

??????????? // 收到NAK?

??????????????? err = NAK;?

??????????? else if (!mode)?

??????????? //方式位為0表示還有數(shù)據(jù)?

??????????????? check += recBuff[i];?

??????? }? // for i?

??????? ?

??????? if (!err) {???? // 未發(fā)生錯誤?

??????????? if (!mode) {?

??????????????????????? // 收完36個字節(jié)還未結(jié)束?

??????????????? TransmitByte(NAK, 0);?

??????????????? err = ERR_NO_MODE_BIT;?

??????????? } else if (i>1) {?

??????????????????????? // 收到數(shù)據(jù)塊?

??????????????? if (check != recBuff[i-1]) {?

??????????????????????? //校驗和錯?

??????????????????? TransmitByte(NAK, 0);?

??????????????????? err = ERR_CHECKSUM;?

??????????????? } else {?

??????????????????????? //一切正常,發(fā)送ACK后跳出循環(huán)?

??????????????????? TransmitByte(ACK, 0);?

??????????????????? break;?

??????????????? }?

??????????? } else?

??????????????????????????? //收到外設(shè)傳來的ACK?

??????????????? break;?

??????? } // if (!err)?

??????? Wait(T_RESPONSE);?? //防止與外設(shè)數(shù)據(jù)沖突?

??? } // for j?

??????????????? //返回接收到的數(shù)據(jù)塊大小或出錯代碼?

??? return err?err:(i-1);?

}?

  本文使用DS5002FP實(shí)現(xiàn)了對MDB總線的控制與訪問。通過將MDB/ICP協(xié)議進(jìn)行分解,很好地實(shí)現(xiàn)了總線驅(qū)動。實(shí)踐證明該驅(qū)動程序穩(wěn)定、可靠,大大降低了上層界面開發(fā)的難度,提高了系統(tǒng)的可維護(hù)性,節(jié)約了成本。?

參考文獻(xiàn)?

1 DALLAS Semiconductor Corp. Secure Microcontroller Data Book, 1996?

2 Philips Semiconductors.80C51-Based 8-Bit Microcontrollers,1994?

3 EVMMA. The I.C.P.(M.D.B. Europe) V2.1, 1996?

4 徐愛鈞, 彭繡華. 單片機(jī)高級語言C51應(yīng)用程序設(shè)計.北京:電子工業(yè)出版社, 1998?

5 何立民. MCU應(yīng)用系統(tǒng)的可靠性設(shè)計綱要V0.5. 電子技術(shù)應(yīng)用, 1999; 5(4)?

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。