原创 AMBE1000芯片的使用感受及源代码

2011-1-26 21:03 6892 13 13 分类: MCU/ 嵌入式

最近在做一个语音传输的项目,用到了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条评论)

登录后参与讨论
我要评论
0
13
关闭 站长推荐上一条 /2 下一条