📄 cc1100_f310_t00.c.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 + -