?? cc1100_f310_t00.c
字號:
/******************************************************************************
文件名: CC1100F310_main.c
說 明: 本文件為“CC1100-F310”數傳模塊V1.0版的主函數。
模塊工作與透明串口(半雙工)。
無線速率=500kbps
UART的波特率=38400。
作 者: 趙華森
開 始: 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_ready 1
#define FRX_wait 2
#define FRX_end 3
#define FTX_start 4
#define FTX_wait 5
#define URX_GAP 20 //幀間隔復位值(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()
{
//CC1100復位《CC1100_MCU_z.c》。
CC1100_Reset();
//芯片切換到IDEL狀態《CC1100_func.c》。
turn_IDLE();
//配置CC1100寄存器《CC1100_SMARTRF.c》。
CC1100_Config();
//SLEEP或XOFF時不保留這些寄存器,故喚醒后必須恢復。《CC1100_func.c》
Recover_TEST();
//根據本應用補充變更配置CC1100《CC1100_func.c》
CC1100_function();
//工作單元清零,啟動定時器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 )
{//無線發射最后分組。
FTX_len = URX_i; //URX收到的字節數
URX_i = 0;
switch_URX_buf();
RF_case = FTX_start; //啟動無線發射任務
}
}
if ( FRX_time && (!(--FRX_time)) )
{//FRX結束
S_FRX = 0;
}
}//《1ms定時到時·結束》
switch ( RF_case ) //GDO0=0x06, GDO2=0x07。
{//《任務調度·開始》
//無線發射任務
case FTX_start:
{//無線發射1個分組。
turn_IDLE();
Write_URX_buf_33(); //發射1個分組+字節數。
turn_FTX();
RF_case = FTX_wait;
break;
}
case FTX_wait:
{//等待發射完。
if ( !CC1100_GDO0 )
{//1個分組發完。
clear_TXFIFO();
Start_FRX(); //切換到FRX
}
break;
}
//無線接收任務
case FRX_idle:
{//FRX等待同步字
if ( CC1100_GDO0 )
{//FRX收到同步字
RF_case = FRX_wait;
}
break;
}
case FRX_wait:
{//等待FRX收完
if ( !CC1100_GDO0 )
{//FRX收完
RF_case = FRX_end;
}
break;
}
case FRX_end:
{//收到1個分組
if ( CC1100_GDO2 )
{//收到1個分組
if ( !S_FRX )
{
S_FRX = 1; //FRX燈亮。
switch_UTX_buf();
}
FRX_time = 10;
read_UTX_buf_33(); //讀取1個分組+字節數。
//《永久頻率偏差補償》
while ( S_TI0 ); //等待UTX完
S_TI0 = 1;
switch_UTX_buf(); //切換UTX緩沖區,啟動UTX。
TI0 = 1; //啟動UTX
}
clear_RXFIFO(); //清除溢出錯誤。
Start_FRX(); //啟動FRX。
break;
}
default: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 )
{
if ( !S_URX )
{//URX:1號緩沖區,FTX:0號緩沖區
URX_ptr = &UART_buf_1;
FTX_ptr = &UART_buf_0;
}
else
{//URX:0號緩沖區,FTX:1號緩沖區
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:1號緩沖區,FRX:0號緩沖區
UTX_ptr = &UART_buf_1;
FRX_ptr = &UART_buf_0;
}
else
{//UTX:0號緩沖區,FRX:1號緩沖區
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燈亮。
URX_i = 0;
switch_URX_buf();
}
URX_time = URX_GAP; //重置幀間隔
*URX_ptr = SBUF0;
URX_ptr++;
URX_i++;
if ( URX_i== 32 )
{//URX收到1個分組。
FTX_len = 32; //URX收到的字節數
URX_i = 0;
switch_URX_buf();
RF_case = FTX_start; //啟動無線發射任務
}
}
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 + -