#include "ioCC2530.h"
char rf_rx_buf[128];
char serial_rxbuf[128]; // 串口接收缓冲区
int serial_rxpos = 0;
int serial_rxlen = 0;
char is_serial_receive = 0;
void uart0_init();
void uart0_sendbuf(char *pbuf , int len);
void uart0_flush_rxbuf();
void rf_send( char *pbuf , int len);
void rf_receive_isr();
void uart0_init()
{
PERCFG = 0x00; // UART0 选择位置0 TX@P0.3 RX@P0.2
P0SEL |= 0x0C; // P0.3 P0.2选择外设功能
U0GCR |= 10; // 查表获得 U0GCR 和 U0BAUD
U0BAUD |= 216; // 57600
U0CSR |= 0xC0; // UART模式 接收器使能
//UTX0IF = 1;
URX0IE = 1; // 使能接收中断 IEN0@BIT2
}
void uart0_flush_rxbuf()
{
serial_rxpos = 0;
serial_rxlen = 0;
}
void rf_init()
{
TXPOWER = 0xD5; // 发射功率为1dBm
//FRMCTRL0 |= (0x20 | 0x40); /* AUTO_ACK | AUTO_CRC */
CCACTRL0 = 0xF8; // 推荐值 smartRF软件生成
FRMFILT0 = 0x0c; // 静止接收过滤,即接收所有数据包
FSCAL1 = 0x00; // 推荐值 smartRF软件生成
TXFILTCFG = 0x09;
AGCCTRL1 = 0x15;
//AGCCTRL2 = 0xFE;
//TXFILTCFG = 0x09; // 推荐值 smartRF软件生成
FREQCTRL = 0x0B; // 选择通道11
RFIRQM0 |= (1<<6); // 使能RF数据包接收中断
IEN2 |= (1<<0); // 使能RF中断
RFST = 0xED; // 清除RF接收缓冲区 ISFLUSHRX
RFST = 0xE3; // RF接收使能 ISRXON
}
void rf_send( 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) )); // 等待发送完成
P0_0 = ~P0_0;
RFIRQF1 = ~(1<<1); // 清除发送完成标志位
RFIRQM0 |= (1<<6); // RX接收中断
IEN2 |= (1<<0);
}
void rf_receive_isr()
{
int rf_rx_len = 0;
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 = 0xED; // 清除接收缓冲区
if( crc_ok & 0x80 )
{
uart0_sendbuf( rf_rx_buf , rf_rx_len); // 串口发送
uart0_sendbuf(r,1);
}
else
{
uart0_sendbuf("CRC Error",9);
}
}
void main(void)
{
P0DIR |= 0x01; //设置P0.0为输出方式;P0.4和P0.5为输入方式
P2DIR |= 0x01; //设置P2.0为输出方式
P0_0 = 1;
P2_0 = 1; //熄灭LED
EA = 0; // 暂时关闭全局中断
SLEEPCMD &= ~0x04; //选择32M晶振
while(!(SLEEPSTA & 0x40)); //等待XSOC稳定
CLKCONCMD &=~0x47; //TICHSPD 128分频,CLKSPD 不分频!!!!!
SLEEPCMD |= 0x04; //关闭不用的RC 振荡器
/* if(!(CLKCONSTA &(1<<6)))
{
P0_0 =~P0_0;
} */
uart0_init(); // 串口初始化 57600
rf_init(); // RF初始化 无帧过滤
EA = 1; // 使能全局中断
while(1)
{
if( is_serial_receive ) // 接收到串口数据包
{
is_serial_receive = 0; // 清除标志位
rf_send(serial_rxbuf , serial_rxlen); // 直接转发串口数据
uart0_flush_rxbuf(); // 清除串口接收缓冲区
}
}
}
/* int putchar(int c)
{
while( !UTX0IF );
UTX0IF = 0;
U0DBUF = c;
return c;
} */
void uart0_sendbuf(char *pbuf , int len)
{
for( int i = 0 ; i < len ; i++)
{
U0DBUF = *pbuf++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
#pragma vector=URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; // 清除接收中断标志
serial_rxbuf[serial_rxpos] = U0DBUF; // 填充缓冲区
//serial_rxpos++;
//serial_rxlen++;
is_serial_receive = 1;
P2_0 =~P2_0;
}
#pragma vector=RF_VECTOR
__interrupt void rf_isr(void)
{
unsigned char e;
//P2_0 = ~P2_0; // LED1翻转 提示作用
e = EA;
EA = 0;
// 接收到一个完整的数据包
if (RFIRQF0 & ( 1<<6 ))
{
rf_receive_isr(); // 调用接收中断处理函数
S1CON &=~0x03; // 清除RF中断标志
RFIRQF0 &= ~(1<<6); // 清除RF接收完成数据包中断
}
EA = e;
}
3 个解决方案
#1
没人 ?我已经解决了~~
#2
是怎么解决的?
#3
怎么解决的,版主怎么也不结贴呢,我试了一下也是卡在你说的那个位置
#1
没人 ?我已经解决了~~
#2
是怎么解决的?
#3
怎么解决的,版主怎么也不结贴呢,我试了一下也是卡在你说的那个位置