求大侠帮我分析 CC2530无协议栈通信 接收异常
时间:10-02
整理:3721RD
点击:
代码如下,我有两块板子,一个发送,一个接受,代码共用,一个mode=MODE_RX,一个mode=MODE_TX。
发送端一直在发送,指示灯有闪烁。
接收端只有在上电的时候,有进入中断一次,灯闪烁一次,串口输出“RX”,然后就没有动静了。
在发送端不掉电的情况下,让接收端复位或者重新上电,依然是有进入中断一次,灯闪烁一次,串口输出“RX”,然后就没有动静了。
之前有调用过rf_receive_isr()去读接收数据,接收的数据就是TX发送的。
为什么接收端指闪烁一次灯呢?求大侠指点。
#include <ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char
//定义控制灯的端口
#define LED1 P0_0 //定义LED1为P1.0口控制
#define LED2 P0_1 //定义LED4为P0.1口控制
#define LED1_ON LED1=0
#define LED1_OFF LED1=1
#define LED2_ON LED2=0
#define LED2_OFF LED2=1
//函数声明
void Delay(uint); //延时函数
void InitIO(void); //初始化LED控制IO口函数
void uart0_init(void);
void uart0_sendbuf(unsigned char *pbuf , int len);
void rf_init(void);
void rf_send(unsigned char *pbuf , int len);
void rf_receive_isr(void);
unsigned char hellostr[]={'H','e','l','l','o'};
unsigned char startstr[]={'S','t','a','r','t'};
unsigned char overstr[]={'O','v','e','r'};
unsigned char rf_rx_buf[128];
char mode=0;
#define MODE_TX 0
#define MODE_RX 1
char isRecieve=0;
void main(void)
{
Delay(50000);
CLKCONCMD &=(~0x47);
Delay(50000);
mode=MODE_RX;
InitIO(); //初始化
uart0_init();
rf_init();
if(mode==MODE_RX)
{
EA=1;
}
while(1) //死循环让循环内的代码不断执行
{
if(mode==MODE_TX)
{
LED1_ON;
Delay(50000);
LED1_OFF;
Delay(50000);
uart0_sendbuf(startstr,5);
rf_send(hellostr,5);
uart0_sendbuf(overstr,4);
Delay(50000);
Delay(50000);
Delay(50000);
Delay(50000);
Delay(50000);
}else
{
if(isRecieve==1)
{
LED2_ON;
Delay(50000);
LED2_OFF;
Delay(50000);
uart0_sendbuf("RX",2);
isRecieve=0;
}
Delay(50000);
Delay(50000);
Delay(50000);
Delay(50000);
Delay(50000);
}
}
}
void Delay(uint n) //延时函数
{
uint i; //定义一个变量i;
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
}
void InitIO(void) //初始化IO口程序
{
P0DIR |= 0x03; //P0_1定义为输出
LED1=1;
LED2=1;
}
void uart0_init(void)
{
PERCFG = 0x00; // UART0 选择位置0 TX@P0.3 RX@P0.2
P0SEL |= 0x0C; // P0.3 P0.2选择外设功能
U0GCR |= 10; // 查表获得 U0GCR 和 U0BAUD
U0BAUD |= 59; // 38400
U0CSR |= 0xC0; // UART模式 接收器使能
}
void uart0_sendbuf(unsigned char *pbuf , int len)
{
for( int i = 0 ; i < len ; i++)
{
U0DBUF = *pbuf++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
//RF初始化
void rf_init(void)
{
TXPOWER = 0xD5;
FRMCTRL0 |= (0x20 | 0x40); /* AUTO_ACK | AUTO_CRC */
FRMFILT0 = 0x0C; // 禁止接收过滤,即接收所有数据包
TXFILTCFG = 0x09;
AGCCTRL1 = 0x15;
FSCAL1 = 0x00;
FREQCTRL = 0x0B; /* channel 11 */
if(mode==MODE_TX)
{
}
else
{
RFIRQM0 |= (1<<6); // 使能RF数据包接收中断
IEN2 |= (1<<0); // 使能RF中断
}
SHORT_ADDR0 = 0x05;
SHORT_ADDR1 = 0x00;
PAN_ID0 = 0x22; /* MUST set, or even can't receive broadcast message */
PAN_ID1 = 0x00;
RFST = 0xED; /* ISFLUSHRX */ //
RFST=0xEC;
RFST = 0xE3; /* ISRXON */
Delay(50000);
FRMFILT0&=~(1<<0);//禁止帧过滤
}
void rf_send( unsigned char *pbuf , int len)
{
RFST = 0xE3; // RF接收使能 ISRXON
while( FSMSTAT1 & (( 1<<1 ) | ( 1<<5 )));// 等待发送状态不活跃 并且 没有接收到SFD
RFIRQM0 &= ~(1<<6); // 禁止接收数据包中断
IEN2 &= ~(1<<0); // 清除RF全局中断
RFST = 0xEE; // 清除发送缓冲区 ISFLUSHTX
RFIRQF1 = ~(1<<1); // 清除发送完成标志
// 填充缓冲区 填充过程需要增加2字节,CRC校验自动填充
RFD = len + 2;
for (int i = 0; i < len; i++)
{
RFD = *pbuf++;
}
RFST = 0xE9; // 发送数据包 ISTXON
while (!(RFIRQF1 &(1<<1) )); // 等待发送完成
RFIRQF1 = ~(1<<1); // 清除发送完成标志位
}
void rf_receive_isr()
{
int rf_rx_len = 0;
unsigned char r[1] = {0};
char crc_ok = 0;
rf_rx_len = RFD - 2; // 长度去除两字节附加结果
rf_rx_len &= 0x7F;
for (int i = 0; i < rf_rx_len; i++)
{
rf_rx_buf[i] = RFD; // 连续读取接收缓冲区内容
}
r[0] = RFD - 73; // 读取RSSI结果
crc_ok = RFD; // 读取CRC校验结果 BIT7
RFST = 0xEC; // 清除接收缓冲区
if( crc_ok & 0x80 )
{
uart0_sendbuf( rf_rx_buf , rf_rx_len); // 串口发送
uart0_sendbuf(r,1);
}
else
{
uart0_sendbuf("CRC Error",9);
}
}
#pragma vector=RF_VECTOR
__interrupt void rf_isr(void)
{
unsigned char temp;
temp = EA;
EA = 0;
// 接收到一个完整的数据包
if (RFIRQF0 & ( 1<<6 ))
{
//rf_receive_isr(); // 调用接收中断处理函数
isRecieve=1;
RFST = 0xEC;
S1CON &=~0x03; // 清除RF中断标志
RFIRQF0 &= ~(1<<6); // 清除RF接收完成数据包中断
}
EA = temp;
}
看下RF相关的配置是否有问题,你可以参考basic rf中关于RF的配置。
CC2530-Software Examples (Rev. B)
