最近在做一个语音传输的项目,用到了AMBE1000语音编码套片(AMBE1000+CSP1027)。CSP1027是一款AD/DA芯片。前几天出差今天有时间调试做好的样板。说实话很讨厌这种动辄百八十脚的芯片。大多数脚都是些没用的。但说实话从使用感受来说这款芯片还是有它的独到之处。每20个MS产生一个固定帧长34个字节的数据包。这样来说对我们MCU来说不必太辛苦,只要固定的每20个ms辛苦一下做一次接受就可以了。所以用简单的51系统就可以轻松搞定。与MCU的接口有8位并行接口和收发独立时钟的串行口两种,在实际中我选择了串口,省资源嘛。 最少只要8个IO口,而且芯片自带有回声消除功能对消除2-4线音频转换引起的噪声很有帮助。这对于那些做音频交换的很有帮助啊。总体来说音质还是不错的。在此贴出串行方式源代码。在上个接口图...
/*
AMBE1000串口调试程序,经实际验证通过。
ver:1.0
作者:尹其武
*/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
uchar RX_Data[34];//定义一个34字节的数组专门用来存储数据
uchar TX_Data[34];//定义一个发送数组
sbit AMBE_DPR=P3^6;//解码数据准备好
sbit CHS_DI=P3^2;//数据输入引脚
sbit CHS_I_CLK=P1^7;//数据输入时钟
sbit CHS_I_STRB=P1^5;//写选通引脚
sbit AMBE_EPR=P3^7;//编码数据准备好
sbit CHS_DO=P1^4;//数据输出引脚
sbit CHS_O_CLK=P1^3;//数据输出的时钟
sbit CHS_O_STRB=P1^6;//数据读选通
sbit AMBE_SerialEnable=P0^2;//串口使能控制
sbit AMBE_Reset=P2^0;//AMBE复位引脚 这2个引脚在实际中可以不需要单片机IO口
/*
函数名:delayus
功能:延时函数
参数:无
返回值:无
*/
void delayus(void)
{
uchar i;
for(i=0;i<15;i++)
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();
}
}
/*
函数名:AMBE_ReadSData
功能:串口方式读取数据
参数:无
返回值:uchar *ptr
*/
void AMBE_ReadSData(unsigned char *p)
{
uchar i,j,tem;
uchar *Ptr;
Ptr=p;
for(i=0;i<17;i++)//用串口方式接受数据每帧数据是16位的,不是传统的8位
{
CHS_O_STRB=0;
CHS_O_CLK=0;
tem=0;
for(j=0;j<8;j++)
{
CHS_O_CLK=1;
_nop_();
tem<<=1; //接受数据时从高位开始
if(CHS_DO==1)
tem|=1;
CHS_O_CLK=0;
}
*Ptr++=tem; //接受数据要分2部份
CHS_O_STRB=1;
tem=0;
for(j=0;j<8;j++)
{
CHS_O_CLK=1;
_nop_();
tem<<=1;
if(CHS_DO==1)
tem|=1;
CHS_O_CLK=0;
}
*Ptr++=tem;
}
}
/*
函数名:AMBE_WriteSData
功能:串口方式写入数据
参数:uchar *ptr
返回值:无
*/
void AMBE_WriteSData(unsigned char *p)
{
uchar i,j,tem;
uchar *ptr;
ptr=p;
for(i=0;i<17;i++)
{
CHS_I_STRB=0;
CHS_I_CLK=0;
_nop_();
CHS_I_CLK=1;
tem=*ptr++;
for(j=0;j<8;j++)
{
CHS_I_CLK=0;
CHS_DI=tem&0x80; //发送数据时从高位开始
tem<<=1;
_nop_();
CHS_I_CLK=1;
}
CHS_I_STRB=1;
tem=*ptr++;
for(j=0;j<8;j++)
{
CHS_I_CLK=0;
CHS_DI=tem&0x80;
tem<<=1;
_nop_();
CHS_I_CLK=1;
}
}
}
/*
函数名:AMBE_Init
功能:AMBE初始化函数
参数:无
返回值:无
*/
void AMBE_Init(void)
{
uchar i;
AMBE_SerialEnable=0;
//CHS_I_CLK=0;
//CHS_O_CLK=0;
//CHS_DO=1;
//CHS_O_STRB=1; //经实际验证以上4句不加也可以正常使用
//AMBE_Reset=1; //需要足够的复位才能进行,不加高电平也可以正常的复位
//P0=0XF8;
//for(i=0;i<100;i++)
//delayus();
AMBE_Reset=0;
for(i=0;i<100;i++)
delayus();
AMBE_Reset=1;
}
void main()
{
uchar tem=0;//用于做话音检测
SCON=0X50;
TMOD=0X20;
TH1=0XFE;
TL1=0XFE;
TR1=1;
AMBE_Init();
while(1)
{
//SBUF=0X55;
//while(TI==0);
//TI=0;
while(AMBE_EPR==0); //等待编码数据引脚为高,实际应用中可以使用中断
AMBE_ReadSData(RX_Data);
tem=RX_Data[3]; //这一步是做语音检测
if((tem&0x02)==0x00)
{
SBUF='O';
while(TI==0);
TI=0;
SBUF='K';
while(TI==0);
TI=0;
}
while(AMBE_DPR==0); //在解码数据时应等待解码数据管脚为高,实际应用时不需要利用中断功能
AMBE_WriteSData(RX_Data);
}
}/*
文章评论(0条评论)
登录后参与讨论