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

📄 main.c

📁 基于NRF2401和SPCE061A的无线通信系统源程序
💻 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 + -