基于8位微控制器控制硬盘进行HDTV码流读写
本系统没有引入操作系统和文件格式,所以码流文件存入硬盘时就不能按文件格式,而只能按二进制流的方式从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
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
- 上一篇论文: 带USB和智能读卡器接口的C51微控制器
- 下一篇论文: 基于80C166单片机PEC服务的PROFIBUS-FDL从站协议实现