⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ——基于ide硬盘的大容量语音记录仪.htm

📁 mcu读取硬盘的详细资料包括fat及源码
💻 HTM
📖 第 1 页 / 共 3 页
字号:
            由于采用4层PCB线路板设计、表贴工艺和超薄笔记本硬盘,使得基于IDE硬盘的大容量语音记录仪体积如普通电话机大小,可实现对一路电话进行高阻并联录音,并可在本机播放记录语音和远程调度记录语音。<B><BR><BR><A 
            href="http://www.21ic.com/info/images/aet/200304/6a.gif">图1 
            D6571E的典型应用电路<BR></A><BR>1 系统硬件设计</B></P>
            <P style="TEXT-INDENT: 30px">1.1 D6571E芯片</P>
            <P style="TEXT-INDENT: 30px">在本系统中,选择DSP芯片D6571E,其语音压缩算法采用TRUESPEECH 
            Triple Rate 
            Coder。由于该算法的实时运算需要22MIPS以上的运算速度,为此将DSP内核和算法代码集成在D6571E芯片内。D6571E的典型应用电路如图1所示。</P>
            <P 
            style="TEXT-INDENT: 30px">D6571E具有16位宽的总线,但也允许以分时方式使用8位总线,这时CPU须用HI/LO信号表示送到总线上的是高8位还是低8位;当D6571E主动将数据送到总线上时,会发出ACK信号通知CPU读取数据。HSTRD和HSTWR则是读和写的控制线。由于TRUE-SPEECH 
            Triple Rate 
            Coder算法按30ms分帧采样,然后进行分析压缩,因此无论是读取压缩数据还是因送压缩数据,均必须在一帧内完成,否则D6571E会自行进入休眠状态。向D6571E输送语音数据的过程如下:首先送出解压控制命令,然后接收一个回送状态字,状态字中包含了当前帧所需要的字节数,CPU就连续送出规定数目的数据,待一帧处理完毕后,D6571E会继续送出状态字,如此循环就可连续回放语音了。而利用D6571E进行语音压缩的数据处理过程正好相反,状态字中包含的是当前帧压缩所得到的字节数,CPU应连接接收规定数目的数据。</P>
            <P 
            style="TEXT-INDENT: 30px">D6571E芯片具备工业标准的编解码器接口,可直接与串行PCM接口的音频编解码芯片相连,如美国国家半导体的TP3054(μ律)、TP3057(A律)等。本系统设计中音频编解码接口芯片采用了TP3057。TP3057工作所需的同步脉冲、采样时钟、数据信号等只需与D6571E的4根控制线相连即可得到。</P>
            <P 
            style="TEXT-INDENT: 30px">由于D6571E的控制命令很丰富,在大容量语音记录仪的设计中,笔者利用D6571E实现数字音量控制、自动增益控制、变速回放、双音频信号产生和鉴别、来电显示等功能,省去了不少功能芯片、线路板面积,使昨最终设计成型的大容量语音记录仪体积如普通电话机大小。</P>
            <P style="TEXT-INDENT: 30px">1.2 IDE硬盘的控制</P>
            <P 
            style="TEXT-INDENT: 30px">利用单片机控制现有的硬盘,可极大地提高系统的性能价格比,因此本系统采用单片机控制硬盘进行语音数据的存储。<BR><BR><B><A 
            href="http://www.21ic.com/info/images/aet/200304/6b.gif">图2 
            DK23AA-60硬盘引脚及定义</A></B><BR><BR>&nbsp;&nbsp;&nbsp; <SPAN 
            class=main1>IDE接口的硬盘驱动器提供了两种数据传输模式:PIO模式和DMA模式。由于PIO模式控制相对容易,提供了一种编程控制输入/输出的快速传输方法。该模式采用高速的数据块I/O,以扇区为单位,用中断请求方式与CPU进行批量数据交换。在扇区读写操作时,一次按16位长度通过内部的高速PIO数据寄存器传输。通常情况下,数据传输以扇区为单位,每传输一扇区数据产生一个中断。由于本系统语音压缩数据的最大速率只有9.6kbps,而相关资料报道采用PIO写盘速度可以达到192kbps,完全可以满足本系统的要求。</P>
            <P 
            style="TEXT-INDENT: 30px">本系统采用Hitachi(日立)公司DK23AA-60型号的笔记本硬盘。它具有6GB的存储容量,厚度仅有9.6mm,它的引脚及定义如图2所示。</P>
            <P 
            style="TEXT-INDENT: 30px">IDE接口是一种任务寄存器结构的接口,所有输入输出操作均通过对相应寄存器的读写完成。IDE硬盘驱动器中的寄存器及地址分配见表1。表2为状态寄存器,它反映了硬盘驱动器执行命令后的状态。<BR><BR><B>表1 
            IDE硬盘驱动器中的寄存器及地址分配</B></P>
            <TABLE border=1 borderColorDark=#ffffff borderColorLight=#000000 
            width="100%">
              <TBODY>
              <TR class=main>
                <TD align=middle colSpan=5 
                  width="70%">地&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 址</TD>
                <TD align=middle colSpan=2 width="30%">寄存器名及功能</TD></TR>
              <TR class=main>
                <TD align=middle width="14%">CS1FX</TD>
                <TD align=middle width="14%">CS3FX</TD>
                <TD align=middle width="14%">DA2</TD>
                <TD align=middle width="14%">DA1</TD>
                <TD align=middle width="14%">DA0</TD>
                <TD align=middle width="15%">读操作</TD>
                <TD align=middle width="15%">写操作</TD></TR>
              <TR class=main>
                <TD align=middle width="14%">0</TD>
                <TD align=middle width="14%">1</TD>
                <TD align=middle width="14%">0</TD>
                <TD align=middle width="14%">0</TD>
                <TD align=middle width="14%">0</TD>
                <TD align=middle colSpan=2 width="30%">数据寄存器</TD></TR>
              <TR class=main>
                <TD align=middle width="14%">0</TD>
                <TD align=middle width="14%">1</TD>
                <TD align=middle width="14%">0</TD>
                <TD align=middle width="14%">0</TD>
                <TD align=middle width="14%">1</TD>
                <TD align=middle width="15%">错误寄存器</TD>
                <TD align=middle width="15%">特性寄存器</TD></TR>
              <TR class=main>
                <TD align=middle width="14%">0</TD>
                <TD align=middle width="14%">1</TD>
                <TD align=middle width="14%">0</TD>
                <TD align=middle width="14%">1</TD>
                <TD align=middle width="14%">0</TD>
                <TD align=middle colSpan=2 width="30%">扇区数寄存器</TD></TR>
              <TR class=main>
                <TD align=middle width="14%">0</TD>
                <TD align=middle width="14%">1</TD>
                <TD align=middle width="14%">0</TD>
                <TD align=middle width="14%">1</TD>
                <TD align=middle width="14%">1</TD>
                <TD align=middle colSpan=2 width="30%">扇区号寄存器</TD></TR>
              <TR class=main>
                <TD align=middle width="14%">0</TD>
                <TD align=middle width="14%">1</TD>
                <TD align=middle width="14%">1</TD>
                <TD align=middle width="14%">0</TD>
                <TD align=middle width="14%">0</TD>
                <TD align=middle colSpan=2 width="30%">柱面号寄存器:低字节</TD></TR>
              <TR class=main>
                <TD align=middle width="14%">0</TD>
                <TD align=middle width="14%">1</TD>
                <TD align=middle width="14%">1</TD>
                <TD align=middle width="14%">0</TD>
                <TD align=middle width="14%">1</TD>
                <TD align=middle colSpan=2 width="30%">柱面号寄存器:高字节</TD></TR>
              <TR class=main>
                <TD align=middle width="14%">0</TD>
                <TD align=middle width="14%">1</TD>
                <TD align=middle width="14%">1</TD>
                <TD align=middle width="14%">1</TD>
                <TD align=middle width="14%">0</TD>
                <TD align=middle colSpan=2 width="30%">驱动器/磁头寄存器</TD></TR>
              <TR class=main>
                <TD align=middle width="14%">0</TD>
                <TD align=middle width="14%">1</TD>
                <TD align=middle width="14%">1</TD>
                <TD align=middle width="14%">1</TD>
                <TD align=middle width="14%">1</TD>
                <TD align=middle width="15%">状态寄存器</TD>
                <TD align=middle width="15%">命令寄存器</TD></TR></TBODY></TABLE>
            <P style="TEXT-INDENT: 0px"><B>表02 状态寄存器</B></P>
            <TABLE border=1 borderColorDark=#ffffff borderColorLight=#000000 
            width="100%">
              <TBODY>
              <TR class=main>
                <TD align=middle width="12%">D7</TD>
                <TD align=middle width="12%">D6</TD>
                <TD align=middle width="12%">D5</TD>
                <TD align=middle width="12%">D4</TD>
                <TD align=middle width="13%">D3</TD>
                <TD align=middle width="13%">D2</TD>
                <TD align=middle width="13%">D1</TD>
                <TD align=middle width="13%">D0</TD></TR>
              <TR class=main>
                <TD align=middle width="12%">BSY</TD>
                <TD align=middle width="12%">DRDY</TD>
                <TD align=middle width="12%">DWF</TD>
                <TD align=middle width="12%">DSC</TD>
                <TD align=middle width="13%">DRQ</TD>
                <TD align=middle width="13%">CORR</TD>
                <TD align=middle width="13%">IDX</TD>
                <TD align=middle width="13%">ERR</TD></TR></TBODY></TABLE>
            <P style="TEXT-INDENT: 30px">状态寄存器中各位定义如下:</P>
            <P style="TEXT-INDENT: 30px">BSY:驱动器忙;</P>
            <P style="TEXT-INDENT: 30px">DRDY:驱动器准备好;</P>
            <P style="TEXT-INDENT: 30px">DWF:驱动器写失败;</P>
            <P style="TEXT-INDENT: 30px">DSC:寻道结束;</P>
            <P style="TEXT-INDENT: 30px">DRQ:请求服务,驱动器希望通过数据寄存器与CPU交换一字节数据;</P>
            <P style="TEXT-INDENT: 30px">CORR:当可以纠正的读错误发生时,该位置1,数据传输将继续进行;</P>
            <P style="TEXT-INDENT: 30px">IDX:收到综引信号;</P>
            <P style="TEXT-INDENT: 30px">ERR:命令执行出错。</P>
            <P 
            style="TEXT-INDENT: 30px">在向硬盘驱动器发出命令前,必须先检测硬盘驱动器是否忙碌(D7=1)。如果在规定时间内硬盘驱动器一直忙碌,则置超时错;否则表示硬盘驱动器空闲,可接受命令。</P>
            <P 
            style="TEXT-INDENT: 30px">如果CPU要对硬盘写数据,首先CPU把必要的参数写入对应的地址寄存器,等待DRDY有效;然后将操作码写入命令寄存器,同时驱器设置状态寄存器的DRQ位,表示准备好接收数据,CPU通过数据寄存器将数据写入扇区缓冲区;当扇区缓冲区填满后,驱动器清除DRQ位,并置位BSY,驱动器将扇区缓冲区中数据写入磁盘;当写盘结束,清除BSY位,发中断请求信号DNTRQ;CPU接收到中断信号后,读驱动器状态寄存器,同时将中断信号INTRQ撤除。</P>
            <P 
            style="TEXT-INDENT: 30px">如果CPU要对硬盘进行读数据操作,首先把参数写入地址寄存器和特性寄存器(如果需要);然后把命令码写入命令寄存器,命令开始执行。这时驱动器置状态寄存器中的BSY为1,同时将硬盘上指定扇区内的数据送入扇区缓冲区。当扇区缓冲区准备好数据后,置位DRQ,清BSY,发中断请求信号INTRQ。CPU检测到中断后,读取状态寄存器,测试ERR位,若等于1则转入出错处理;否则DRQ位为1,CPU从扇区缓冲区读取数据,数据读完后,驱动器复位DRQ位,然后驱动器重新设置BSY位。</P>
            <P style="TEXT-INDENT: 30px">1.3 工作原理</P>
            <P 
            style="TEXT-INDENT: 30px">基于IDE硬盘的大容量语音记录仪主要由单片机,D6571E、IDE接口笔记本硬盘、A律编解码芯片TP3057、可编程逻辑器件MAX7128S、160×32LCD模块、键盘、时钟芯片、振铃检测芯片TCM1520A、电话线接口和电源等部分组成,系统原理框图如图3所示。<BR><IMG 
            border=0 height=259 hspace=10 src="——基于IDE硬盘的大容量语音记录仪.files/6c.gif" 
            vspace=10 width=549><BR></SPAN>&nbsp;&nbsp;&nbsp; <SPAN 
            class=main1>单片机选用WINBOND公司的W78E52。它是整个系统的控制核心,完成对IDE硬盘、LCD等的初始化,接收D6571E压缩后的语音数据并存储在硬盘上,通过D6571E回放硬盘上的语音数据。W78E52是一款完全与8051兼容的8位单片机,它增加了Watchdog 
            Timer和内部电源管理等功能,并且是目前少数可运行在最高40MHz晶振的单片机之一。本系统中的单片机W78E52运行在40MHz晶振下,以提高运行速度。</P>
            <P 
            style="TEXT-INDENT: 30px">整个系统的数字逻辑部分采用一片ALTERA公司的大规模可编程逻辑器件MAX7128S,它完成单片机与IDE硬盘、D6571E、LCD显示和键盘的接口逻辑控制。可编程逻辑器件MAX7128S的程序设计采用目前较为通用和流行的VHDL语言,用MAX+plus 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -