0 引言
USB(通用串行總線),是近年來逐步在PC領(lǐng)域廣為應(yīng)用的新型接口技術(shù),廣泛地應(yīng)用于PC機(jī)以及嵌入式系統(tǒng)上。目前市場上的USB設(shè)備, 除計(jì)算機(jī)是主機(jī)接口外,其他多數(shù)為從機(jī)接口, 如打印機(jī)、U 盤等,然而USB 的拓?fù)浣Y(jié)構(gòu)中居于核心地位的是Host (也稱為主機(jī)) , 任何一次USB的數(shù)據(jù)傳輸都必須由主機(jī)來發(fā)起和控制,DEVICE (從機(jī)或設(shè)備) 只能響應(yīng)主機(jī)的請求,任何2個(gè)外設(shè)之間或是2個(gè)主機(jī)之間無法直接通信。隨著USB應(yīng)用領(lǐng)域的逐漸擴(kuò)大,人們對于USB的期望也越來越高,希望USB能應(yīng)用在沒有PC的領(lǐng)域中,基于USB HOST的開發(fā)應(yīng)用也越來越廣泛。筆者考慮到傳統(tǒng)的環(huán)境監(jiān)測儀多利用RS485實(shí)現(xiàn)與PC主機(jī)的有線遠(yuǎn)程數(shù)據(jù)傳輸,使得監(jiān)測儀的工作場合和便攜性受到相當(dāng)大的限制,在本文中提出一種新型環(huán)境參數(shù)監(jiān)測儀,它配置兩路音頻和溫度傳感器,以USB HOST系統(tǒng)為核心,以U盤為數(shù)據(jù)存儲(chǔ)媒介,不受場合限制隨時(shí)隨地實(shí)現(xiàn)環(huán)境參數(shù)(環(huán)境噪音響度,溫度)的采集、處理、存儲(chǔ)和通信等功能;更有助于準(zhǔn)確地建立環(huán)境參數(shù)的演變數(shù)據(jù)庫,為環(huán)境的監(jiān)控和整改提供客觀依據(jù);便于攜帶,成本低廉,有較強(qiáng)的市場前景。
1 環(huán)境監(jiān)測儀的設(shè)計(jì)
1.1 系統(tǒng)概述
環(huán)境監(jiān)測儀對環(huán)境參數(shù)的處理可分為信號采集和數(shù)據(jù)處理兩部分,與此相對應(yīng),環(huán)境監(jiān)測儀主要由環(huán)境參數(shù)采集電路和USB主機(jī)兩個(gè)部分組成。整體結(jié)構(gòu)框圖見圖1:
圖 1 整體結(jié)構(gòu)框圖
1.2 環(huán)境參數(shù)采集電路設(shè)計(jì)
以DS18B20單線數(shù)字溫度傳感器,MCA-BTA聲音傳感器加上高速A/D構(gòu)成了系統(tǒng)的環(huán)境參數(shù)采集電路。
DS18B20數(shù)字溫度計(jì)是DALLAS公司生產(chǎn)的1-Wire,即單總線器件,線路簡單(三個(gè)引腳GND,DQ:數(shù)字信號輸入輸出端,VDD),體積小;只要求一個(gè)端口即可實(shí)現(xiàn)通信;不需要外部任何元器件即可實(shí)現(xiàn)測溫,范圍在-55℃到+125℃之間;可以通過寄生電源或者外部電源兩種供電方式工作。因此完全符合便利地對現(xiàn)場溫度測量的要求。需要注意的是,在寄生電源接線模式下,必須確保電源電壓汲取能量充足,否則會(huì)導(dǎo)致測量溫度偏高,誤差量較大。
MCA-MTA聲音傳感器由美國Vernier公司生產(chǎn),使用的是與人類耳朵相似具有頻率反應(yīng)的電麥克風(fēng)。它的工作原理為:聲壓訊號→傳感器→電壓訊號→放大器→計(jì)權(quán)網(wǎng)絡(luò)dB值。
為增加檢測信息的實(shí)用性,USB主機(jī)系統(tǒng)設(shè)計(jì)中加了一個(gè)日歷時(shí)鐘模塊:DS 12C887。DS 12C887 能夠自動(dòng)產(chǎn)生世紀(jì)、年、月、日、時(shí)、分、秒等時(shí)間信息; 具有標(biāo)準(zhǔn)的并行總線口, 可以方便與單片機(jī)連接。
1.3 嵌入式USB主機(jī)硬件結(jié)構(gòu)設(shè)計(jì)
1.3.1 硬件要求
USB主機(jī)是本監(jiān)測儀開發(fā)中的重點(diǎn)和核心。設(shè)計(jì)嵌入式USB主機(jī)電路要遵循USB主機(jī)的協(xié)議規(guī)范,具體在硬件設(shè)計(jì)上要選擇USB主機(jī)的接口芯片,并且要選用合適的MCU(單片機(jī)或微控制器)或MPU(微處理器)來控制。因?yàn)檎麄€(gè)USB協(xié)議框架非常復(fù)雜,所以就需要MCU具有較大的內(nèi)部RAM,用以處理大量的數(shù)據(jù)緩沖區(qū),變量,數(shù)據(jù)存儲(chǔ)等等;其次系統(tǒng)要有大量的程序存儲(chǔ)區(qū),一般FLASH的需求大概是在10K至60K。
1.3.2 CH375簡介
CH375是一個(gè)USB總線的通用接口芯片,支持HOST主機(jī)方式和SLAVE 設(shè)備方式。CH375的USB主機(jī)方式支持各種常用的USB全速設(shè)備,外部單片機(jī)/DSP/MCU可以通過CH375按照相應(yīng)的USB 協(xié)議與USB 設(shè)備通訊。CH375還內(nèi)置了處理Mass Storage海量存儲(chǔ)設(shè)備的專用通訊協(xié)議的固件,外部單片機(jī)/DSP/MCU可以直接以扇區(qū)為基本單位讀寫常用的USB 存儲(chǔ)設(shè)備(包括USB硬盤/USB閃存盤/U盤)。
CH375芯片內(nèi)部集成了PLL倍頻器、主從USB接口SIE、數(shù)據(jù)緩沖區(qū)、被動(dòng)并行接口、異步串行接口、命令解釋器、控制傳輸?shù)膮f(xié)議處理器、通用的固件程序等。對于USB存儲(chǔ)設(shè)備的應(yīng)用,CH375直接提供了數(shù)據(jù)塊的讀寫接口,以512b的物理扇區(qū)為基本讀寫單位,從而將USB存儲(chǔ)設(shè)備簡化為一種外部數(shù)據(jù)存儲(chǔ)器,單片機(jī)可以自由讀寫USB存儲(chǔ)設(shè)備中的數(shù)據(jù),也可以自由定義其數(shù)據(jù)結(jié)構(gòu)。
1.3.3 CPU的選擇
CH375的文件級子程序庫(實(shí)現(xiàn)FAT文件系統(tǒng)層,詳細(xì)請見軟件設(shè)計(jì))需要大約600字節(jié)的隨機(jī)存儲(chǔ)器RAM作為緩沖區(qū)。鑒于采用MCS51內(nèi)核, 且與AT89C52兼容的SM 5964單片機(jī)內(nèi)部嵌有64KB的flash和1KB的SRAM,為USB主機(jī)協(xié)議的實(shí)現(xiàn)提供了足夠的代碼空間和數(shù)據(jù)存儲(chǔ)區(qū),無須擴(kuò)展外部RAM,簡化了硬件層面的設(shè)計(jì),而且抗干擾能力較強(qiáng),溫度范圍寬,在目前市場上性價(jià)比較高,嵌入式USB主機(jī)CPU采用SM 5964。
1.3.4 連接電路
CH375工作于主機(jī)模式時(shí),分為串行方式與并行方式兩種。我們這里采用串行方式,這種的連線相對比較簡單。如果CH375芯片的TXD引腳懸空(待接單片機(jī))或者沒有通過下拉電阻接地,那么CH375工作于串口方式。在串口方式下,CH375只需要與單片機(jī)/DSP/MCU連接3個(gè)信號線,TXD引腳、RXD引腳以及INT#引腳,其它引腳都可以懸空,就可以進(jìn)行較遠(yuǎn)距離的點(diǎn)對點(diǎn)連接。CH375芯片的RXD 和TXD分別連接到單片機(jī)的串行數(shù)據(jù)輸出引腳和串行數(shù)據(jù)輸入引腳。INT#輸出的中斷請求是低電平有效,用于通知單片機(jī)(見圖2)。
CH375 的串行數(shù)據(jù)格式是1個(gè)起始位、9個(gè)數(shù)據(jù)位、1個(gè)停止位,其中前8個(gè)數(shù)據(jù)位是一個(gè)字節(jié)數(shù)據(jù),最后1個(gè)數(shù)據(jù)位是命令標(biāo)志位。第9位為0時(shí),前8位的數(shù)據(jù)被寫入CH375芯片中,第9位為1時(shí),前8位被作為命令碼寫入CH375芯片中。CH375的串行通訊波特率默認(rèn)是 9600 bps,單片機(jī)可以隨時(shí)通過SET_BAUDRATE 命令選擇合適的通訊波特率。
圖 2 串口方式下CH375與單片機(jī)連接示意圖
1.4 嵌入式USB主機(jī)的軟件設(shè)計(jì)
嵌入式USB主機(jī)主要實(shí)現(xiàn)USB設(shè)備的熱插拔檢測、設(shè)備重啟、讀取設(shè)備的各種描述符等USB1.1協(xié)議規(guī)范, 并實(shí)現(xiàn)USB Mass Storage 類。Mass Storage 類主要用于為軟磁盤接口、ATA接口、硬盤接口及FLASH存儲(chǔ)器等設(shè)備建立的USB接口。
在USB主機(jī)方式下,CH375支持各種常用的USB全速設(shè)備,以中斷方式通知外部單片機(jī)(SM5964)進(jìn)行處理,中斷邏輯圖如圖3。單片機(jī)需要編寫固件程序按照相應(yīng)的USB協(xié)議與USB設(shè)備通訊。
圖 3 主機(jī)方式下CH375中斷邏輯圖
單片機(jī)處理USB存儲(chǔ)設(shè)備的文件系統(tǒng)需要實(shí)現(xiàn)圖3左邊的4個(gè)層次,右邊是USB存儲(chǔ)設(shè)備的內(nèi)部結(jié)構(gòu)層次。CH375不僅是一個(gè)通用的USB-HOST硬件接口芯片,還內(nèi)置了相關(guān)的固件程序,包含了圖4左邊的3個(gè)層次(深色),所以實(shí)際的單片機(jī)程序主要處理FAT文件系統(tǒng)層。
圖 4 處理USB存儲(chǔ)設(shè)備文件系統(tǒng)示意圖
在上圖中的SCSI,UFI,RBC都是Mass Storage類的子類,都有自己的協(xié)議,應(yīng)用于不盡相同的設(shè)備。他們通過命令的形式實(shí)現(xiàn)各種功能,而這些命令都是各子類所特有的。在USB進(jìn)行數(shù)據(jù)傳輸?shù)臅r(shí)候,這些命令都被打包成一系列的命令包進(jìn)行傳輸。真正與Mass Storage的傳輸方式相關(guān)的是其傳輸協(xié)議,在這里為BULK-ONLY傳輸協(xié)議。有關(guān)Mass Storage類的標(biāo)準(zhǔn)描述符在傳輸協(xié)議中實(shí)現(xiàn)。
FAT文件系統(tǒng)層可以由CH375的U盤文件級子程序庫實(shí)現(xiàn)。該子程序庫提供了USB存儲(chǔ)設(shè)備的文件級接口,這些應(yīng)用層接口API包含了常用的文件級操作,可以移植并嵌入到SM5964單片機(jī)程序中。CH375的U盤文件級子程序庫具有以下特性:支持常用的FAT16和FAT32文件系統(tǒng),磁盤容量可達(dá)100GB以上,支持多級子目錄,支持8.3格式的大寫字母文件名,支持文件打開、新建、刪除、讀寫以及搜索等。
綜上所述,分層次程序段示例如下:
#define UINT8 unsigned char
#define UINT16 unsigned short
#define UINT32 unsigned long
#define UINT8X unsigned char xdata
#define UINT8VX unsigned char volatile xdata
UINT8VX CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */
UINT8VX CH375_DAT_PORT _at_ 0xBCF0; /* CH375數(shù)據(jù)端口的I/O地址 */
#define CH375_INT_WIRE INT0 /* P3.2, 連接CH375的INT#引腳,用于查詢中斷狀態(tài) */
UINT8X DISK_BUFFER[512*32] _at_ 0x0000; /* 外部RAM數(shù)據(jù)緩沖區(qū)的起始地址 */
UINT32 DiskStart; /* 邏輯盤的起始絕對扇區(qū)號LBA */
UINT8 SecPerClus; /* 邏輯盤的每簇扇區(qū)數(shù) */
UINT8 RsvdSecCnt; /* 邏輯盤的保留扇區(qū)數(shù) */
UINT16 FATSz16; /* FAT16邏輯盤的FAT表占用的扇區(qū)數(shù) */
/* ********** 硬件USB接口層*/
void mDelaymS( UINT8 delay ) {
UINT8 i, j, c;
for ( i = delay; i != 0; i -- ) {
for ( j = 200; j != 0; j -- ) c + = 3;
for ( j = 200; j != 0; j -- ) c + = 3;
}
}
void CH375_WR_CMD_PORT( UINT8 cmd ) { /* 向CH375的命令端口寫入命令 */
CH375_CMD_PORT=cmd;
for ( cmd = 2; cmd != 0; cmd -- ); /* 發(fā)出命令碼前后應(yīng)該各延時(shí)2uS */
}
void CH375_WR_DAT_PORT( UINT8 dat ) { /* 向CH375的數(shù)據(jù)端口寫入數(shù)據(jù) */
CH375_DAT_PORT=dat; /* 因?yàn)閱纹瑱C(jī)較慢所以實(shí)際上無需延時(shí) */
}
UINT8 CH375_RD_DAT_PORT( void ) { /* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù) */
return( CH375_DAT_PORT ); /* 因?yàn)閱纹瑱C(jī)較慢所以實(shí)際上無需延時(shí) */
}
UINT8 mWaitInterrupt( void ) { /* 等待CH375中斷并獲取狀態(tài),返回操作狀態(tài) */
while( CH375_INT_WIRE ); /* 查詢等待CH375操作完成中斷(INT#低電平) */
CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷,獲取中斷狀態(tài) */
return( CH375_RD_DAT_PORT( ) );
}
/* ********** BulkOnly傳輸協(xié)議層,被CH375內(nèi)置了,無需編寫單片機(jī)程序 */
/* ********** RBC/SCSI命令層,雖然被CH375內(nèi)置了,但是要寫程序發(fā)出命令及收發(fā)數(shù)據(jù) */
UINT8 mInitDisk( void ) { /* 初始化 */
UINT8 Status;
CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷, 獲取中斷狀態(tài) */
Status = CH375_RD_DAT_PORT( );
if ( Status == USB_INT_DISCONNECT ) return( Status ); /* USB設(shè)備斷開 */
CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存儲(chǔ)器 */
Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */
if ( Status != USB_INT_SUCCESS ) return( Status ); /* 出現(xiàn)錯(cuò)誤 */
CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 獲取USB存儲(chǔ)器的容量 */
Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */
if ( Status != USB_INT_SUCCESS ) { /* 出錯(cuò)重試 */
mDelaymS( 250 );
CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 獲取USB存儲(chǔ)器的容量 */
Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */
}
if ( Status != USB_INT_SUCCESS ) return( Status ); /* 出現(xiàn)錯(cuò)誤 */
return( 0 ); /* U盤已經(jīng)成功初始化 */
}
UINT8 mReadSector( UINT32 iLbaStart, UINT8 iSectorCount, UINT8X *oDataBuffer )
{
UINT16 mBlockCount;
UINT8 c;
CH375_WR_CMD_PORT( CMD_DISK_READ ); /* 從USB存儲(chǔ)器讀數(shù)據(jù)塊 */
CH375_WR_DAT_PORT( (UINT8)iLbaStart ); /* LBA的最低8位 */
CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 8 ) );
CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 16 ) );
CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 24 ) ); /* LBA的最高8位 */
CH375_WR_DAT_PORT( iSectorCount ); /* 扇區(qū)數(shù) */
for ( mBlockCount = iSectorCount * 8; mBlockCount != 0; mBlockCount -- ) {
c = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */
if ( c == USB_INT_DISK_READ ) { /* 等待中斷并獲取狀態(tài),請求數(shù)據(jù)讀出 */
CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從CH375緩沖區(qū)讀取數(shù)據(jù)塊 */
c = CH375_RD_DAT_PORT( ); /* 后續(xù)數(shù)據(jù)的長度 */
while ( c -- ) *oDataBuffer++ = CH375_RD_DAT_PORT( );
CH375_WR_CMD_PORT( CMD_DISK_RD_GO ); /* 繼續(xù)執(zhí)行USB存儲(chǔ)器的讀操作 */
}
else break; /* 返回錯(cuò)誤狀態(tài) */
}
if ( mBlockCount == 0 ) {
c = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */
if ( c== USB_INT_SUCCESS ) return( 0 ); /* 操作成功 */
}
return( c ); /* 操作失敗 */
}
FAT文件系統(tǒng)層的程序量較大,主要包括下列函數(shù): mIdenDisk,識別分析當(dāng)前邏輯盤;mLinkCluster,獲得指定簇號的鏈接簇,輸入:當(dāng)前簇號, 返回:原鏈接簇號, 如果為0則說明錯(cuò)誤;mStopIfError,若錯(cuò)誤則停止運(yùn)行并顯示錯(cuò)誤狀態(tài),等等,在此不予詳述。
2 工作流程
基于嵌入式USB主機(jī)的交通監(jiān)測儀的工作流程見圖5:
圖 5 工作流程圖
在實(shí)際測試中,將采集到的環(huán)境參數(shù)以“.txt”方式存儲(chǔ),目標(biāo)盤為64M和128M的U盤,成功存入自定的文件“Data.txt”,支持文件續(xù)寫和重定義文件名,并可在PC中打開該文件,也可以直接用上層測控軟件進(jìn)行進(jìn)一步的處理。
3 結(jié)束語
本系統(tǒng)設(shè)計(jì)充分體現(xiàn)了便攜,可靠,實(shí)用的優(yōu)點(diǎn),可為城市環(huán)境規(guī)劃提供充分的數(shù)據(jù)參考。隨著進(jìn)一步的實(shí)際應(yīng)用,仍然有改進(jìn)的余地,如可以擴(kuò)展多路傳感器,測量如包括氣壓、二氧化碳濃度等其他環(huán)境參數(shù);相應(yīng)地,提高存儲(chǔ)容量;還可以考慮構(gòu)建區(qū)域服務(wù)器以增加效率等等。
參考文獻(xiàn):
[1] 馬偉 計(jì)算機(jī)USB系統(tǒng)原理及其主從機(jī)設(shè)計(jì) 北京:北京航空航天大學(xué)出版社,2004,94~98
[2] 張慧 USB ON-THE-GO技術(shù)及應(yīng)用 工業(yè)控制計(jì)算機(jī)學(xué)報(bào),2005,18,10
[3] 嵌入式USB-HOST解決方案[DB/OL] http://www.broadmaking.com,2002,6