天堂草原最受欢迎的角色,天堂动漫,天堂在线,色天堂下载,天堂中文在线资源,亚洲男人天堂

技術(shù)熱線: 4007-888-234
設(shè)計(jì)開發(fā)

專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命

開發(fā)工具

提供開發(fā)工具、應(yīng)用測(cè)試 完善的開發(fā)代碼案例庫分享

技術(shù)支持

從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無限潛能!

新品推廣

提供新的芯片及解決方案,提升客戶產(chǎn)品競(jìng)爭(zhēng)力

新聞中心

提供最新的單片機(jī)資訊,行業(yè)消息以及公司新聞動(dòng)態(tài)

QLdsPIC3]音頻編碼解碼[C30+dsPIC30F6014A]

更新時(shí)間: 2019-03-23
閱讀量:3324

深圳市英銳恩科技有限公司:臺(tái)灣麥肯單片機(jī)(Micon MDT單片機(jī))亞太地區(qū)A級(jí)代理商

QLdsPIC3]音頻編碼解碼[C30+dsPIC30F6014A]
//實(shí)驗(yàn)功能:熟悉dsPIC芯片的DC1模塊功能和音頻編解碼芯片SI3000的使用
//軟件規(guī)劃:
//          1。音頻信號(hào)從J10(MIC IN)進(jìn)去,編碼后送dsPIC控制器,dsPIC接收直接送回SI3000解碼從J11(SPK OUT)輸出
//          2。DCI采用中斷接收數(shù)據(jù)
//          3。SI3000工作在SLAVE從模式(由dsPIC提供SCK)
//硬件規(guī)劃:
//          1。撥碼開關(guān)S10全部置ON
//          2。跳線J9全部跳到SLAVE邊
//          3。音頻輸入接到J10(MIC IN)
//          4。音頻輸出接到J11(SPK OUT)

#include             //dsPIC30F6014標(biāo)準(zhǔn)頭文件
  _FOSC(0x0ffe5);                 //4倍頻晶振,F(xiàn)ailsafe 時(shí)鐘關(guān)閉
  _FWDT(WDT_OFF);                 //關(guān)閉看門狗定時(shí)器
  _FBORPOR(PBOR_OFF & MCLR_EN);   //掉電復(fù)位禁止,MCLR復(fù)位使能。
  _FGS(CODE_PROT_OFF);            //代碼保護(hù)禁止


#define SAMPLE_RATE    7200L
#define FRAMECLKRATE  (SAMPLE_RATE*256L)   //SCK頻率使用1.8432M
#define CLOCK_FREQ  (1L*10000000L)   // 采用 4x PLL..PIC 指令頻率 (Fosc*4/4)


#define CMD_STAGE0 0 //正常模式
#define CMD_STAGE1 1 //設(shè)置lsb告訴解碼器下一個(gè)控制字是命令
#define CMD_STAGE2 2 //把帶命令的字節(jié)放到輸出緩沖
#define CMD_STAGE3 3 //設(shè)置幀模式
#define CMD_STAGE4 4 //回復(fù)正常幀模式

#define PROC_BLOCK_SIZE 144 //數(shù)據(jù)處理塊大小
#define QUEUE_SIZE (PROC_BLOCK_SIZE*2) //Rx和Tx隊(duì)列的大小,必須為處理緩沖大小的2倍

unsigned int* pActiveRxBuf;
unsigned int* pActiveTxBuf;

unsigned char  __attribute__((address(0x900))) CmdStage;
static volatile unsigned int CodecCmd;
static volatile char ClkAdjTrig;

static int TxQue[QUEUE_SIZE];
static int RxQue[QUEUE_SIZE];
static volatile unsigned int TxQTail;
static volatile unsigned int RxQHead;


void InitCodec(void);
void WriteCodecCtrl( unsigned char adr, unsigned char parm );
void AdjustClock( char shift );
unsigned char ReadCodecCtrl( unsigned char adr );

//***************延時(shí)程序***************************
void TimeDelay(unsigned char x)
{
 unsigned char i;
    for(i=0;i<x;i++);
}


//************把數(shù)據(jù)放到接收緩沖的子程序************
inline void PutRxQue(int data)
{
 RxQue[RxQHead++] = data;
 if(RxQHead==QUEUE_SIZE) RxQHead = 0;
}

//***********從接收緩沖獲取數(shù)據(jù)的子程序***************
inline int GetTxQue(void)
{
static int tmp;  
    tmp = RxQue[TxQTail++]&0xFFFE;     //接收到數(shù)據(jù)送回解碼輸出
 if(TxQTail==QUEUE_SIZE) TxQTail = 0;
 return tmp;
}

//DCI中斷服務(wù)子程序
void __attribute__((__interrupt__)) _DCIInterrupt(void)
{
int tmp;
 switch( CmdStage )
 {
  case CMD_STAGE0:            
   TXBUF0 = GetTxQue();
    TXBUF1 = GetTxQue();
   TXBUF2 = GetTxQue();
   TXBUF3 = GetTxQue();
   PutRxQue(RXBUF0);
   PutRxQue(RXBUF1);
   PutRxQue(RXBUF2);
   tmp = RXBUF3;   //調(diào)整時(shí)鐘的相位
   if(ClkAdjTrig > 0)  //如果需要插入采樣
    PutRxQue(tmp);
   if(ClkAdjTrig >= 0)  //如果不須,則跳過
    PutRxQue(tmp);
   ClkAdjTrig = 0;
   break;
  case CMD_STAGE1:
   TXBUF0 = GetTxQue();
   TXBUF1 = GetTxQue();
   TXBUF2 = GetTxQue();
   TXBUF3 = GetTxQue() | 1; //告訴編碼解碼器下一個(gè)值是命令
   PutRxQue(RXBUF0);
   PutRxQue(RXBUF1);
   PutRxQue(RXBUF2);
   PutRxQue(RXBUF3);
   CmdStage = CMD_STAGE2;
   break;
  case CMD_STAGE2:
   TXBUF0 = CodecCmd;      //插入編碼解碼器命令
   TXBUF1 = GetTxQue(); //取采樣數(shù)據(jù)
   TXBUF2 = 0x0000;    //寫虛擬值
   TXBUF3 = 0x0000;    //寫虛擬值
   PutRxQue(RXBUF0);
   PutRxQue(RXBUF1);
   PutRxQue(RXBUF2);
   PutRxQue(RXBUF3);
   CmdStage = CMD_STAGE3;
   break;
  case CMD_STAGE3:
   TXBUF0 = GetTxQue();
   TXBUF1 = GetTxQue();
   TXBUF2 = GetTxQue();
   TXBUF3 = GetTxQue();
   PutRxQue(RXBUF0);
   PutRxQue(RXBUF1);
   PutRxQue(RXBUF2);
   PutRxQue(RXBUF3);
   
            DCICON2=0XF6FF;        //設(shè)置DCI緩沖長(zhǎng)度為2
   CmdStage = CMD_STAGE4;
   break;
  case CMD_STAGE4:
   TXBUF0 = GetTxQue();
   TXBUF1 = GetTxQue();
   TXBUF2 = GetTxQue();
   TXBUF3 = GetTxQue();
   CodecCmd = RXBUF0;
   PutRxQue(RXBUF1);
   
            DCICON2=0XFFFF;      //設(shè)置DCI緩沖長(zhǎng)度為4
   CmdStage = CMD_STAGE0;
   break;
 }
 IFS2bits.DCIIF = 0; // 清DCI中斷標(biāo)志
}

//**************初始化DCI和編碼解碼器*******************
void InitCodec(void)
{
int i;
 for(i=0; i {
  RxQue[i] = 0;
  TxQue[i] = 0xffff;
 }
 TxQTail = 0;
 RxQHead = 0;
 CmdStage = CMD_STAGE0;
 CodecCmd = 0;
 ClkAdjTrig = 0;
 TRISFbits.TRISF6 = 1; //編碼解碼器(Codec)引腳為輸入
    IFS2bits.DCIIF = 0;
    IEC2bits.DCIIE=1;
    IPC10bits.DCIIP=7;
 
    DCICON1=0X8040;         // 配置DCI模塊用于傳送16位數(shù)據(jù)且工作在多通道模式
    DCICON2=0XFFFF;
    DCICON3=( CLOCK_FREQ / ( 2 * FRAMECLKRATE) ) - 1;
    TSCON=1;
    RSCON=1;
 LATFbits.LATF6 = 0; //復(fù)位編碼解碼器
 TRISFbits.TRISF6 = 0;
 TimeDelay(200);
 TRISFbits.TRISF6 = 1; //編碼解碼器設(shè)為輸入
 TimeDelay(1);

 WriteCodecCtrl( 3, 0);  //SI3000寄存器3
 WriteCodecCtrl( 4, 19);     //SI3000寄存器4
    WriteCodecCtrl( 1,0X18 );   //SI3000寄存器1
 WriteCodecCtrl( 2, 0);     //SI3000寄存器2
    WriteCodecCtrl( 5, 2);      //SI3000寄存器5
    WriteCodecCtrl( 6, 0X5E );  //SI3000寄存器6
    WriteCodecCtrl( 7, 0X5F );  //SI3000寄存器7
    WriteCodecCtrl( 9, 0);      //SI3000寄存器9
}

//*************寫命令到編碼解碼器子程序**********************
void WriteCodecCtrl( unsigned char adr, unsigned char parm )
{
 CodecCmd = (unsigned int)adr;
 CodecCmd = (CodecCmd<<8) & 0x1F00;     //SI3000寄存器的5位地址
 CodecCmd += (unsigned int)parm;        //待寫入的數(shù)據(jù)
 CmdStage = CMD_STAGE1;
 while( CmdStage != CMD_STAGE0 ){}
}

//*************從編碼解碼器讀命令子程序**********************
unsigned char ReadCodecCtrl( unsigned char adr )
{
 CodecCmd = (unsigned int)adr;
 CodecCmd = (CodecCmd<<8) & 0x1F00;
 CodecCmd |=  0x2000;                  //讀功能
 CmdStage = CMD_STAGE1;
 while( CmdStage != CMD_STAGE0 ){}
 return CodecCmd&0x00FF;
}

//**********************主函數(shù)*******************************
int main(void)
{
    TRISG=0X1000;
 InitCodec();
    while(1);
}

联系我们: 饶河县| 韶关市| 兴安县| 茌平县| 湖南省| 封丘县| 庄河市| 固阳县| 达州市| 湄潭县| 南充市| 棋牌| 米泉市| 娱乐| 保山市| 兰州市| 乳山市| 雅江县| 班玛县| 重庆市| 阜南县| 望江县| 黎平县| 南投县| 大同市| 罗平县| 曲麻莱县| 沭阳县| 贵阳市| 新河县| 西吉县| 娄烦县| 武川县| 子长县| 梁平县| 安庆市| 侯马市| 昔阳县| 福鼎市| 望都县| 和顺县|