新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于8位微控制器控制硬盤進(jìn)行HDTV碼流讀寫

基于8位微控制器控制硬盤進(jìn)行HDTV碼流讀寫

作者: 時間:2008-05-08 來源:網(wǎng)絡(luò) 收藏

摘要:介紹用C8051F015微碼流存取的高清碼流回放機(jī)的硬件設(shè)計和軟件編程。該系統(tǒng)作為解碼器的前端,可以實現(xiàn)碼流的適時回放。 關(guān)鍵詞: 碼流 ATA/ATAPI-4標(biāo)準(zhǔn) LBA模式 CPLD

隨著HDTV在全球的興起以及數(shù)字技術(shù)的日趨成熟,音/視頻產(chǎn)品數(shù)字化、高清晰度化已成為未來家電視聽產(chǎn)品的大趨勢。高清晰度電視HDTV(High-Definition Television)采用了國際上流行的MPEG-2標(biāo)準(zhǔn),MPEG-2規(guī)定了數(shù)字圖像的音視頻編解碼算法以及傳送的碼流應(yīng)該符合的語法和語義,而其編解碼算法又參考了聽覺心理模型和視覺心理模型。HDTV的圖像格式為19201080I,傳輸碼率高達(dá)20Mbps,同時采用的視頻壓縮技術(shù)可使HDTV的每一幀包含更多的信息,大大提高圖像的清晰度。HDTV在音頻壓縮方面采用了數(shù)字音頻的編碼和壓縮技術(shù),現(xiàn)有的數(shù)字音頻編碼壓縮方案有MPEG、Dolby AC-3和美國ATT的MPAC以及歐洲的MIX。它們都能實現(xiàn)5.1聲道,其聲道數(shù)可以擴(kuò)展到5.1,即三個前面的聲道(L、C、右聲道R)、兩個環(huán)繞聲道(左環(huán)繞聲道Ls、右環(huán)繞聲道Rs)和一個低音效果聲道LFE,使聲音效果可以達(dá)到家庭影院的音響效果。HDTV聲光效果上優(yōu)勢,注定它的發(fā)展有著技術(shù)和市場的雙重必然性。為了配合HDTV及相關(guān)技術(shù)產(chǎn)品的推廣,筆者開發(fā)了一個既可以作為MPEG解碼器信號源,又可以作為信道編碼/調(diào)制器信號源的碼流回放機(jī),應(yīng)用于數(shù)字電視產(chǎn)品的開發(fā)、生產(chǎn)調(diào)試及展示宣傳。

HDTV節(jié)目有傳輸碼率高、節(jié)目信息最大的特點(diǎn)。為了研制出符合大容量高速率要求的碼流回放機(jī),傳統(tǒng)的方法是用操作系統(tǒng)操作。這樣做的好處在于:首先,PC機(jī)的主頻很高,用來作為控制碼流的時鐘信號在速度上不會有瓶頸問題;其次,對里HDTV節(jié)目的讀取是文件系統(tǒng)的,研發(fā)人員不用寫硬盤的驅(qū)動程序,軟件的工作量大大減小。但是,就碼流回放機(jī)本身而言,它是一個單任務(wù)設(shè)備,采用操作系統(tǒng)的方案無疑將造成CPU資源的極大浪費(fèi)。因此,筆者設(shè)想用單片機(jī)或DSP控制硬盤的操作。只要所選微上速度上滿足高清晰度電視的碼率要求,在技術(shù)上就能夠?qū)崿F(xiàn)預(yù)期的功能。與操作系統(tǒng)方案相比較,用微無疑可以大大降低生產(chǎn)成本,同時也降低了硬件設(shè)計的難度。不過,在這種方式下,需要編寫硬盤的底層驅(qū)動程序。

圖1 C8051F015內(nèi)部結(jié)構(gòu)

1 總體方案

華天HTTS HDTV第III代碼流回放機(jī)可以播放數(shù)字高清晰度電視HDTV碼流。該碼泫回放機(jī)整體設(shè)計沒有采用在工控機(jī)上研發(fā)PCI卡驅(qū)動硬盤的方案,而是遵照AT Attachment with Packet Interface Extension(ATA/ATAPI-4)標(biāo)準(zhǔn),用8位單片機(jī)C8051F015通過PIO方式按照LBA模式直接對硬盤物理級的操作。硬盤接收微控制器的命令后按照邏輯地址順序輸出HDTV碼流給兩片F(xiàn)IFO,硬盤輸出的16位數(shù)據(jù)通過兩片8位FIFO緩存后輸出給CPLD拆分以識別包同步和字節(jié)同步。經(jīng)CPLD解析后的數(shù)據(jù)流再經(jīng)過解碼器解碼及適當(dāng)后處理,送顯示器、揚(yáng)聲器以提供視頻、音頻信號。既可以作為MPEG解碼器的信號源,又可以作為信道編碼/調(diào)制器的信號源。

2 C8051F015內(nèi)部結(jié)構(gòu)

C8051F015的內(nèi)部結(jié)構(gòu)如圖1所示。它使用了CYGNAL的專利――CIP-51微控制器內(nèi)核CIP-51。CIP-51與MCS-51的指令集完全兼容,可以使用標(biāo)準(zhǔn)803x/805x的匯編器和編譯器進(jìn)行軟件開發(fā)。同時,CIP-51采用流水線結(jié)構(gòu),70%的指令執(zhí)行時間為1或2個系統(tǒng)時鐘周期,外部晶振最大可以到25MHz。8位HDTV輸出碼流的標(biāo)準(zhǔn)時鐘頻率為19MHz和25MHz??紤]到硬盤的輸出是16位,理論上采用這款MCU完全可以達(dá)到速度要求。這里,就系統(tǒng)的初始化問題有幾點(diǎn)說明:(1)內(nèi)外部晶振切換。在外部晶體振蕩器被允許時,系統(tǒng)晶體驅(qū)動器的輸出端XTAL2腳會出現(xiàn)一個瞬時脈沖,該脈沖足以在晶體實際啟動前,將OSCXCN寄存器中的XTLVLD位置1。在允許晶體振蕩器和檢查XTLVLD位之間引入1ms的延時,可以防止提前切換到外部晶振。(2)配置交叉開關(guān)。系統(tǒng)內(nèi)部交叉開關(guān)根據(jù)優(yōu)先權(quán)譯碼表將所選擇的內(nèi)部數(shù)字資源分配到I/O引腳,寄存器XBR0、XBR1、XBR2用于選擇內(nèi)部數(shù)字功能或讓I/O引腳默認(rèn)為I/O端口。I/O引腳的輸出驅(qū)動器特性用端口配置寄存器PRT0CF、PRT1CF、PRT2CF和PRT3CF定義。每個端口輸出驅(qū)動器都可被配置為漏極開路或推挽方式。將配置寄存器的相應(yīng)位配置為漏極開路,并在外部加1kΩ的上拉電阻,可用3.3V供電的C8051F015去驅(qū)動5V供電的硬盤。初始化程序:

void sysclk_init(void)

{WDTCH=0xde; //禁止看門狗定時器

WDTCN=0xad;

//啟動外部振蕩器

OSCXCN=0x67; //外接24MHz的晶振

//配置外部晶體

while((OSCXCNXTLVLD_BIT= =0)

{}

OSCICN=0x88; //選擇外部振蕩器作為系統(tǒng)時鐘,禁止內(nèi)部振蕩

}

//配置交叉開關(guān)

void xbar_init(void)

{XBR0=0x04; //RX TX連到兩個引腳

XBR1=0x04; //INT0連到斷口引腳

XBR2=0x40; //使能交叉開關(guān)和弱上拉

PRT0CF=0xff; //控制FIFO讀寫,使能

PRT1CF=0x07; //控制CPLD讀寫,使能

PRT2CF=0x00; (P0口的所有輸出為弱上拉(寫硬盤命令字)

PRT3CF=0x00; //控制硬盤讀寫,使能

}

3 ATA/ATAPI-4標(biāo)準(zhǔn)下的硬盤內(nèi)部寄存器和PIO讀時序關(guān)系

3.1 硬盤內(nèi)部寄存器

目前,大部分計算機(jī)配置了兩個IDE接口,地址范圍分別為:0170~0117,0376~0376(對應(yīng)PC機(jī)的Secondary IDE Channel)和01F0~01F6,03F6~03F6(對應(yīng)PC機(jī)的Primary IDE Channel)。地址譯碼如表1所示。

表1 地址譯碼

數(shù)據(jù)寄存器(170R/W):這是一個16位PIO數(shù)據(jù)寄存器,用于對扇區(qū)的讀、寫和格式化操作。MCU通過該寄存器向硬盤控制寄存器寫入或從硬盤控制器讀出扇區(qū)緩沖區(qū)的數(shù)據(jù)。

錯誤寄存器(171R):該寄存器是一個8位的寄存器,它反映控制寄存器在診斷方式或操作方式下的錯誤原因。

扇區(qū)數(shù)寄存器(172R/W):它記錄讀、寫命令的扇區(qū)數(shù)。當(dāng)多扇區(qū)傳輸時,每完成一個扇區(qū)操作,該寄存器自動減1,直至為0。如果初值為0,則表示256;如果有錯誤生,該寄存器包含已經(jīng)操作成功的扇區(qū)數(shù)。

扇區(qū)號寄存器(173R/W):它記錄讀、寫和校驗命令指令起始扇區(qū)號。本文用LBA模式。該寄存器記錄邏輯扇區(qū)的0字節(jié)。

柱面號寄存器(174 175 R/W):它記錄讀、寫、校驗、尋址和格式化命令指定的柱面號,在LBA尋址方式下,這2個寄存器包含起始扇區(qū)的1和2字節(jié)。

驅(qū)動器/磁頭寄存器(176R/W):它記錄讀、寫、校驗、尋道和格式化命令指定的驅(qū)動器號、磁頭號和尋址方式。在ATA/ATAPI-4中其定義如表2所示。

表2 驅(qū)動器/磁頭寄存器在ATA/ATAPI-4中的定義

HS0~HS3(磁頭選擇):在LBA方式中,是邏輯扇區(qū)的高4位。

DEV驅(qū)動器選擇:0選擇主驅(qū)動器,1選擇從驅(qū)動器。

L(LBA方式):L=1,置驅(qū)動器為LBA模式;L=0,置驅(qū)動器為CHS模式。

狀態(tài)寄存器(177 R);反映了硬盤執(zhí)行命令后的狀態(tài)。讀該寄存器清除中斷請求信號,為避免清除中斷,可以讀輔助狀態(tài)寄存器376h。這兩個寄存器的內(nèi)容完全一樣。在ATA/ATAPI-4中其定義如表3所示。

BSY:驅(qū)動器忙。

DRDY:驅(qū)動器準(zhǔn)備好。

DRQ:請求服務(wù),驅(qū)動器請求通過寄存器與處理器交換一個字節(jié)數(shù)據(jù)。

ERR:命令執(zhí)行錯誤。

3.2 硬盤PIO方式下特定區(qū)域多扇區(qū)讀的操作

如果想從硬盤的特定扇區(qū)讀出碼流信息,首先主機(jī)(C8051F015)要對驅(qū)動器/磁頭寄存器、柱面號寄存器、扇區(qū)號寄存器、扇區(qū)數(shù)寄存器設(shè)置參數(shù)。完畢后要等待至少400ns才能去讀狀態(tài)寄存器的參數(shù)判斷以上設(shè)置是否有效。硬盤接收命令后置BSY=1,并開始執(zhí)行命令。硬盤如果準(zhǔn)備好傳送數(shù)據(jù)包,就置DRQ=1,同時清零BSY。當(dāng)機(jī)循環(huán)讀狀態(tài)寄存器或輔助狀態(tài)寄存器判斷BSY=0DRQ=1,一旦硬盤狀態(tài)符合要求,主機(jī)寫參數(shù)0x80(128扇區(qū))到數(shù)據(jù)寄存器(0x170),并寫0x20(PIO讀)到命令寄存器(0x177),表示要求讀出硬盤相應(yīng)地址里的數(shù)據(jù)塊。硬盤判斷數(shù)據(jù)寄存器被置數(shù)后立即置BSY=1DRQ=0。主機(jī)讀到置位信息后給硬盤讀時鐘,硬盤輸出數(shù)據(jù)直到數(shù)據(jù)包傳完為止。

表3 狀態(tài)寄存器在ATA/ATAPI-4中的定義

4 系統(tǒng)設(shè)計方案

4.1 系統(tǒng)硬件構(gòu)成

8位微控制器的系統(tǒng)設(shè)計方案如圖2所示。主系統(tǒng)中以C8051F015為控制核心,C8051F015產(chǎn)生硬盤和FIFO的讀寫時序(為了避免硬盤寄存器參數(shù)也被寫入FIFO,在硬件上要把二者的讀寫時鐘分開。);硬盤輸出的16位數(shù)據(jù)分離低8位分別送入兩片64KB的FIFO緩存。數(shù)據(jù)經(jīng)緩存后持續(xù)地輸出到CPLD,CPLD對16位數(shù)據(jù)流進(jìn)行拆分,同時識別包同步和字節(jié)同步。這樣,原始的一路HDTV碼流就被分成3路輸送給解碼器解碼。主系統(tǒng)通過串行總線與前面板相連,采用通用單片機(jī)AT89C51為前面板的控制核心。AT89C51接收來自鍵盤的命令并在LCD上以文字和圖形的方式展現(xiàn)在用戶面前,同時通過串口通信,啟動主控制器執(zhí)行命令。

4.2 系統(tǒng)軟件設(shè)計

4.2.1 存碼流部分

本系統(tǒng)沒有引入操作系統(tǒng)和文件格式,所以碼流文件存入硬盤時就不能按文件格式,而只能按二進(jìn)制流的方式從PC機(jī)的碼流文件中讀出數(shù)據(jù),再按同樣的方式寫入裸盤。為了解決碼流的總是,試圖調(diào)用BIOS中斷,讓BIOS的硬盤服務(wù)流程負(fù)責(zé)把INT13的讀寫請求轉(zhuǎn)化為ATA界面對硬盤的請求,并執(zhí)行數(shù)據(jù)I/O傳輸?shù)奈锢韯幼?。但由于BIOS本身寄存器的限制,用它去訪問硬盤有8.4G容限的問題。如果想突破這個限制而用擴(kuò)展的INT13,將是一個比較復(fù)雜的過程??梢岳肞C機(jī)上的Secondary IDE Channel(0x170~0x177)作為硬盤寄存器的端口地址。在這個硬件平臺下,可以直接將fread()函數(shù)讀出的碼流按塊寫入目標(biāo)硬盤,甚至不要求大多地考慮時序問題。

4.2.2 讀碼流部分

這部分軟件是在上述硬件系統(tǒng)平臺上直接編程。系統(tǒng)在啟動硬盤前要等待串行中斷,接收由前面板發(fā)出的命令,再根據(jù)接收的數(shù)據(jù)信息具體決定應(yīng)該播放哪幾個節(jié)目;隨后對硬盤、FIFO進(jìn)行初始化,啟動CPLD,F(xiàn)IFO輸出數(shù)據(jù)時鐘信號,并讓硬盤按命令輸出數(shù)據(jù)流。數(shù)據(jù)在總線穩(wěn)定的時間內(nèi)給FIFO寫時鐘,以采集正確的碼流信息(這里強(qiáng)調(diào)時序)。FIFO有“半滿”(HF)標(biāo)志,用HF去觸發(fā)中斷,有中斷請求,就讓硬盤輸出64KB的數(shù)據(jù)。如此循環(huán),保證FIFO不空。當(dāng)FIFO輸出第一個數(shù)據(jù)時,CPLD開始對數(shù)據(jù)流進(jìn)行拆分,并按照HDTV碼流的格式標(biāo)準(zhǔn)對數(shù)據(jù)流進(jìn)行判別(HDTV碼流188字節(jié)為一個包,每個包頭是0x47),即每計數(shù)1次,就輸出一個比特同步,每計數(shù)188次并識別下一個數(shù)為0x47,就輸出一個包同步。這部分程序流程如圖3。
IP
4.2.3 應(yīng)用程序

系統(tǒng)設(shè)置硬盤寄存器參數(shù)時,首先調(diào)用SetMode()函數(shù)設(shè)定硬盤的IDLE狀態(tài)和自掉電功能,可以保證硬盤在不工作的情況下,磁頭會復(fù)位到“登陸區(qū)”;然后調(diào)用SetAdress()函數(shù)選擇對應(yīng)的寄存器;接下來可以調(diào)用ReadSector()函數(shù)進(jìn)行多扇區(qū)讀操作。以下是寄存器選擇子函數(shù)和多扇區(qū)讀子函數(shù)。

//寄存器選擇子函數(shù);

void SetAddress(unsigned char cs,unsigned char adr){

DA0=((adr 0x01)= =0x01;

DA1=((adr 0x02) = =0x02);

DA2=((adr 0x04) = =0x04);

if(cs= =CTRL) {

nCS1FX=1;

nCS3FX=0;

}else {

nCS1FX=0;

nCS3FX=1;

}

}

//多扇區(qū)讀子函數(shù):

unsigned char ReadSector(unsigned long point,unsigned char *Buffer){

unsigned int i,k;

WriteBYTE(CMD,6,0xe0); //LBA模式

WriteBYTE(CMD,5,point>>16); //LBA模式下的高16位地址

WriteBYTE(CMD,4,point>>8); //LBA模式下的高8位地址

WriteBYTE(CMD,3,point); //LBA模式下的低8位地址

WriteBYTE(CMD,2,0x80); //一次讀寫的扇區(qū)數(shù)

//Issue read sector command...

WriteBYTE(CMD,7,0x20); //0x20多為扇區(qū)讀命令

Timer 10mSec=10000;

while((ReadBYTE(CMD,7)0x08)!=0x08 Timer 10mSec); //等待DRQ=1或者timeout

if(Timer 10mSec= =0)return 0xFF;

//Fetch the sector...

LSBDATA=ALLINPUT;

//Select address and activate CS

SetAddress(CMD,0);

for(k=0;k0x80;k++)

for(i=0;i512;i+=2){ //一次讀兩字節(jié)

nDIOR=0; //硬盤的讀時鐘

WCK=1;

WCK=0;

nDIOR=1;

}

nCS1FX=1; //復(fù)位CS

nCS3FX=1;

return ReadBYTE(CMD,1); //返回錯誤寄存器的信息

}

本文是“第三代碼流回放機(jī)研制”課題的一個重要組成部分。本方案利用微控制器對硬盤進(jìn)行LBA模式下的讀寫操作(不用操作系統(tǒng)),硬軟件簡潔可靠,技術(shù)上也解決前期產(chǎn)品的兩個難題:

(1)一些舊機(jī)器的BIOS不支持INT 13h Extension,無法訪問8.4G以上硬盤空間;

(2)WINDOWS操作系統(tǒng)不支持存儲1.2G以上碼流文件。

將此系統(tǒng)逆向設(shè)計,能夠研發(fā)出適時錄制TS流和衛(wèi)星節(jié)目的儀器。

上拉電阻相關(guān)文章:上拉電阻原理


評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉