cc2530无线点对点通信,不用协议栈,直接操作寄存器实现。

mhsjmm 2015-06-10 09:45:13
各位仁兄,我想通过最底层的寄存器操作,在节点1上发送数据,在节点2上通过中断读取数据。(不使用协议栈)可是,现在的问题是,程序运行到 while (!(RFIRQF1 &(1<<1) )); 就不向下执行了,难道是没发送成功?各位有没有知道原因的,麻烦解释下,谢谢了~~。附上节点1程序,节点2差不多,就多一个点亮LED的程序。
#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;
}
...全文
4167 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jh_courage 2019-02-27
  • 打赏
  • 举报
回复
你好!
请问你最后是怎么做的,我的代码也是卡在那个
while (!(RFIRQF1 &(1<<1) ));
求解!
王老六六六六 2016-07-27
  • 打赏
  • 举报
回复
怎么解决的,版主怎么也不结贴呢,我试了一下也是卡在你说的那个位置
__Parrot 2015-07-23
  • 打赏
  • 举报
回复
是怎么解决的?
mhsjmm 2015-06-11
  • 打赏
  • 举报
回复
没人 ?我已经解决了~~

3,849

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 无线
社区管理员
  • 无线
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧