TI专家,您好!
我在CC1110芯片组上开发了射频接收器程序,该程序通过ISR例程持续接收射频数据包。 在这个问题中,我还启用了timer0作为时间间隔计数,它每800ms生成一次中断。 但是,我注意到,只要对计时器中断提供服务,CC1110就不再接收数据包(从未再次生成RF数据包接收中断)。 如果我禁用time0中断,RF数据包接收功能将再次恢复正常。 我试图操纵其他计时器,结果也一样。 我只是想知道计时器和RF数据包接收之间是否存在任何连接? 计时器中断处理会对RF接收功能产生什么影响? 以下是计时器例程的快照,供您参考。
#include <ioCC1110.h>
#include <ioCCxx10_bitdef.h>
char flag_1s;
无符号int计数1;
void Timer1_init(void)
{
// 1.清除计时器1通道0中断标志
//硬件会自动清除计时器1的CPU中断标志(IRCON_T1IF)。
T1CTL &=~T1CTL_CH0IF;//0000和 1101 1111111=0
// 2.外围设备SFR中的单个中断启用位
T1CCTL0 |= T1CCTL0_IM; //在通道0上启用中断
T1CCTL1 &=~T1CCTL1_IM; //禁用通道1上的中断
T1CCTL2 &=~T1CCTL2_IM; //禁用通道2上的中断
OVFIM = 0; //禁用溢出中断
// 3.时间1通过设置[IEN1.T1IE=1]启用计时器1中断
T1IE = 1;
//通过设置[IEN0.EA=1]启用全局中断
//EA = 1;
// 5.将通道0设置为比较模式并切换为比较。
T1CCTL0 =(T1CCTL0和~T1CCTL0_CMP)| T1C0_TOG_ON_CMP | T1CCTL0_MODE;// 0101 0100
// 6.将预分频器的值设置为128,以获得的tickspeed
//并将计时器1设置为自由运行模式0000 1101 10us
T1CTL =(T1CTL和~(T1CTL_MODE | T1CTL_DIV))| T1CTL_MODE_FREERUN
| T1CTL_DIV_128;
// 7.将通道0的比较寄存器设置为3.2767万 (0xFFFF / 2)
T1CC0L = 0xFF;
T1CC0H = 0x7F;
}
//----------- 1毫秒---------------------------
#pragma vector = t1_vector
__interrupt void Timer1_ISR(void)
{
T1CTL &=~T1CTL_CH0IF;
IF (++count1>=20)
{
计数1=0;
flag_1s=1;
}
//p1_0 ^= 1; //切换SRF04EB LED1
}
/*******************************************************************************
文件名: radio_carrier_freq.c
说明:此示例显示如何使对讲机发射未调制信号
承运人。 对讲机设置使用SmartRFÆ Studio进行计算。
通过设置实现非调制载波的连续发送
偏差为零并在TX中设置对讲机。
***************** /
/*******************************************************************************
*包括
*/
#IF (芯片== 2510)
#include <ioCC2510.h>
#endif
#IF (芯片== 1110)
#include <ioCC1110.h>
#endif
#IF (芯片== 2511)
#include <ioCC2511.h>
#endif
#IF (芯片== 1111)
#include <ioCC1111.h>
#endif
#include <ioCCxx10_bitdef.h>
#include "hal_interrupT_mgmt.h"
#include "dma.h"
#include<stdio.h>
无符号字符计数=0,i=0,j;
//#include <ioCC1110.h>
#define NOP() ASM("NOP")(定义NOP() ASM [NOP])
#define DMAIF_0 0x01 // DMAIRQ寄存器中的DMA通道0中断标志
#define IRQ_done 0x10 // RFIF-中的IRQ_done位
//和RFIM寄存器
#define packet_length 12.
#define IEN0_RFTXRXIE 0x01
#define bitset(var, bitno)(var)|=(1<<(bitno))
#define bitclr (var,bitno)((var)&=(~(1<<(bitno))))//«Â 0
#define BITXOR (var,bitno)((var)^=(1<<(bitno)))//»°∑¥
#define bit_test( x, y)(((x)&(1<(y))!=0)
extern void inituarttest(void);
extern void uartTX_Send_word(car word);
extern void UartTX_Send_String( char *Data,int len);
extern void Timer1_init(void);
//extern void Timer1_init(void);
静态无符号字符pktRcvdFlag =0; //每当接收数据包时设置标志
//static DMA_DESC dmaConfig; // DMA配置的结构
静态int RxBufCount =0; //每当接收数据包时设置标志
//unsigned char Recdata[4]="ok!";
/*******************************************************************************
*常量
*/
Char rxBuffer[packet_length];//Œfiœfl ˝æ›
void delayus (无符号int u)
{
无符号int I;
对于(i=0;i<u*13;i++);
}
//----------- “±÷”≥ı ºªØ-----------------------
作废Clock_Init (void)
{
//将系统时钟源设置为HS XOSC和最大CPU速度,
//参考号 [CLK]=>[clk_xosc.c]
睡眠&=~SLEED_OSC;
while (!(Sleep & Sleep_XOSC S));
CLKCON =(CLKCON &~(CLKCON_CLKSPD | CLKCON_OSC)| CLKSPD_DIV_1;
While (CLKCON & CLKCON_OSC);
睡眠|=睡眠_OSC;
}
//----------- RF≈‰÷√-----------------------
void radioConfigure(void)(作废无线电
{
SYNC1 = 0x2D;
SYNC0 = 0xD4;
PKTLEN =数据包长度; //数据包长度。
PKTCTRL1 = 0x00; //数据包自动化控制。
PKTCTRL0 = 0x00;
//ADDR = 0x00;
//CHANNR = 0x00;
FSCTRL1 = 0x08;
FSCTRL0 = 0x00; //频率合成器控制。
FREQ2 = 0x21; // 868.3
FREQ1 = 0x65; //频率控制字,中间字节。
FREQ0 = 0x6A; //频率控制字,低字节。
MDMCFG4 = 0x66; //符号率
MDMCFG3 = 0x83; //
MDMCFG2 = 0x02; //灵敏度更佳2-FSK
MDMMCFG1 = 0x12;
MDMCFG0 = 0xf8;
DEVIATN = 0x51; //…Ë÷√∆´≤Ó
//MCSM2 = 0x07; //÷˜øÿ◊¥Ã¨ª˙≈‰÷√
MCSM1 = 0x1F; // º÷Ω” ◊¥Ã¨
MCSM0 = 0x18; //¥“Ø”œ“µΩΩ” ◊¥Ã¨ª·–£◊º…Ë÷√Ω” à•ºı“”
//FOCCFG = 0x1D; //∆µ∆´≤π≥•≈‰÷√
//BSCFG = 0x1C; //ŒªÕ¨≤Ω≈‰÷√
//AGCCTRL2 = 0xC7; // AGC控制。
//AGCCTRL1 = 0x00; // AGC控制。
//AGCCTRL0 = 0xB2; // AGC控制。
//FREND1 = 0xB6; //«∞∂ÀΩ” ≈‰÷√
//FREND0 = 0x10; //前端RX配置。
//FSCAL3 = 0xE9; //∆µ¬ ∫œ≥…∆˜–£◊º
//FSCAL2 = 0x2A; //频率合成器校准。
//FSCAL1 = 0x00; //频率合成器校准。
//FSCAL0 = 0x1F; //频率合成器校准。
//TEST2 = 0x81; //各种测试设置。
//TEST1 = 0x35; //各种测试设置。
//TEST0 = 0x09; //各种测试设置。
//PA_TABLE0 = 0x50; // PA输出功率设置。
返回;
}
//----------- IO≥ı ºªØ----------------------------------
void init_io(void)
{
/************************************************************************
*常量
*/
/*
//LED_Bp 2.0 LED_Gp 2.3 LED_Rp 2.4
P1SEL &=~(BIT4 | BIT3 | BIT0);// 0通用I/O
IO_DIR_PORT_PIN (2,0,IO_OUT);//LED_B
IO_DIR_PORT_PIN (2,3,IO_OUT);//LED_G
IO_DIR_PORT_PIN (2,4,IO_OUT);//LED_R
//P2INP &=~(BIT4 | BIT3 | BIT0);// 0上拉/下拉
//relay_EN p 1.1
P1SEL &=~BIT1;//通用I/O
P1DIR || BIT1;//输出
// P1INP // 0Pull-up / pull-down
// TEMP_ADp 0.1 RT1_ENp 0.0
P0SEL || BIT0;// 1外设功能
//P0INP
// key pg 0.6
P1SEL &=~BIT6;
IO_DIR_PORT_PIN(2,0,IO_IN);// 0输入
//P0INP
*/
//1. P2SEL端口2功能选择
P1SEL &=~(0x01);//𶃋-°'Ò
P1DIR |= 0x01;//输出
P1_0 = 1;//ƒ¨»œ ‰≥ˆ∏fl
//p1_1 = 1;//ƒ¨»œ ‰≥ˆ∏fl
//P1DIR || BIT0;// 1输出
}
/*******************************************************************************
*@fn. 主
*
*@brief 按照数据表中的建议设置系统时钟源。
* 使用n ü SmartRFÆ Studio中的设置设置对讲机。 放置对讲机
* 在TX中,即让对讲机发射未调制载波。
*
*@参数 无效
*
*@返回 0
***************** /
内部主(无效)
{
Clock_Init();
radioConfigure();
inituarttest();
init_io();
RFIF = 0;
RFTXRXIF = 0;// RF TX/RX完全中断标志。
RFIM = IRQ_done;
//HAL_INT_ENABLE (INM_RF,INT_ON);//启用RF常规中断
//IEN0 |=IEN0_RFTXRXIE;
IEN0 |= 0x01;// RF÷–∂œ πƒ‹
//4. πƒ‹»´æ÷÷–∂œ
//INT_GLOBAL_ENABLE (INT_ON);
EA=1;
RFST = RFST_Sidle;
RFST = RFST_SRX;
/*等待对讲机进入RX。 */
while (((MARCSTATE & MARCSTATE_MARC_STATE)!= MARC_STATE);
/*无线电现在位于TX中。 无限循环。 */
同时(1)
{
IF (pktRcvdFlag)
{
pktRcvdFlag=0;
RFST = RFST_Sidle; // RF Ø'œ–◊¥Ã¨
UartTX_Send_String (rxBuffer,12);
德莱尤斯(2万);
// RFST = RFST_Sidle; // RF Ø Ω œ Ω–◊¥Ã¨Ω
NOP ();
NOP ();
NOP ();
NOP ();
NOP ();
RFST = RFST_SRX; // RF接收模式
}
}
}
//----------- ˝æ›Ω” ÕÍ≥… ÷–∂œ-------------------------------
#pragma vector=RF_vector
__interrupt void RF_IRQ (void)
{
IF (RxBufCount<packet_length)
{
rxBuffer[RxBufCount]= RFD;
RxBufCount++;
//pktRcvdFlag = 0;
}
S1CON &=~0x03;
IF (RFIF & 0x40)// RX FLOLOW Ω” ≥˝“÷–∂œ IRQ_RXOVF”«Â
{
//IRQ_rxovf();//处理RX溢出
bitclr (RFIF,6);// RX溢出
// RFIF &=~0x10; // 0x10∞¸Ω” ªÚ∑¢…˙ÕÍ≥…±Í÷æ
//RFIF &=~0x40;// RX溢出
»Áπ˚Ω IF (RFIF和0x10)//“ ÕÍ≥…
{
bitclr (RFIF,4);// 0x10∞¸Ω” ÕÍ≥…±Í÷æ
}
如果(RxBufCount >= packet_length)//接收所有RF缓冲区,重置计数器并将RF设回IDLE & RECEIFT(空闲并接收)
{
RxBufCount = 0;
pktRcvdFlag = 1;
}
}