您现在的位置: 范文先生网 >> 理工论文 >> 电子通信论文 >> 正文

基于8位微控制器控制硬盘进行HDTV码流读写

时间:2007-1-20栏目:电子通信论文

>

本系统没有引入操作系统和文件格式,所以码流文件存入硬盘时就不能按文件格式,而只能按二进制流的方式从PC机的码流文件中读出数据,再按同样的方式写入裸盘。为了解决码流的总是,试图调用BIOS中断,让BIOS的硬盘服务流程负责把INT13的读写请求转化为ATA界面对硬盘的请求,并执行数据I/O传输的物理动作。但由于BIOS本身寄存器的限制,用它去访问硬盘有8.4G容限的问题。如果想突破这个限制而用扩展的INT13,将是一个比较复杂的过程。可以利用PC机上的Secondary IDE Channel(0x170~0x177)作为硬盘寄存器的端口地址。在这个硬件平台下,可以直接将fread()函数读出的码流按块写入目标硬盘,甚至不要求大多地考虑时序问题。

4.2.2 读码流部分

这部分软件是在上述硬件系统平台上直接编程。系统在启动硬盘前要等待串行中断,接收由前面板发出的命令,再根据接收的数据信息具体决定应该播放哪几个节目;随后对硬盘、FIFO进行初始化,启动CPLD,FIFO输出数据时钟信号,并让硬盘按命令输出数据流。数据在总线稳定的时间内给FIFO写时钟,以采集正确的码流信息(这里强调时序)。FIFO有“半满”(HF)标志,用HF去触发中断,有中断请求,就让硬盘输出64KB的数据。如此循环,保证FIFO不空。当FIFO输出第一个数据时,CPLD开始对数据流进行拆分,并按照HDTV码流的格式标准对数据流进行判别(HDTV码流188字节为一个包,每个包头是0x47),即每计数1次,就输出一个比特同步,每计数188次并识别下一个数为0x47,就输出一个包同步。这部分程序流程如图3。
IP基于8位微控制器控制硬盘进行HDTV码流读写
    4.2.3 应用程序

系统设置硬盘寄存器参数时,首先调用SetMode()函数设定硬盘的IDLE状态和自掉电功能,可以保证硬盘在不工作的情况下,磁头会复位到“登陆区”;然后调用SetAdress()函数选择对应的寄存器;接下来可以调用ReadSector()函数进行多扇区读操作。以下是寄存器选择子函数和多扇区读子函数。

//寄存器选择子函数;

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;

}

}

//多扇区读子函数:

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(CM

上一页  [1] [2] [3] [4] [5] 下一页

下页更精彩:1 2 3 4 下一页