佚名通过本文主要向大家介绍了cc2530点对点通信,cc2530点对点无线通信,点对点通信,点对多点通信,zigbee点对点通信等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:cc2530无线点对点通信,不用协议栈,直接操作寄存器实现。
描述:
。附上节点1程序,节点2差不多,就多一个点亮LED的程序。
描述:
本帖最后由 mhsjmm 于 2015-06-10 21:47:53 编辑
c语言通信软件数据栈
各位仁兄,我想通过最底层的寄存器操作,在节点1上发送数据,在节点2上通过中断读取数据。(不使用协议栈)可是,现在的问题是,程序运行到 while (!(RFIRQF1 &(1<<1) )); 就不向下执行了,难道是没发送成功?各位有没有知道原因的,麻烦解释下,谢谢了~~
#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&