/******************************************************************************
Filename: radio.c
Target: cc2430
Revised: 16/12-2005
Revision: 1.0
******************************************************************************/
#include "cul.h"
extern volatile BYTE sppRxStatus;
extern volatile BYTE sppTxStatus;
__no_init SPP_RX_STRUCT rxData @ "PM0_XDATA";
__no_init SPP_TX_STRUCT txData @ "PM0_XDATA";
//-----------------------------------------------------------------------------
// See cul.h for a description of this function.
//-----------------------------------------------------------------------------
void radioInit(UINT32 frequency, BYTE localAddress) //函數來初始化射頻系統,設置通信頻率和本節點位址
{
sppInit(frequency,localAddress);
return;
}
//-----------------------------------------------------------------------------
// See cul.h for a description of this function.
//初始化射频系统完成后即可函數來發送資料了
//-----------------------------------------------------------------------------
BOOL radioSend(BYTE* transmitData, WORD dataLength, BYTE remoteAddress, BYTE doAck)
{
WORD sent = 0; //发送字节数
BOOL status = TRUE; //状态标志位
WORD remaining; //剩余字节
BYTE retries;
BYTE res;
txData.destAddress = remoteAddress; //数据目的地址赋值
txData.flags = doAck; //标志位赋值
while((sent < dataLength) && (status == TRUE)) // 如果数据长度大于0(有数据
{
retries = ACK_RETRIES; //重试3次 #define ACK_RETRIES 3
txData.payload = transmitData + sent; //添加数据量
remaining = dataLength-sent; //剩余字节计算
if(remaining > SPP_MAX_PAYLOAD_LENGTH) //#define SPP_MAX_PAYLOAD_LENGTH 122
{
txData.payloadLength = SPP_MAX_PAYLOAD_LENGTH;
sent += SPP_MAX_PAYLOAD_LENGTH;
}
else
{
txData.payloadLength = dataLength;
sent += dataLength;
}
while(retries) //重发数据
{
res = sppSend(&txData); //重新发送数据,SPP(Simple Packet Protocol)
if(res == CHANNEL_BUSY) // #define CHANNEL_BUSY 0x04
{
halWait(10); //等待
retries--; //次数减少
if(retries == 0)
{
status = FALSE; //所有重试进行完之后仍然忙,置状态为堵塞
}
}
else
{
retries = 0; //如果线路不忙则停止重试直接发送
}
}
while(sppTxStatus == TX_IN_PROGRESS);// #define TX_IN_PROGRESS 0x80
if(sppTxStatus == DEST_UNREACHABLE) // #define DEST_UNREACHABLE 0x20
{
status = FALSE;
}
}
return status; //返回状态值
}
//-----------------------------------------------------------------------------
// See cul.h for a description of this function.
// 初始化射频系统完成后即可函數來接收資料了,接收数据包
//功能介绍:这个函数使能接收 128字节,包括头和尾。接收数据通过 DMA传输到 pReceiveData。
// DMA装备同时接收开启。接收数据将触发 DMA,当所有的数据包接收并且移走,DMA产
// 生一个中断同时运行以前定义的函数 rxCallBack。
//-----------------------------------------------------------------------------
BOOL radioReceive(BYTE** receiveData, BYTE* length, WORD timeout, BYTE* sender)
{
BOOL status = TRUE; //状态字
BOOL continueWaiting = TRUE; //是否连续等待状态字
BOOL useTimeout = FALSE; //是否使用超时状态字
if(timeout) //接收超时
{
sppReceive(&rxData); //接收数据
}
while((sppRxStatus != RX_COMPLETE) && (continueWaiting)) // #define RX_COMPLETE 0x10
{
if(useTimeout) //使用超时状态字
{
halWait(0x01); //等待
timeout--; //自减
if(timeout == 0) //不超时
{
continueWaiting = FALSE; //停止继续接受
status = FALSE; //状态置0
STOP_RADIO(); //停
}
} //
}
if(status == TRUE) //状态正确
{
*receiveData = rxData.payload;; //接收数据 //
*length = rxData.payloadLength; //接收数据长度 //
*sender = rxData.srcAddress; //接受数据的源地址 //
}
return status; //返回状态
}