微波EDA网,见证研发工程师的成长!
首页 > 应用设计 > 消费类电子 > 基于K9F6408U0A和SPDS202A的数码录音系统设计

基于K9F6408U0A和SPDS202A的数码录音系统设计

时间:04-10 来源:3721RD 点击:

1 K9F6408U0A 的性能简介

K9F6408U0A 的最大优点在于其命令、数据和地址均可通过8条I/O口线与主控制器进行通信。这样就大大简化了系统的连线,增强了系统的稳定性。除8条I/O口线外, K9F6408U0A 还包括以下几条控制线,从而可方便地实现系统主控制器对 K9F6408U0A 的控制。它们分别为:

CLE:命令锁存使能端,高电平有效。在WE信号的上升沿,命令信号可通过I/O口锁入命令寄存器。

ALE:地址锁存使能端,高电平有效。在WE信号的上升沿,地址信号可通过I/O口锁入地址寄存器。

CE:片选线,低电平有效。在页编程或块擦除操作期间或器件处于忙状态时,CE高电平将被忽略。

WE:写使能口,命令、地址和数据在WE信号的上升沿被锁定。

RE:读使能口,在该口的下降沿将数据送到I/O口线上,并使内部列地址寄存器增1。

WP:写保护口,低电平有效。当其为低时,编程和擦除操作禁止。

R/B:操作状态指示信号。为低时,表示正在编程、擦除或读操作,操作结束后变高。

2 SPDS202A简介

SPDS202A是台湾SUNPLUS公司生产的性价比很高的语音芯片,它可以非常方便地与主机接口,主机通过发命令码来控制语音芯片的录音、放音等功能。它具有以下特点:

●为单片音频/语音编码/*芯片,采用SACM-S480或SACM-S3200压缩和解压算法。具有8kHz采样率,其数据低码率为4.8kbps或32kbps;

●具有数字音量控制功能;

●具有FLASH管理功能,可在内部自动管理FLASH数据,其标准FLASH接口最多可以连接4片FLASH,共64Mbit。

●利用UART接口可以方便地与PC机及其它 RS232 器件接口,并可容易地上传或下载数据;

●内嵌锁相环电路;

●内嵌高品质10位8kHz ADC和DAC;

●功耗低,采用2.8V~3.6V工作电压。

由于SPDS202A具有以上特点,因此只需增加极少的外围电路就可构成大容量的语音录放系统。

3 数码录音系统的构成

以SPDS202A为核心,以华邦公司的 W78E58 为主控制器的数码录音系统结构图如图1所示, W78E58 与 MCS-51 系列单片机兼容,其内置的32kflash EEPROM可作为程序存储器,而内置的256字节SRAM很适合 K9F6408U0A 的磁编程操作。

图2所示为 W78E58 和SPDS202A硬件接口电路。图中,TADCE为片选信号线,可在其上升沿锁存命令/数据。TADSEL1和TADSEL0是命令选择信号线,其功能如表1所列。

表1 命令选择信号线的功能


TADD7~TADD0为8位数据线。它在工作时,主控制器的SPDS202A发送三个字节的数据,其中,第一个字节总是0FFh,第二个字节为命令码低字节,第三个字节命令码高字节;然后再由主控制器接收从SPDS202A返回的两个字节的数据。二者之间的通信程序如下(用C51编写):

Void Mcu_202_Comm(void) /*MUC和SPDS202A通信程序*/

{via=0xFF; /*第一字节送0FFh*/

SendOneData( ); /*调用发送一字节数据子程序*/

Via=CMDL; /*第二字节送命令码低字节*/

SendOneData( );

Via_CMDH; /*第三字节送命令码高字节*/

SendOneData( );

ECHOL=ReadOneData( ); /*读返回数据*/

ECHOH=ReadOneData( );

}

下面以录音功能的实现程序为例,可以很清楚地说明系统是如何工作的。

Void Record(void)

{CMDL=0x00; /*发送录音命令码*/

CMDH=0x10;

Mcu_202_Comm( );

If(Err=1) /*如果发生错误,则返回*/

{Err=0;

return;

}

}

可以看出,系统是通过主控制器向SPDS202A发送一系列控制命令码来实现其功能的。

4 复制功能的实现

为了能够保存和备份所录信息,应当考虑实现一种拷贝功能,即将一片 K9F6408U0A 上的信息完全复制到另一片上。实现这一功能的硬件接口电路如图3所示。图中,两片 K9F6408U0A 除片选线分开外,其余信号线均复用。采用如下程序可实现复制功能:

void Copy(void)

{FCEB2=1;

FCEB1=0; /*选中第一片FLASH*/

For(RowAdd2=0;RowAdd2<64;RowAdd2+ +)

{for(RowAdd1=0;RowAdd1<256;RowAdd1+ +)

{BlockErase ( );} /*调用块擦除子函数,将第一片FLASH内容擦除*/

}

for(F1RowAdd2=0,F2RowAdd2=0;(F1RowAdd2<64)

(F2RowAdd2<64);F1RowAdd2+ +,

F2RowAdd2+ +)

For(F1RowAdd1=0,F2RowAdd1=0;

(F1RowAdd1<256) (F2RowAdd2<256);

F1RowAdd1+ +,F2RowAdd1+ +)

For(F1ColAdd=0,F2ColAdd=0;(F1ColAdd<256) (F2ColAdd<256);F1ColAdd=F1COAdd+128;F2ColAdd=F2ColAdd+128)

{CE1=1;

CE2=0;

SetPointer=0x00;

F1RdData( ); /*调用从第一片FLASH读数据子函数*/

CE2=1;

CE1=0;

SendData( );/*调用向第二片FLASH页寄存器送数据子函数*/

CE1=1;

CE2=0;

SetPointer=0x01; /*设置页寄存器指针指向页寄存器后半部分*/

F1RdData( );

CE1=1;

CE2=0;

SendData( );

FwrData( ); /*执行

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top