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

📄 cc1100_f310_t00.c.bak

📁 用c8051f310开发的433M无线模块cc1100的完整程序
💻 BAK
字号:
/******************************************************************************
文件名:	CC1100F310_main.c
说  明:	本文件为“CC1100-F310”数传模块V1.0版的主函数。
作  者:	赵华森
开  始:	2008.4.12
修  改:
		V1.0 初次开发实验调试。
******************************************************************************/

#include "CC1100_func.h"	//访问CC1100的函数
#include "CC1100_z.h"		//CC1100寄存器定义,一些常数定义。
#include "CC1100_MCU_z.h"	//MCU操作CC1100的SPI口的硬件相关的函数。
#include "CC1100_SMARTRF.h"	//SmartRF Stdio软件计算的CC1100寄存器配置值。
#include "globe_val.h"		//全局变量定义。

/******************************************************************************/

#define	FRX_idle	0
#define	FRX_wait	1
#define	FRX_end		2

#define	FTX_start	3
#define	FTX_wait	4
#define	FTX_idle	5

#define URX_GAP		10	//帧间隔复位值(ms)
/******************************************************************************/
void Start_FRX( void );
void switch_URX_buf( void );
void switch_UTX_buf( void );

/**************************************************************************************
	主函数
(1):CC1100平时处于RX模式(或WOR)。
(2):串口(8N1,9600)收到数据后:启动TX模式,分包发送。
(3):RX收到一包后:启动串口,送出收到数据。
**************************************************************************************/
void main()
{
	//unsigned char	data	i;
//(1)CC1100复位《CC1100_MCU_z.c》。
	CC1100_Reset();
//(2)读芯片器件号,版本号《CC1100_func.c》。
//	chip_id = Read_Register( CC1100_PARTNUM );
//	chip_ver = Read_Register( CC1100_VERSION );
//(3)芯片切换到IDEL状态《CC1100_func.c》。
	turn_IDLE();

//(4)配置CC1100寄存器《CC1100_SMARTRF.c》。
	CC1100_Config();
//(5)SLEEP或XOFF时不保留这些寄存器,故唤醒后必须恢复。《CC1100_func.c》
	Recover_TEST();
//(6)根据本应用补充变更配置CC1100《CC1100_func.c》
	CC1100_function();
//(7)工作单元清零,启动定时器T2运行,开中断等。
	SYS_Flag = 0;		//清零所有标志位。
	URX_time = 0;		//帧间隔复位值
	FRX_time = 0;
	URX_i = 0;
	FRX_len = 0;
	switch_URX_buf();
	switch_UTX_buf();

	Start_FRX();

	TMR2CN = 0x04;		//T2运行。
	EA = 1;			//开中断。

	while ( 1 )
	{//《主循环·开始》
		if ( S_1ms )
		{//《1ms定时器到时·开始》
			S_1ms = 0;
			Deal_with_LED();	//《CC1100_MCU_z.C》

			if ( URX_time && (!(--URX_time)) )
			{//URX结束。
				S_FTX = 0;
				if ( URX_i )
				{
					URX_i |= 0x80;
					switch_URX_buf();
					RF_case = FTX_start;	//启动无线发射任务
				}
			}
			if ( FRX_time ) FRX_time--;
		}//《1ms定时到时·结束》

		switch ( RF_case )	//GDO0=0x06,	GDO2=0x07。
		{//《任务调度·开始》
		//无线发射任务
			case FTX_start:
			{//无线发射1个分组
				Write_URX_buf_33();	//发射1个分组+字节数。
				turn_FTX();
				RF_case = FTX_wait;
				break;
			}
			case FTX_wait:
			{
				if ( !CC1100_GDO0 )
				{//1个分组发完。
					RF_case = FTX_idle;
					if ( !Test_CC1100( CC1100_STATE_IDLE ) )
					{//TXFIFO亏空
						clear_TXFIFO();
					}
				}
				break;
			}
			case FTX_idle:
			{//FTX空闲
				if ( !S_FTX )
				{//FTX结束,转FRX。
					RF_case = FRX_idle;	//FRX空闲
				}
				break;
			}
		//无线接收任务
			case FRX_idle:
			{//FRX空闲
				if ( CC1100_GDO0 )
				{//FRX收到同步字
					if ( !S_FRX )
					{
						S_FRX = 1;	//FRX灯亮。
						switch_UTX_buf();
					}
					FRX_time = 10;
					RF_case = FRX_wait;
				}
				else if ( S_FRX && !(FRX_time) )
				{//等待
					S_FRX = 0;
				}
				break;
			}
			case FRX_wait:
			{//等待FRX收完
				if ( !CC1100_GDO0 )
				{//FRX收完
					RF_case = FRX_end;
				}
				break;
			}
			case FRX_end:
			{//收到1个分组
				if ( CC1100_GDO2 )
				{//收到1个分组
					read_UTX_buf_33();	//读取1个分组+字节数。
					Start_FRX();		//启动FRX。
					while ( S_TI0 );	//等待UTX完
					S_TI0 = 1;
					switch_UTX_buf();	//切换UTX缓冲区,启动UTX。
					if ( FRX_len & 0x80 )
					{//最后分组
						S_FRX = 0;
					}
					TI0 = 1;	//启动UTX
				}
				else
				{//FRX错误
					if ( !Test_CC1100( CC1100_STATE_RX_OVERFLOW ) )
					{//RXFIFO溢出
						clear_RXFIFO();	//清除溢出错误。
					}
					Start_FRX();		//启动FRX。
				}
			}
			break;
		}//《任务调度·结束》
	}//《主循环·结束》
}//main()

/***************************************************************
函数名:	void Start_FRX( void )
功能说明:	启动无线接收。
***************************************************************/
void Start_FRX( void )
{
	turn_FRX();
	RF_case = FRX_idle;
}

/***************************************************************
函数名:	void switch_URX_buf( void )
功能说明:	切换URX缓冲区。
***************************************************************/
void switch_URX_buf( void )
{
	FTX_len = URX_i;	//URX收到的字节数
	URX_i = 0;
	if ( !S_URX )
	{//URX:0号缓冲区,FTX:1号缓冲区
		URX_ptr = &UART_buf_1;
		FTX_ptr = &UART_buf_0;
	}
	else
	{//URX:1号缓冲区,FTX:0号缓冲区
		URX_ptr = &UART_buf_0;
		FTX_ptr = &UART_buf_1;
	}
	S_URX = !S_URX;
}

/***************************************************************
函数名:	void switch_UTX_buf( void )
功能说明:	切换URX缓冲区。
***************************************************************/
void switch_UTX_buf( void )
{
	UTX_i = FRX_len & 0x3F;	//FRX收到的字节数
	if ( !S_UTX )
	{//UTX:0号缓冲区,FRX:1号缓冲区
		UTX_ptr = &UART_buf_1;
		FRX_ptr = &UART_buf_0;
	}
	else
	{//UTX:1号缓冲区,FRX:0号缓冲区
		UTX_ptr = &UART_buf_0;
		FRX_ptr = &UART_buf_1;
	}
	S_UTX = !S_UTX;
}

//-----------   UART0 中断服务程序   ----------------
//工作原理:
//RX时,字节间隔时间大于帧间隔RX_OVER作为帧结束标志。
//	第一个字节为包长度,其后为正文。
//--------------------------------------------------
void UART_ISR ( void )	interrupt 4 using 1
{

	if ( RI0  )
	{
		RI0 = 0;
		if ( !S_FTX )
		{//第1分组
			S_FTX = 1;	//FTX灯亮。
			switch_URX_buf();
		}
		URX_time = URX_GAP;	//重置帧间隔
		*URX_ptr = SBUF0;
		URX_ptr++;
		URX_i++;
		if ( URX_i == 32 )
		{//URX收到1个分组。
			RF_case = FTX_start;	//启动无线发射任务
			switch_URX_buf();
		}
	}

	if ( TI0 )
	{
		TI0 = 0;
		if ( UTX_i )
		{
			SBUF0 = *UTX_ptr;
			UTX_ptr++;
			UTX_i--;
		}
		else
		{
			S_TI0 = 0;
		}

	}

}

⌨️ 快捷键说明

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