搞了整整一天,参考了很多大侠的学习记录,才完成这个点对点通信实验,结果却是因为我串口TXRX接错引脚了,所以串口才一直没有显示,还是自己太马虎,下面记录下我的学习过程:
1、实验设备:
CC2430模块两块,一个做RX模块,一个做TX模块
2、实现功能:
TX模块向RX模块发送固定字符串“HelloWorld”,RX模块与PC机串口相连,收到数据后,送到PC机上显示。
3、实验中有关射频收发的重要函数:
1)射频初始化函数
BOOL sppInit(UINT32 frequency, BYTE address)
功能描述:初始化简单的数据包装协议Simple Packet Protocol (SPP),从 DMA 管理器申请两个 DMA通道,用于分别从 Rx FIFO 和 Tx FIFO 传输数据。定时器4管理器同样被设置,这个单元用于在数据包发送后接收器在一定时间内没有返回应答时产生中断。无线部分配置为发送,工作在特定的频率,在发送时自动计算和插入和检查CRC值。
参数描述:
UINT32 frequency:RF 的频率(kHz.);
BYTE address:节点地址
返回:配置成功返回TRUE,失败返回FALSE
2)发送数据包函数
BYTE sppSend(SPP_TX_STRUCT* pPacketPointer)
功能描述:发送length 字节的数据(最多122),标志,目的地址,源地址在Tx DMA 通道传送有效载荷到Tx FIFO前插入,如果期望应当,设置相应的标志。
参数:SPP_TX_STRUCT*pPacketPointer:发送数据包头指针
返回:发送成功返回TRUE,失败返回FALSE。
3)接收数据函数
void sppReceive(SPP_RX_STRUCT *pReceiveData)
功能描述:这个函数使能接收128 字节,包括头和尾。接收数据通过DMA 传输到pReceiveData。DMA装备同时接收开启。接收数据将触发DMA,当所有的数据包接收并且移走,DMA产生一个中断同时运行以前定义的函数rxCallBack。
参数:SPP_TX_STRUCT* pPacketPointer:接收数据包头指针
返回:无
4)射频初始化应用函数
void initRfTest(void)
{
UINT32 frequency =2405000;
INIT_GLED();
INIT_YLED();
radioInit(frequency, myAddr);
}
这个函数实际上还是通过radioInit(frequency,myAddr调用了sppInit(frequency,localAddress)初始化了射频。
5)发送状态函数
void contionuousMode(void)
{
BOOL res;
BYTE sendBuffer[] = "HelloWorld";//要发送的固定字符串
while(1)
{
GLED = LED_OFF;
YLED = LED_ON;
res = radioSend(sendBuffer, sizeof(sendBuffer), remoteAddr,DO_NOT_ACK );
//在radioSend函数中调用了sppSend函数
halWait(200);
YLED = LED_OFF;
halWait(200 );
if(res == TRUE)
{
GLED = LED_ON;
halWait(200);
}
else
{
GLED = LED_OFF;
halWait(200);
}
}
}
6)接收数据状态函数
void receiveMode(void)
{
BYTE* receiveBuffer;
BYTE length;
BYTE res;
BYTE sender;
while(1)
{
YLED =LED_ON;
res = radioReceive(&receiveBuffer,&length, RECEIVE_TIMEOUT,&sender);
//在radioReceive函数中调用了sppReceive函数
YLED =LED_OFF;
if(res ==TRUE)//res为是否收到数据包状态字
{
GLED =LED_ON;
halWait(200);
UartTX_Send_String(receiveBuffer,length);//实现PC机串口显示
}
else
{
GLED = LED_OFF;
halWait(200);
}
GLED = LED_OFF;
}
}
4、实现RX模块与串口通信需要添加修改的几个函数
串口初始化函数
void initUART(void)
{
// Setup for UART0
IO_PER_LOC_UART0_AT_PORT0_PIN2345();
SET_MAIN_CLOCK_SOURCE(CRYSTAL);
UART_SETUP(0, 57600,HIGH_STOP);
UTX0IF =0;//UART0 TX中断标志初始置位0 TX
}
串口发送函数
void UartTX_Send_String(BYTE *Data,int len)
{
int j;
for(j=0;j
{
U0DBUF =*Data++;
while(UTX0IF== 0);
UTX0IF =0;
}
}
详细解释参考阿元大侠的http://blog.sina.com.cn/s/blog_4c82872301008zyp.html
5、烧写64位物理地址
刚开始不知道为啥还要烧写位物理地址,也不知道该怎么填写自己设备的物理地址,后来看了程序代码中有这么一段:
void rf_test_main(void)
{
INT_GLOBAL_ENABLE(INT_ON);
#ifdef RX
{
myAddr =ADDRESS_0;//0x01接收模块地址0x01
remoteAddr =ADDRESS_1;//0x02远程模块地址0x02
initRfTest();//射频初始化应用函数
receiveMode();//接收状态函数
}
#else
{
myAddr =ADDRESS_1;//0x02 发送模块地址0x02
remoteAddr =ADDRESS_0;//0X01远程模块地址0x01
initRfTest();
contionuousMode();//发送状态函数
}
#endif
}
于是按照烧写物理地址的步骤,将RX模块的物理地址写为00 00 00 00 00 00 00 01,将TX模块的物理地址写为00 0000 00 00 00 00 02
6、下载运行后结果