📄 main.c
字号:
//======================================================================
// 工程名称: WirelessCom.spj
// 功能描述: 毕业设计礼包(无线语音传输)源代码,实现双向无线语音传输
// 配合两套61板和无线模组使用,具体使用参考配套使用说明书
// IDE环境: SUNPLUS u'nSPTM IDE 2.0.0(or later)
// 涉及的库: CMacro1016.lib
// SACMv41dx_061A.lib
// 组成文件: main.c, SACM_DVR1600_User_C.c,nRF2401.c
// SACM_DVR1600.asm, Queue.asm, ISR.asm
// SPCE061A.h, DVR1600.h, nRF2401.h,Queue.h
// SPCE061A.inc, DVR1600.inc
// 硬件连接: IOA0 - Key1(61板)
//
// IOB0 - PWR(无线模组)
// IOB1 - CE(无线模组)
// IOB2 - CS(无线模组)
// IOB3 - DR1(无线模组)
// IOB4 - CLK1(无线模组)
// IOB5 - DATA1(无线模组)
// 维护记录: 2006-10-20 v1.0
//======================================================================
//====================================================================================
//文 件 名: main.c
//功能描述: 实现语音的录放和传输
//维护记录: 2006年10月20
//====================================================================================
#include "SPCE061A.h"
#include "DVR1600.h"
#include "Queue.h"
#include "nRF2401.h"
unsigned int SourceBuf[14]; // 资源缓冲数组,用于收发
unsigned int Address[5] = {0x00,0x00,0x00,0x01}; // 目标地址,用于发送
unsigned int PlayFlag=0; // 播放标志
unsigned int Cnt=0; // 等待时间
//====================================================================================
//语法格式:int main(void)
//功能描述: 主函数
//入口参数: 无
//出口参数: 无
//====================================================================================
int main(void)
{
unsigned int i;
nRF2401_Initial(); // nRF2401 初始化
nRF2401_SetAddress(Address,4); // 设置目标nRF2401 地址
nRF2401_Mode(0); // nRF2401工作方式,接收
*P_INT_Mask |= C_IRQ4_1KHz; // 打开1KHz中断,接收资源
__asm("int fiq,irq ");
while(1)
{
*P_Watchdog_Clear = 0x01;
if((*P_IOA_Data&0x0001) == 1) // Key1按下,录音并发送
{
*P_INT_Mask &= ~C_IRQ4_1KHz; // 关闭1KHz中断,禁止接收语音资源
nRF2401_Mode(1); // nRF2401工作方式,发送
Queue_Init(); // 初始化编解码队列
SACM_DVR1600_Initial(); // DVR 初始化
SACM_DVR1600_Rec(0,1); // 录音(12k编码)
while((*P_IOA_Data&0x0001) != 0) // Key1 一直按下
{
*P_Watchdog_Clear = 0x01;
SACM_DVR1600_ServiceLoop(); // 编码
if(Queue_Test() != 0xffff) // 有数据?
{
for(i=0; i<L_Fram; i++)
{
SourceBuf[i] = Queue_Read(); // 读取编码数据
}
nRF2401_SendBuffer_Word(SourceBuf,L_Fram); // 发送数据
}
}
SACM_DVR1600_Stop(); // Key1 释放,停止录音
nRF2401_Mode(0); // nRF2401工作方式,接收
*P_INT_Mask |= C_IRQ4_1KHz; // 打开1KHz中断,接收语音资源
}
if(PlayFlag == 0xff) // 接收到数据
{
Queue_Init(); // 初始化编解码队列
SACM_DVR1600_Initial(); // DVR 初始化
SACM_DVR1600_Play(0, DAC_1+DAC_2, RAMP_UP_DN); // 放音,双声道,淡入淡出
while(PlayFlag == 0xff)
{
SACM_DVR1600_ServiceLoop(); // 解码
*P_Watchdog_Clear = 0x01;
}
SACM_DVR1600_Stop(); // DVR停止
}
}
}
//====================================================================================
//语法格式:void IRQ4()__attribute((ISR))
//功能描述: 1KHz中断,用于接收语音资源数据
//入口参数: 无
//出口参数: 无
//====================================================================================
void IRQ4()__attribute((ISR));
void IRQ4()
{
int i;
if((nRF2401_RxStatus()) == 1) // 有数据请求
{
PlayFlag = 0xff; // 置位语音播放标志
Cnt = 0;
nRF2401_ReceiveWord(SourceBuf); // 读取资源
{
if(Queue_Test() >= L_Fram) // 资源缓冲不满
{
for(i=0; i< L_Fram; i++)
{
Queue_Write(SourceBuf[i]); // 填补缓冲
}
}
}
}
else
{
Cnt++;
if(Cnt >= 500) // 0.5s没有数据,结束语音播放
{
PlayFlag = 0x00;
Cnt = 0;
}
}
*P_INT_Clear = C_IRQ4_1KHz;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -