📄 main.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 + -