謝冬季,繆賢浩
(湖北理工學(xué)院 計算機(jī)學(xué)院,湖北 黃石 435003)
隨著電子工業(yè)的蓬勃發(fā)展,計算機(jī)技術(shù)也逐步快速發(fā)展起來,尤其是微型單片機(jī)技術(shù)的發(fā)展,使人們?nèi)粘I罡臃奖?大到工業(yè)控制,小到家用電器都有單片機(jī)的影子[1],MP3播放器也不例外。采用AT89C51SND1C單片機(jī)和存儲芯片K9F5608設(shè)計MP3播放器的U盤模塊,后期可以根據(jù)需要進(jìn)一步擴(kuò)展MP3播放器模塊。本設(shè)計是將USB接口與電腦連接,通過電腦完成K9F5608存儲芯片的讀寫操作,最終實現(xiàn)U盤的存儲功能。
硬件系統(tǒng)由AT89C51SND1C單片機(jī)、Flash K9F5608存儲芯片、RS232調(diào)試接口、USB接口和電源穩(wěn)壓升壓電路組成。AT89C51SND1C芯片包括MP3音頻解碼器、音頻輸出接口、通用串行總線接口、外插閃存卡接口、IDE/ATAH接口、串行外設(shè)接口、雙線控制器、A/D控制器接口等模塊[2]。其中AT89C51SND1C單片機(jī)包含了通用串行總線接口模塊,因此大大簡化了U盤模塊設(shè)計的難度,為后期擴(kuò)展MP3功能提供了條件;而Flash K9F5608存儲芯片是非線性Nand Flash芯片,只有8位復(fù)位線,硬件接口比較簡單,因此減小了電路設(shè)計的復(fù)雜度。綜合考慮以上因素,本設(shè)計選用上述硬件系統(tǒng)實現(xiàn)存儲模塊的功能[3]。
主控電路如圖1所示。主控電路實現(xiàn)控制存儲芯片的讀寫以及USB通信。其中USBD+、USBD-引腳是USB接口的數(shù)據(jù)線,AD0~AD7引腳與存儲芯片IO口相連。
圖1 主控電路
存儲電路如圖2所示。圖2中AD0到AD7為8位地址復(fù)用線,可分時傳輸?shù)刂?,同時其也是數(shù)據(jù)傳輸線路,與AT89C51SND1C控制器中的AD0~AD7 相連接。FCLE為指令鎖存允許線,F(xiàn)ALE為地址鎖存允許線,F(xiàn)CE為芯片啟用線,nRD為讀激活線,nWR為寫激活線。
圖2 存儲電路
軟件系統(tǒng)共分為4個模塊:主控程序模塊、UART通信模塊、U盤控制程序模塊和Flash讀寫模塊。
主控程序模塊是通過檢測USB_INS(P3.4) 的電平來決定是否執(zhí)行U盤功能以及是否進(jìn)行對U盤程序的初始化工作,之后開始循環(huán)執(zhí)行對應(yīng)的功能。主控程序流程圖如圖3所示。
圖3 主控程序流程圖
UART通信模塊是常規(guī)的經(jīng)典設(shè)計模塊,主要用于程序調(diào)試時幫助設(shè)計者了解程序的運(yùn)行狀態(tài)[4]。
USB存儲的工作流程如下:插入U盤后,USB主機(jī)發(fā)出USB標(biāo)準(zhǔn)請求,USB設(shè)置相應(yīng)的返回設(shè)備描述符等,主機(jī)獲取設(shè)備相關(guān)信息后開始配置,U盤被主機(jī)確定為Bulk-Only的存儲設(shè)備,再進(jìn)入Bulk-Only傳輸模式,U盤控制程序流程圖如圖4所示。U盤控制程序具體實現(xiàn)步驟如下:
1)首先對單片機(jī)的USB硬件進(jìn)行設(shè)置,其中包括時鐘設(shè)置和使能USB部件設(shè)置。然后設(shè)置2個批量傳輸端點(diǎn),對FIFO緩沖區(qū)進(jìn)行復(fù)位操作,允許相應(yīng)端點(diǎn)中斷。
2)對AT89C51SND1C單片機(jī)的USBADDR寄存器中的FEN位初始化置為1,允許其對默認(rèn)地址的配置過程進(jìn)行響應(yīng)。開始進(jìn)入配置階段,配置階段即主機(jī)向設(shè)備索取各種描述符的過程。
3)當(dāng)設(shè)備收到主機(jī)的請求后,會觸發(fā)端點(diǎn)中斷寄存器中的端點(diǎn)0對應(yīng)的位,此時讀取端點(diǎn)0的數(shù)據(jù)。接著對照USB標(biāo)準(zhǔn)設(shè)備請求的數(shù)據(jù)格式進(jìn)行識別,轉(zhuǎn)向相應(yīng)的請求處理函數(shù)。
4)USB配置完成后,即可開始處理Bulk-Only傳輸中的SCSI-2命令解析。Bulk傳輸方式下有3種類型的數(shù)據(jù)在USB和設(shè)備之間傳送,分別是命令塊包、命令狀態(tài)包和普通數(shù)據(jù)包。同時主機(jī)會向設(shè)備發(fā)出Inquiry、Read Capacity、Mode Sense這幾個命令來告知主機(jī)設(shè)備存儲器的具體情況,以創(chuàng)建一個可移動的存儲設(shè)備。程序中要根據(jù)SCSI-2命令集中的幾個命令返回參數(shù),例如需要使用2個連續(xù)的奇偶Block作為緩沖區(qū)等,其中填充了和Flash邏輯結(jié)構(gòu)相關(guān)的參數(shù)。
圖4 U盤控制程序流程圖
對Flash芯片的讀過程是設(shè)置UEPNUM=0×01,即處理Bulk-In端點(diǎn)請求,需要注意USB每次可傳輸512 B的數(shù)據(jù),但端點(diǎn)1只能傳送64 B,所以共需要8次端點(diǎn)傳輸才能完成1次USB傳輸任務(wù)。數(shù)據(jù)傳輸完畢后返回CSW數(shù)據(jù)結(jié)構(gòu)。Flash芯片寫與讀操作的不同在于,寫Flash芯片必須先擦除再編程,并且每次至少擦除1個塊,所以在程序中需要使用2個連續(xù)的奇偶Block作為緩沖區(qū)。對U盤寫模塊的設(shè)計可以分為如下幾個步驟[5]:
1)指定2個連續(xù)的奇偶Block作為緩沖區(qū)的塊擦除。
2)從命令塊包中的命令塊獲取起始邏輯塊號和長度,用來計算第M個塊內(nèi)的第N個頁號。
3)指定端口2,如果N>0,即將第M個塊中從0到N-1的所有頁號都復(fù)制到緩沖區(qū)中。
4)計算M和N。如果數(shù)據(jù)長度為0,則寫U盤過程完畢。若數(shù)據(jù)長度不為0,則從USB端點(diǎn)接收數(shù)據(jù)同時寫入緩沖區(qū)的第N個頁,數(shù)據(jù)長度減1。
5)如果緩沖區(qū)沒有寫滿,則起始邏輯塊加1,重新計算M和N;如果緩沖區(qū)已寫滿,即將第M個塊中從第N+1到本塊的最后一頁都復(fù)制到對應(yīng)緩沖區(qū)中,同時擦除第M個Block,將緩沖區(qū)所有頁復(fù)制到第M個塊中,然后返回步驟4繼續(xù)進(jìn)行計算。通過以上幾個步驟即可完成基于AT89C51SND1C單片機(jī)MP3播放器的U盤模塊設(shè)計。
利用AT89C51SND1C單片機(jī)和Flash K9F5608存儲芯片設(shè)計MP3播放器的U盤模塊,可以明顯降低開發(fā)成本和提高開發(fā)效率。該電路設(shè)計實現(xiàn)快捷方便,軟件實現(xiàn)結(jié)構(gòu)清晰,可以作為U盤設(shè)計開發(fā)的首選方案之一。
參考文獻(xiàn)
[1] 郭天祥.新概念51單片機(jī)C語言教程[M].北京:電子工業(yè)出版社,2009:21-31.
[2] 鄭鋒.51單片機(jī)典型應(yīng)用開發(fā)范例大全[M].北京:中國鐵道出版社,2011:22-26.
[3] 鄒彥.DSP原理以及應(yīng)用[M].北京:電子工業(yè)出版社,2012:6-15.
[4] 胡漢才.單片機(jī)原理及系統(tǒng)設(shè)計[M].北京:清華大學(xué)出版社,2002:359-442.
[5] 張景璐,于京,馬澤民.51單片機(jī)項目教程[M].北京:人民郵電出版社,2010:121-139.