CC2530无线中断接收问题

aadyx2010 2013-07-04 10:27:55
各位大虾,小弟初学zigbee,现在做了一个无线串口,问题是每次都只能进一次RF的接收中断,数据是正确的,接收到数据之后,连串口接收中断都进不去,全局只用了RF接收和串口接收中断,代码如下(两个班子烧同样的代码):


#include "include.h"
#include "wav.h"
#include "cmd.h"
#include "adc.h"

#define T1Base (Fosc/128/1000) //1ms注意溢出
uint T1TIME=300; //间隔时间长度
uint T1COUNT=0;



#define uint unsigned int
#define uchar unsigned char

#define Fosc 32000000
//#define datalen 1//20440


#define UART_CMD_LEN 3


void Delay(uint temp);

void RF_Init(void);//RF初始化
//RF 发数 长度= UART_CMD_LEN
void RF_Send(char* CmdData);

bit sendEN=0;




char txbuff[UART_CMD_LEN]={0x00};
char rxbuff[UART_CMD_LEN]={0x00};

char flag=0;
/*UART0通信初始化
-------------------------------------------------------*/
void Uart0Init(void)
{
//设置P0.2与P0.3时用
// P0SEL |= 0x0C; //初始化UART0端口,设置P0.2与P0.3为外部设备IO口
// PERCFG&= ~0x01; //选择UART0为可选位置一,即RXD接P0.2,TXD接P0.3

P1SEL |= (1<<4)|(1<<5); //初始化UART0端口,设置P1.4与P1.5为外部设备IO口
PERCFG|= (1<<0); //选择UART0为可选位置2,即RXD接P1.4,TXD接P1.5

U0CSR = 0xC0; //设置为UART模式,并使能接受器

U0GCR = 11;
U0BAUD = 216; //设置UART0波特率为115200bps

URX0IE=1; //使能接受中断
EA=1;
}



/*UART0发送字符串
-------------------------------------------------------*/
void senduart0(unsigned char *Data,unsigned char len)
{
unsigned char j=0;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
//换行
UTX0IF = 0;
}

/*UART0接收中断
-------------------------------------------------------*/
void Uart0Receive_Interrupt(void) interrupt URX0_VECTOR
{

static i=0;
EA=0;
URX0IF=0;
txbuff[i++]=U0DBUF;
U0DBUF=txbuff[i-1];
flag=1;
EA=1;

}

void delay(unsigned char time)
{
unsigned char i,j;
for(i=0;i<=time;i++)
{
for(j=0;j<=200;j++)
{

}
}
}

//RF初始化
void RF_Init(void)
{
// Enable auto ack and auto crc
FRMCTRL0 |= (0x20 | 0x40);

// Recommended RX settings
TXFILTCFG = 0x09;
AGCCTRL1 = 0x15;
FSCAL1 = 0x00;

//FRMFILT0=1; //帧过滤开启
//RFIRQM1 |= (1<<1);//TXDONE发生中断使能
//IEN2 |= (1<<0);

// enable RXPKTDONE interrupt
RFIRQM0 |= (1<<6);
// enable general RF interrupts
IEN2 |= (1<<0);


SHORT_ADDR0=TX_ADDR;
SHORT_ADDR1=TX_ADDR>>8;
PAN_ID0=(PAN_ID);
PAN_ID1=(PAN_ID>>8);
EA=1;
// RFST = 0xEd;
RFST = 0xed; /* ISFLUSHRX */ //
//RFST=0xED;
RFST = 0xe3; /* ISRXON */
delay(12000); delay(12000); delay(12000); delay(12000); delay(12000); delay(12000); delay(12000); delay(12000); delay(12000);
FRMFILT0&=~(1<<0);//禁止帧过滤
RFST = 0xED;//ISFLUSHRX()
RFST = 0xE3;//ISRXON()


}


//RF 发数 长度= UART_CMD_LEN
void RF_Send1(char* CmdData)
{
unsigned char i;
RFST = 0xe3; /* ISRXON */
/* wait for SFD not active and TX_Active not active */
while (FSMSTAT1 & ((1<<1) | (1<<5))); /* TX_ACTIVE | SFD */
RFIRQM0 &= ~(1<<6); /* disable RXPKTDONE interrupt */
IEN2 &= ~(1<<0); /* disable general RF interrupts */
RFST = 0xee; /* ISFLUSHTX */
RFIRQF1 = ~(1<<1); /* clear TXDONE interrupt */
//RFD = 0xA7; /* the first byte to TX is the length of the frame */
RFD=UART_CMD_LEN+2;
for (i = 0; i < UART_CMD_LEN; i++)
{

RFD = CmdData[i];

}
/* trun on RX interrupt */
RFIRQM0 |= (1<<6); IEN2 |= (1<<0);
RFST = 0xe9; /* ISTXON */
while (!(RFIRQF1 & (1<<1))); /* waiting for transmission to finish */
RFIRQF1 = ~(1<<1); /* clear TXDONE interrupt */
}


void RF_Send(char* CmdData)
{
char i=0;
// Uart0Send(1);
RFST =0xEE; //清发送缓冲

RFD=UART_CMD_LEN+2; //<<<<-----******注意
for(i=0;i<UART_CMD_LEN;i++)
{
RFD=CmdData[i];
}

RFST=0xe9; //写发送命令


while( (RFIRQF1&(1<<1)) ==0 ); //等待发送结束

// P1=~P1;
RFIRQF1=0;


}



void RF_Int(void) interrupt RF_VECTOR
{
unsigned char i,len;
EA = 0; /* disable global interrupt */
if (RFIRQF0 & (1<<6)) {
len = RFD;
len &= 0x7f;
for (i = 0; i < len; i++)
{
rxbuff[i] = RFD;
}
}
RFIRQF0 &= ~0x40; /* clear RXPKTDONE interrupt */
S1CON &=~0x03; /* clear general RF interrupt flag */
// IEN2 &=~(1<<0);
RFST=0xED;
senduart0(rxbuff,len);
U0DBUF=0xaa;
}



//T1初始化
void T1_Init(void)
{
T1CC0H=(T1Base)>>8;
T1CC0L=T1Base; //和晶振分频有关
T1CCTL0|=(1<<2);
T1CTL=0x0e; //128分频计数到T1CC0
T1IE=0;
EA=1;
}
void T1_Interrupt(void) interrupt T1_VECTOR
{
if(T1STAT&(1<<5)!=0)
{
T1COUNT++;
if(T1COUNT>=T1TIME)
{
sendEN=1;
T1COUNT=0;
}
}
}

//////////////////////////
void main(void)
{

//CLKCONCMD=0x80;
EA=0;
SLEEPCMD &= ~0x04;
while(!(SLEEPSTA & 0x40));
CLKCONCMD &= ~0x47;
SLEEPCMD |= 0x04;
Uart0Init();
IEN2|=1<<4;


//T1_Init();
//T1IE=1;
sendEN=0;

RF_Init();
EA=1;

while(1)
{

if(flag==1)
{

RF_Send(txbuff); //启动一次发射
flag=0;
//RF_Init();

}


}

}
...全文
1175 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
LonganWang1983 2014-07-10
  • 打赏
  • 举报
回复
你的定时器开启中断后能正常运行RF吗?
rejoice818 2013-08-16
  • 打赏
  • 举报
回复
你好我买了2个CC2540想做传透,不过没找到任何这方面的资料,因为之前没接触过蓝牙,希望能分享些资料,我email:anson_x@smartmcu.com
aadyx2010 2013-08-06
  • 打赏
  • 举报
回复
呵呵,一起学习。这个问题解决了,很低级的错误,RF的接收终端里面没有开全局的中断,打开就一切正常了。
lingdufeng123 2013-08-01
  • 打赏
  • 举报
回复
楼主好运,俺也在学习呢
cc2530中文数据手册完全版 非常详细的解释)好东西TEXAS 蜂舞 INSTRUMENTS www.zlgbee-sh.c FENG WI 郑州新双恒 www.ti.com 36寄存器 ∴51 4电源管理和时钟 n52 4.1电源管理简介 53 4.1.1主动和空闲模式 4.1,2PM1.54 4.1.3PM2. 54 4.1.4PM3.54 4.2电源管理掉制 54 4.3电源管理寄存器 55 4.4振荡器和时钟 58 4.4.1振荡器 4.4.2系统时钟 ■1■■■1■■■■■■■■■■■■■■1■■1■■■■1■■1■■■■■1■■■1■■■ 58 4.4.332kHz振荡器 59 4.4.4振荡器和时钟寄存器.….….….………………………………59 4.5定时器标记产生,,… 61 4.6数据保留 61 5复位 62 5.1上电复位和布朗输出探测器 ■1■■■■■1■■Ⅱ■ 63 5.2时钟丢失探测器 ■■1着面D 6闪存控制器 ∴64 6.1闪存存储器组织 65 62闪存写 :日. 65 6.2.1闪存写步骤 65 6.2.2写多次到一个字 6.2.3DMA內存写.… 氰66 6.2.4CPU闪存写. ■1■■DD■_■ ■■■■1■■D■■ 67 6.3闪存页面擦除 67 6.3.1从闪存存储器执行闪存擦除 68 64闪存DMA触发 68 6.5闪存控制器的寄存器.…, ■1■■■■ ,68 70端口 1■D1D■I■111■■DI日■■1日BD1D■ l■■D■■1■ ,70 7.1未使用的I/O引脚 71 7.2低I/O电压 ■■■1■■■■1 71 7.3通用I/O 71 7.4通用I/O中断 7.5通用I/ODMA 72 7.6外设I/O 72 7.6.1定时器1. ■■■■■1 1■■■■■■■Ⅱ■■ ■■■■■■■■■1 ,73 7.62定时器3 7.6.3定吋器4. ,74 7.6. 4 USART O 74 7.6.5 UsarT 1 74 SWRUI91-April 2009 提交文件反馈 TEXAS 蜂舞 INSTRUMENTS www.zlgbee-sh.c FENG WI 郑州新双恒 www.ti.com 7.6.6ADC 75 7.7调试接口 75 7.832 KHZ XOSO输入 75 7.9无线测试输出信号 75 7.10掉电信号MUX(PMUX).,,,,,,…,,,,, 75 7.11I/O引脚. 75 8DMA控制器 ■■■■■■■■■■ ■■■■■■1■Ⅱ■■■■■1■ ■■1■■■■1 ∴∴83 8.1DMA操作 84 82DMA配置参数. 86 8.2.1溴地址, 1■■1■■ 86 8.2.2日标地址. 口口■ 86 8.2.3传送数量 .86 8.2.4VLEN设置 n87 8.2.5触发事件 :.::a:a::. .87 8.2.6溴和目标增量. IIII. ■■■ ■■1■■ ■■■■■■1■■■ ∴∴87 8.2.7DMA传输模式… 88 8.2.8DMA优先级. 8.2.9字节或字传输 ::.::::::::::日日:日1:.:a..::::::a:E:::::::::::::日 88 8.2.10屮断屏蔽 88 8.2.11模式8设置 88 8.3DMA配置安装 88 8.4停止DMA传输… 89 8.5DMA中断 ∴89 8.6DMA配置数据结构 89 8.7DMA存储访问 8.8DMA寄有器. l■■1■■■■■■■■■■■I ■■1■■ 92 9定你器(16位定时器) ,■ 94 9.116位计数器 .95 92定时器1操作 95 9.3自由运行模式 1■■■■1■■D■■■Ⅱ■1■D■■1D■■■1D■1■■■■1■1D重■D1■■日■1■■■面111■■D■ 95 9.4模模式.… 96 9.5正计数/倒计数模式 ∴96 9.6通道模式控制., 97 9.7输入捕获模式.…. 97 9.8输出比较模式... ■■ 97 9.9IR信号产牛和线性化. n,102 9.9.1简介 ∴102 9.9.2调制码 ■■_■■■■■■ 102 99.3非调制码 103 9.9.4学习. 104 9.9.5其他注意事项 1■■■■■1■■■■■■1■■1■着■1日■■■■■■■重■ l■■1■■■重1■■ ,104 9.10定时器1中断 104 SWRUI91-April 2009 提交文件反馈 TEXAS 蜂舞 INSTRUMENTS Www.z1gbee-sh. C FENG WI 郑州新双恒 www.ti.com 9.11定时器1DMA触发… 104 9.12定时器1寄存器 :::::::日aa 105 9.13作为数组访问定时器1寄存器 ■ ∴1
以GPS秒脉冲为复位信号及开始计时的时间基准,同时作为无线发射的触发信号。 计时由CPLD计数时钟脉冲实现,当发射机发射完毕后CC1100模块给出中断,中止主机CPLD的计时,得到发射时间脉冲数n1; 当接收机CC1100接收到数据包后,给出中断,提醒单片机处理,并且中止接收部分CPLD的计时,得到收到时间脉冲数n2。 由n2-n1乘以时钟周期可得电波的传播时间。 现在cpld用24MHz晶振,每个计数脉冲40Ns,对应距离为12.5m。 要进一步减小误差,可以通过提高cpld晶振频率或用更加精确的计时方法实现。 具体过程自己看程序,试验数据略 压缩包内容: 基于CC1101和CPLD的时差法测距实验.doc 实验的简单说明。 CPLD程序:相关VHDL源程序, 实验中实际用的是“CPLD程序/Timer FOR CC1101/timer32+div.vhd” PCB: CC1100配合NewMsg-RF1100模块的电路板(A,B号板); CC1100+PA 1配合NewMsg-RFC1100A的电路板(加放大,距离较远)(C号板); Connector 在CC1100模块的电路板上应用NewMsg-RFC1100A的转接头。 实验中用的是NewMsg-RF1100模块既A,B号板。 单片机程序:配合实验的单片机程序,(A,B号板和C号板程序通用,用NewMsg-RFC1100A模块时只需加转接座) 实际用的“C板 8 距离测试”程序 实验照片:实验时的事物照片,手机拍摄,效果一般。 无线模块资料:实验用到无线模块的资料。GPS模块和CPLD资料略。 2009年7月22日 沨
【RT-Thread作品秀】远程调试终端作者:钟良涛 概述本设计灵感来源于调试人员出差调试设备遇到困难时,提供指导的工程师可以远程实时查看调试数据,以提供指导。本设计实现了一个远程调试助手,ART-Pi接收无线串口按一定协议发送的数据后,将数据解析并打包为json格式发送给订阅该话题的MQTT上位机。搭配ART-Pi Mate可实现多种通信接口的调试。 开发环境硬件:ART-Pi ART-Pi Mate(自主设计) RT-Thread版本:4.0.3 开发工具及版本:RT-Thread Studio 2.0.0 PyCharm20.2 Python3.7 RT-Thread使用情况概述组件:finsh、lwIP、SPI、串口、Pin 软件包:cjson、wlan_wiced、phaomqtt、AT command 内核:信号量、多线程 硬件框架硬件框图如上图所示,硬件部分由ART-Pi和ART-Pi Mate和以CC2530无线透传模块模拟的调试设备组成。其中ART-Pi Mate为专为ART-Pi设计的扩展板,包含LCD、UART、NRF24L01等功能。 以CC2530无线透传模块模拟待调试的设备,将该模块连接到PC机,按照固定的协议格式发送数据包到ART-Pi Mate上焊接的CC2530无线透传,ART-Pi以串口中断的方式进行数据读取并解析,随后将数据打包为Json格式通过Wifi发送至MQTT上位机。 软件框架说明该应用中软件分为嵌入式软件部分和桌面端软件。嵌入式软件实现调试终端的数据接收、解析、打包、发布等功能,桌面端软件实现数据的接收和显示功能。软件流程如上图所示,调试终端数据处理线程对CC2530无线透传模块发送的数据进行解析、打包,然后由MQTT客户端线程进行数据发布。桌面端软件的MQTT客户端线程订阅调试终端发送的话题,然后通过信号槽的方式通知Qt界面线程刷新界面以显示数据。 软件模块说明数据接收模块: 数据接收模块通过串口中断的方式实现,首先以中断的方式打开串口设备,然后每当有数据达到时,触发相应的中断回调函数,在中断回调函数里发送有数据到达的信号量,通知数据处理线程进行数据读取。 数据解包: 数据包的格式定义如下: 以状态机的方式进行数据解包,状态机转移图如下图所示: 数据打包: 该设计将JSON打包为如下格式: 演示效果演示视频: 比赛感悟通过本次比赛熟悉了rt-thread的操作系统以及rt-thread studio的使用方式,被rt-thread优雅的设计所折服。通过这次比赛,使用了rt-thread的线程、信号量、设备模型、组件、软件包等功能,在搭配rt-thread studio进行开发时,是非常的便捷的,直接在设置中打开对应的功能,rt-thread studio就会自动下载好相应的资源并为我们配置好,使原本复杂的配置过程简单化,极大程度的提高了开发效率。 在参赛过程中也遇到了不少问题,其中包括开发板启动不成功,最后通过重新刷写bootloader解决;还有出现了线程堆栈溢出,通过调整堆栈大小解决;还有自己编写的软件模块在重新配置软件包后在工程中消失的问题,最后重新新建源代码文件夹解决;选择MQTT软件包并使能例程后,源代码中没有对应代码,最后发现和软件包版本有关系。总之,开发过程中遇到了一些大大小小的问题,但解决问题的过程就是能力提升的过程,也很感谢主办方提供的这次宝贵的比赛机会。

3,846

社区成员

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

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