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

📄 main.c

📁 在philips公司的ARM7芯片2136上实现ADPCM编码的原代码
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:         Zhoujinxi
** Modified date:       2005-11-28
** Version:             1.0
** Descriptions:
**
********************************************************************************************************/
#include "config.h"

#include "adpcm.h"


#define NUM_A_D_A_CHANNELS	 2	/* stereo: left + right		*/
#define SAMPLEING_RATE		48	/* 48 samples/ms		    */
#define FRAME_SIZE			10	/* 10 ms					*/
#define	NFRAMES				100	/* 100 frames = 1 second	*/
//#define BUFLEN              1024
#define	BUFLEN		(NUM_A_D_A_CHANNELS*SAMPLEING_RATE*FRAME_SIZE)
#define MidBufLen   (NUM_A_D_A_CHANNELS*SAMPLEING_RATE*FRAME_SIZE/2)

int16 Rx_Ping_Buffer[BUFLEN];
int16 Rx_Pong_Buffer[BUFLEN];
int16 Tx_Ping_Buffer[BUFLEN];
int16 Tx_Pong_Buffer[BUFLEN];

uint8 Rx_Change_Flag = 0;
uint8 Rx_Ping_Full   = 0;
uint8 Rx_Pong_Full   = 0;

uint8 Tx_Ping_Enable = 0; 
uint8 Tx_Pong_Enable = 0;

int8 MidBuf[MidBufLen];
/*
*********************************************************************************************************
** 函数名称:SSP_Init()
** 函数功能:将SSP控制器设置为从机SPI。
** 入口参数:无
** 出口参数:无
*********************************************************************************************************
*/
void  SSP_Init(void)
{
    SSPCR0 = (0x00 << 8) |              // SCR  设置SSI时钟分频
             (0x00 << 7) |              // CPHA 时钟输出相位,仅SPI模式有效 
             (0x00 << 6) |              // CPOL 时钟输出极性,仅SPI模式有效
             (0x00 << 4) |              // FRF  帧格式 00=SPI,01=SSI,10=Microwire,11=保留
             (0x0f << 0);               // DSS  数据长度,0000-0010=保留,0011=4位,0111=8位,1111=16位

    SSPCR1 = (0x00 << 3) |              // SOD  从机输出禁能,1=禁止,0=允许
             (0x01 << 2) |              // MS   主从选择,0=主机,1=从机
             (0x01 << 1) |              // SSE  SSP使能,1=允许SSP与其它设备通信
             (0x00 << 0);               // LBM  回写模式
             
    SSPCPSR = 0x12;                     // PCLK分频值:((11059200*5)/(48000*64)=18
    SSPIMSC = 0x03;                     // 中断屏蔽寄存器
    SSPICR  = 0x03;                     // 中断清除寄存器
}

/*
*********************************************************************************************************
** 函数名称:SSP_IRQ()
** 函数功能: SSP中断服务程序。
** 入口参数:无
** 出口参数:无
*********************************************************************************************************
*/
void __irq SSP_IRQ(void)
{
    static uint16 Rx_Count = 0;
    static uint16 Tx_Count = 0;   
       
    if((SSPSR & 0x04) != 0)
    {
        if(Rx_Change_Flag == 0)
        {
            Rx_Ping_Buffer[Rx_Count] = SSPDR;
            Rx_Count++;
            
            if(Rx_Count == BUFLEN)
            {
                Rx_Count = 0;
                Rx_Ping_Full   = 1;
                Rx_Change_Flag = 1;                 
            }
        }
        else
        {
            Rx_Pong_Buffer[Rx_Count] = SSPDR;
            Rx_Count++;
            
            if(Rx_Count == BUFLEN)
            {
                Rx_Count = 0;
                Rx_Pong_Full   = 1;
                Rx_Change_Flag = 0; 
            }        
        }
    }
    
    if((SSPSR & 0x02) != 0)
    {
        if(Tx_Ping_Enable == 1)
        {
            SSPDR = Tx_Ping_Buffer[Tx_Count];             
            Tx_Count++;
            
            if(Tx_Count == BUFLEN)
            {
                Tx_Count = 0;
                Tx_Ping_Enable = 0;
            }
        }
        if(Tx_Pong_Enable == 1)
        {
            SSPDR = Tx_Pong_Buffer[Tx_Count];        
            Tx_Count++;
            
            if(Tx_Count == BUFLEN)
            {
                Tx_Count = 0; 
                Tx_Pong_Enable = 0;
            }
        }
    }
 
    SSPICR      = 0x03;
    VICVectAddr = 0x00;  
}

/*
*********************************************************************************************************
** 函数名称:process_encode(int16 *inbuf, int8 *midbuf)
** 函数功能:编码处理函数。
** 入口参数:*inbuf, *midbuf
** 出口参数:无
*********************************************************************************************************
*/
void process_encode(int16 *inbuf, int8 *midbuf)
{
    static adpcm_state *state_encode;   
    static int16 Encode_Index_L = 0;
    static int16 Encode_Index_R = 0; 
    static int16 Encode_ValPrev_L = 0;
    static int16 Encode_ValPrev_R = 0;      

	state_encode->index_L   = Encode_Index_L;
	state_encode->index_R   = Encode_Index_R;	
	state_encode->valprev_L = Encode_ValPrev_L;
	state_encode->valprev_R = Encode_ValPrev_R;
		
	Adpcm_Encoder(inbuf, midbuf, MidBufLen, state_encode);
	    
	Encode_Index_L   = state_encode->index_L;
	Encode_Index_R   = state_encode->index_R;	
	Encode_ValPrev_L = state_encode->valprev_L;
	Encode_ValPrev_R = state_encode->valprev_R;		        	    	    	    	    	 	    								 	    										
}

/*
*********************************************************************************************************
** 函数名称:process_decode(int8 *midbuf, int16 *outbuf)
** 函数功能:解码处理函数。
** 入口参数:*inbuf, *midbuf
** 出口参数:无
*********************************************************************************************************
*/
void process_decode(int8 *midbuf, int16 *outbuf)
{
    static adpcm_state *state_decode;    
    static int16 Decode_Index_L = 0; 
    static int16 Decode_Index_R = 0; 
    static int16 Decode_ValPrev_L = 0; 
    static int16 Decode_ValPrev_R = 0;      	
		
	state_decode->index_L   = Decode_Index_L;
	state_decode->index_R   = Decode_Index_R;	
	state_decode->valprev_L = Decode_ValPrev_L;
	state_decode->valprev_R = Decode_ValPrev_R;
		
	Adpcm_Decoder(midbuf, outbuf, MidBufLen, state_decode);
	
	Decode_Index_L   = state_decode->index_L;
	Decode_Index_R   = state_decode->index_R;	
	Decode_ValPrev_L = state_decode->valprev_L;	
	Decode_ValPrev_R = state_decode->valprev_R;
}

/*
*********************************************************************************************************
** 函数名称:main()
** 函数功能:主函数。
** 入口参数:无
** 出口参数:无
*********************************************************************************************************
*/
int main (void)
{     
   	PINSEL1 = 0x000002A8;            // 设置SSP管脚连接
   	
   	VICIntSelect = 0x00000000;
   	VICVectCntl0 = (0x20 | 11);
   	VICVectAddr0 = (int32)SSP_IRQ;
   	VICIntEnable = (1 << 11);
   	
   	IRQEnable();
   	
   	SSP_Init();
   	
   	while(1)
   	{
   	    if(Rx_Ping_Full == 1)
   	    {   	    
	   	    Rx_Ping_Full = 0;
	   	    
	   	    process_encode(Rx_Ping_Buffer, MidBuf);
	   	    process_decode(MidBuf, Tx_Ping_Buffer);

	   	    Tx_Ping_Enable = 1;	   	        
	   	}
	   	if(Rx_Pong_Full == 1)
	   	{
	   	    Rx_Pong_Full = 0;
	   	    
	   	    process_encode(Rx_Pong_Buffer, MidBuf);
	   	    process_decode(MidBuf, Tx_Pong_Buffer);	

	   	    Tx_Pong_Enable = 1;     
	   	}
   	}
   	
    return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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