MSP430+CC2500 GDO0脚的信号,发现它始终为0(说明没发成功),如何解决?
我现在用是的MSP430+CC2500,调试一个无线温度采集的系统,程序是用的TI上的例程(收,发测试),我按照他的例程(寄存器配置没改),其它端口什么的都改好了,但是信号还是不能发送出去,我有试波器看了GDO0脚的信号,发现它始终为0(说明没发成功),问题是找到了,但我又不知道问题出哪了,
不知道有没有人碰到过类似的问题呢?
以下蓝色文字由站长:armok 于:2008-06-20,18:36:58 加入。你的原标题:“<font color=black>紧急求助~~关于CC2500&GDO0的一个问题” 不合符规定。请更改成能说明帖子大意的标题
试想一下,如果本论坛的帖子标题清一色的‘帮助!’,‘ADC求救!’等笼统的标题,你在阅读的过程中会造成许多麻烦。
所以本论坛规定:一定要起一个能说明帖子大意的标题。不允许“关于 AVR 的 ADC 使用!”这种笼统标题。作为标题,必须说明清楚:
①你是在请教问题,还是在介绍有关的知识?
②ADC的问题有许多,你是想说那方面的内容?
注意以上两点,标题应该改成如:“请教:ADC 可以不使用中断吗?”。
起一个能说明帖子大意的标题,除了减轻我们的帖子分类整理工作,还方便其它人阅读,节省大家的时间。
注:使用合格的标题,对你来说只是举手之劳,但却会为我们的管理工作提供很大的便利。谢谢你的支持。
./bbs_upload/files_6/armok01122228.gif 我修改TI上的例程到Freescale上收发正常啊,你的是不是硬件问题. 硬件没问题的!GDOO是是个专用引脚,我寄存器设的是0X06,没错阿!
不知道还有什么地方要注意的?? 是不是你把GDOO引脚方向设置成输出了!!! http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_318142.jpg
(原文件名:1.jpg)
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_318143.jpg
(原文件名:2.jpg) #include "include.h"
extern char paTable[]; //功率能量
extern char paTableLen; //
char thedata;
char txBuffer; //发送缓存
char rxBuffer; //接收缓存
unsigned int i;
void main (void)
{
WDTCTL = WDTPW + WDTHOLD; // 关开门狗
//thedata = TI_CC_SPIReadStatus(0x30);
TI_CC_GDO0_PxDIR &= ~TI_CC_GDO0_PIN; //设GDOO为输入状态
TI_CC_SPISetup(); // 初始化SPI
TI_CC_PowerupResetCCxxxx(); // 复位 CC2500
writeRFSettings(); // 配置寄存器
TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, paTable, paTableLen);//设置功率
// Configure ports -- switch inputs, LEDs, GDO0 to RX packet info from CCxxxx
TI_CC_SW_PxIES = TI_CC_SW1; //按键选择下降沿触发
TI_CC_SW_PxIFG &= ~(TI_CC_SW1); //清除按键中断请求
TI_CC_SW_PxIE = TI_CC_SW1; //按键中断使能
TI_CC_LED_PxDIR = TI_CC_LED1; //设定输出状态
//TI_CC_LED_PxDIR &= ~TI_CC_SW1;
TI_CC_GDO0_PxIES |= TI_CC_GDO0_PIN; // 设定为下降沿触发(数据包结束)
TI_CC_GDO0_PxIFG &= ~TI_CC_GDO0_PIN; // 清除中断标志
TI_CC_GDO0_PxIE |= TI_CC_GDO0_PIN; //中断使能
TI_CC_SPIStrobe(TI_CCxxx0_SRX); // Initialize CCxxxx in RX mode.
//如果接收到数据,则激活MCU // When a pkt is received, it will
// signal on GDO0 and wake CPU
_BIS_SR(LPM3_bits + GIE); //省电模式 Enter LPM3, enable interrupts
}
// The ISR assumes the interrupt came from a press of one of the four buttons
// and therefore does not check the other four inputs.
#pragma vector=PORT1_VECTOR
__interrupt void port1_ISR (void)
{
// Build packet
TI_CC_LED_PxDIR = TI_CC_LED2 ; //led green
txBuffer = 2; // Packet length
txBuffer = 0x01; // Packet address
txBuffer = (~TI_CC_SW_PxIN >> 4) & 0x0F;// Load four switch inputs
RFSendPacket(txBuffer, 3); // Send value over RF
P1IFG &= ~(TI_CC_SW1); //Clr flag that caused int
P2IFG &= ~TI_CC_GDO0_PIN; // After pkt TX, this flag is set.
TI_CC_LED_PxDIR &= ~TI_CC_LED2 ;
} // Clear it.
// The ISR assumes the int came from the pin attached to GDO0 and therefore
// does not check the other seven inputs.Interprets this as a signal from
// CCxxxx indicating packet received.
#pragma vector=PORT2_VECTOR
__interrupt void port2_ISR (void)
{//TI_CC_LED_PxDIR = TI_CC_LED2 ;
char len=2; // Len of pkt to be RXed (only addr
// plus data; size byte not incl b/c
// stripped away within RX function)
if (RFReceivePacket(rxBuffer,&len)) // Fetch packet from CCxxxx
TI_CC_LED_PxOUT ^= rxBuffer; // Toggle LEDs according to pkt data
P2IFG &= ~TI_CC_GDO0_PIN; // Clear flag
//TI_CC_LED_PxDIR &= ~TI_CC_LED2 ;
} 你在发送前先把CC2500切到空闲状态!
txBuffer = 2; // Packet length
txBuffer = 0x01; // Packet address
txBuffer = (~TI_CC_SW_PxIN >> 4) & 0x0F;// Load four switch inputs
TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); // 在这里添加这行试试
RFSendPacket(txBuffer, 3); // Send value over RF 这个例程序里没有按键消抖,所以按键时由于抖动原因会导致2次连续的发送,这时很容易会造成CC2500锁死!直接的现象就是GDOO等不到预想的电平,导致MCU也死掉了! 我加了,但是还是不行阿~~到那个老地方就停住了,GDO0始终为低的~ 刚刚我就直接发了,没用按键中断了,问题还在?
to n0831:
你是怎么处理这个的呢?? 那就怪了,你的是430DAY的赠品吧,上面的哪个演示程序可以正常运行吗? 是的,就是那个,那个DEMO程序是可以运行的,但是用这个就不行了,怪了\\ 那应该没什么问题啊,太奇怪了.我的可以用的,不过要是不切换到空闲态用几次就死机了. 你有改过哪些地方,会不会是我哪里没改好的?? 他那个演示程序就是配合那个模块用的啊,本来就能用的啊,我测试过能用,只是不是很稳定. 请教一下n0831___
CC2500的即时状态(休眠,空闲,TX,RX)怎样可以读出来呢?? 请查看CC2500数据手册的10.1节有对状态字较详细的说明. ^_^_______
发送的问题解决了,原来是引脚的初始化问题,原来我的GDO0正好接在单片机的外部时钟引脚,
而它的PXSEL设置默认为1(1是为外部引脚功能//0才为I/O引脚功能). 我发送了8个字节的数据,2500能接收中断能够进去,但是就是RXBYTES会溢出,每次都一样,请大家帮我分析一下原因!!!
程序我再贴一下:
T:
#include "include.h"
externchar paTable[];
externchar paTableLen;
/*发送数据************************************************/
char txBuffer[] =
{0x01 ,0xFE, 0xD6, 0x29, 0x0E, 0x0E, 0x77, 0x88};
/*接收数据************************************************/
char rxBuffer[];
unsigned int i;
void delay_ms(void) //毫秒延时
{
unsigned int i;
for (i=0; i<1500; i++)
{
_NOP();
}
}
void delay_nms(unsigned int n) //延时周期
{
unsigned int i;
for (i=0; i<n; i++)
{
delay_ms();
}
}
void main (void)
{
WDTCTL = WDTPW + WDTHOLD; // 关闭开门狗;
TI_CC_SPISetup(); // 初始化SPI;
TI_CC_PowerupResetCCxxxx(); // 复位 CCxxxx;
writeRFSettings(); // 配置寄存器;
TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, paTable, paTableLen);//配置功率;
TI_CC_LED_PxDIR = TI_CC_LED1; //点亮LED1;
TI_CC_GDO0_PxDIR &= ~TI_CC_GDO0_PIN; //设置GDO0为输入;
TI_CC_GDO0_PxSEL &= ~TI_CC_GDO0_PIN; //设置P2.6脚为I/O端口;
TI_CC_GDO0_PxIES &= ~TI_CC_GDO0_PIN; //下降沿触发中断;
TI_CC_GDO0_PxIFG &= ~TI_CC_GDO0_PIN; // 清除中断标志;
TI_CC_GDO0_PxIE |= TI_CC_GDO0_PIN; // 使能中断总允许;
TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); //设置芯片为空闲状态;
while(1)
{
delay_nms(500);
TI_CC_LED_PxDIR |= TI_CC_LED2;
TI_CC_SPIStrobe(TI_CCxxx0_SIDLE);
RFSendPacket(txBuffer,8);
delay_nms(50);
TI_CC_LED_PxDIR &= ~TI_CC_LED2;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
R:
#include "include.h"
externchar paTable[];
externchar paTableLen;
char txBuffer[];
char rxBuffer[];
unsigned int i;
void delay_ms(void) //毫秒延时
{
unsigned int i;
for (i=0; i<1500; i++)
{
_NOP();
}
}
void delay_nms(unsigned int n) //延时周期
{
unsigned int i;
for (i=0; i<n; i++)
{
delay_ms();
}
}
void main (void)
{
WDTCTL = WDTPW + WDTHOLD; // 关闭开门狗;
TI_CC_SPISetup(); // 初始化SPI;
TI_CC_PowerupResetCCxxxx(); // 复位 CCxxxx;
writeRFSettings(); // 配置寄存器;
TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, paTable, paTableLen);//配置功率;
TI_CC_GDO0_PxDIR &= ~TI_CC_GDO0_PIN; //设置GDO0为输入;
TI_CC_GDO0_PxSEL &= ~TI_CC_GDO0_PIN; //设置P2.6脚为I/O端口;
TI_CC_GDO0_PxIES &= ~TI_CC_GDO0_PIN; //下降沿触发中断;
TI_CC_GDO0_PxIFG &= ~TI_CC_GDO0_PIN; // 清除中断标志;
TI_CC_GDO0_PxIE |= TI_CC_GDO0_PIN; // 使能中断总允许;
TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); //设置芯片为空闲状态;
//TI_CC_SPIStrobe(TI_CCxxx0_SFRX); //冲洗RX FIFO缓冲;
TI_CC_SPIStrobe(TI_CCxxx0_SRX); // 启用RX
//TI_CC_SPIReadStatus(TI_CCxxx0_RXBYTES);
_BIS_SR(LPM3_bits + GIE); // 启用省电模式,中断唤醒;
}
#pragma vector=PORT2_VECTOR
__interrupt void port2_ISR (void)
{
char len=10;
if (RFReceivePacket(rxBuffer,&len))
{P2IE=0X00;
TI_CC_LED_PxDIR |= TI_CC_LED1;
TI_CC_SPIStrobe(TI_CCxxx0_SFRX);
delay_nms(200);
}
else
{P2IE=0X00;
TI_CC_LED_PxDIR |= TI_CC_LED2;
TI_CC_SPIStrobe(TI_CCxxx0_SFRX);
delay_nms(200);
}
TI_CC_LED_PxDIR &= ~TI_CC_LED1;
TI_CC_LED_PxDIR &= ~TI_CC_LED2;
P2IFG &= ~TI_CC_GDO0_PIN;
P2IE=0XFF;
TI_CC_SPIStrobe(TI_CCxxx0_SRX);
}
////////////////////////////////////////////////////////////////////////////////
寄存器配置:
TI_CC_SPIWriteReg(TI_CCxxx0_IOCFG2, 0x0B);// GDO2 output pin config.
TI_CC_SPIWriteReg(TI_CCxxx0_IOCFG0, 0x06);// GDO0 output pin config.
TI_CC_SPIWriteReg(TI_CCxxx0_FIFOTHR, 0x07);
TI_CC_SPIWriteReg(TI_CCxxx0_PKTLEN, 0xFF);// Packet length.
TI_CC_SPIWriteReg(TI_CCxxx0_PKTCTRL1, 0x45);// Packet automation control.
TI_CC_SPIWriteReg(TI_CCxxx0_PKTCTRL0, 0x05);// Packet automation control.
TI_CC_SPIWriteReg(TI_CCxxx0_ADDR, 0x01);// Device address.
TI_CC_SPIWriteReg(TI_CCxxx0_CHANNR, 0x00); // Channel number.
TI_CC_SPIWriteReg(TI_CCxxx0_FSCTRL1,0x07); // Freq synthesizer control.
TI_CC_SPIWriteReg(TI_CCxxx0_FSCTRL0,0x00); // Freq synthesizer control.
TI_CC_SPIWriteReg(TI_CCxxx0_FREQ2, 0x5D); // Freq control word, high byte
TI_CC_SPIWriteReg(TI_CCxxx0_FREQ1, 0x93); // Freq control word, mid byte.
TI_CC_SPIWriteReg(TI_CCxxx0_FREQ0, 0xB1); // Freq control word, low byte.
TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG4,0x2D); // Modem configuration.
TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG3,0x3B); // Modem configuration.
TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG2,0x73); // Modem configuration.
TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG1,0x22); // Modem configuration.
TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG0,0xF8); // Modem configuration.
TI_CC_SPIWriteReg(TI_CCxxx0_DEVIATN,0x00); // Modem dev (when FSK mod en)
TI_CC_SPIWriteReg(TI_CCxxx0_MCSM1 , 0x3F); //MainRadio Cntrl State Machine
TI_CC_SPIWriteReg(TI_CCxxx0_MCSM0 , 0x18); //MainRadio Cntrl State Machine
TI_CC_SPIWriteReg(TI_CCxxx0_FOCCFG, 0x1D); // Freq Offset Compens. Config
TI_CC_SPIWriteReg(TI_CCxxx0_BSCFG, 0x1C); //Bit synchronization config.
TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL2, 0xC7); // AGC control.
TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL1, 0x00); // AGC control.
TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL0, 0xB2); // AGC control.
TI_CC_SPIWriteReg(TI_CCxxx0_FREND1, 0xB6); // Front end RX configuration.
TI_CC_SPIWriteReg(TI_CCxxx0_FREND0, 0x10); // Front end RX configuration.
TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL3, 0xEA); // Frequency synthesizer cal.
TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL2, 0x0A); // Frequency synthesizer cal.
TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL1, 0x00); // Frequency synthesizer cal.
TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL0, 0x11); // Frequency synthesizer cal.
TI_CC_SPIWriteReg(TI_CCxxx0_FSTEST, 0x59); // Frequency synthesizer cal.
TI_CC_SPIWriteReg(TI_CCxxx0_TEST2, 0x88); // Various test settings.
TI_CC_SPIWriteReg(TI_CCxxx0_TEST1, 0x31); // Various test settings.
TI_CC_SPIWriteReg(TI_CCxxx0_TEST0, 0x0B);// Various test settings.
} 你发送的时候切换到了空闲状态,同样,接收也有同样的问题,每次切换到接收前也要先切换到空闲状态.并且要及时清洗缓冲区的! 我发送一个数据能收到的,但是发一组数据就收不到了??
至于你说的,我已经写进去了~~./emotion/em119.gif 我改了下面这个函数,不知道对不
void TI_CC_SPISetup(void)
{
TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
TI_CC_CSn_PxDIR |= TI_CC_CSn_PIN; // /CS disable
/////IE2 |= UCB0TXIE + UCB0RXIE; ///ME2 |= USPIE1; // Enable USART1 SPI mode同步中断模式使能
UCB0CTL0 |=UCMST + UCSYNC + UCCKPL + UCMSB; ///UCTL1 |= CHAR + SYNC + MM; // 8-bit SPI Master **SWRST** 高字节先
UCB0CTL1 |= UCSSEL_2;////UCSSEL0 + UCSSEL1 + UCSWRST;///UTCTL1 |= CKPL + SSEL1 + SSEL0 + STC; // SMCLK, 3-pin mode
UCB0BR0 = 0X09;////UCB0BR0 = 0x02; // UCLK/2
UCB0BR1 = 0x00; //
////UCA0MCTL = 0x6b; //UMCTL1 = 0x00; // No modulation
TI_CC_SPI_USART1_PxSEL |= TI_CC_SPI_USART1_SIMO + TI_CC_SPI_USART1_SOMI + TI_CC_SPI_USART1_UCLK;
// SPI option select
TI_CC_SPI_USART1_PxDIR |= TI_CC_SPI_USART1_SIMO + TI_CC_SPI_USART1_UCLK;
// SPI TXD out direction
UCB0CTL1 &= ~UCSWRST; ///UCTL1 &= ~SWRST; // Initialize USART state machine
} 你们改了点什么,(管脚我也改了),我用ez430-rf2500 其实不用改太多,就几个引脚改一下,然后在收发之前将芯片制成空闲状态!! UCB0BR0 = 0X09;////UCB0BR0 = 0x02; // UCLK/2 ,我的不改这个会死机,没有什么波特率的要求吗 #include "TI_CC_msp430.h"
#define TI_CC_LED_PxOUT P1OUT
#define TI_CC_LED_PxDIR P1DIR
#define TI_CC_LED1 0x01
#define TI_CC_LED2 0x02
#define TI_CC_SW_PxDIR P1DIR
#define TI_CC_SW_PxIN P1IN
#define TI_CC_SW_PxIE P1IE
#define TI_CC_SW_PxIES P1IES
#define TI_CC_SW_PxIFG P1IFG
#define TI_CC_SW1 0x04
#define TI_CC_GDO0_PxOUT P2OUT
#define TI_CC_GDO0_PxIN P2IN
#define TI_CC_GDO0_PxDIR P2DIR
#define TI_CC_GDO0_PxIE P2IE
#define TI_CC_GDO0_PxIES P2IES
#define TI_CC_GDO0_PxIFG P2IFG
#define TI_CC_GDO0_PxSEL P2SEL
#define TI_CC_GDO0_PIN 0x40
#define TI_CC_GDO2_PxOUT P2OUT
#define TI_CC_GDO2_PxIN P2IN
#define TI_CC_GDO2_PxDIR P2DIR
#define TI_CC_GDO2_PIN 0x80
#define TI_CC_CSn_PxOUT P3OUT
#define TI_CC_CSn_PxDIR P3DIR
#define TI_CC_CSn_PIN 0x01
//----------------------------------------------------------------------------
// Select which port will be used for interface to CCxxxx
//----------------------------------------------------------------------------
#define TI_CC_RF_SER_INTF TI_CC_SER_INTF_USCIB0// Interface to CCxxxx 端口改好就好了,波特率不用改的~ 哦 能说说SimpliciTI,怎么用吗 是指P2.6和P2.7吧。你在18楼发的试验代码,收和发中怎么都是对GDO0的连接的管脚的中断,接收应该是GDO2吧? 那断是我的测试程序,一个板是在一直发数据的,另一个板子做接收,看它是否能正确接收!!
还有的是发的数据,前两个字节应该是固定的,第一个字节是发送的数据长度,第二个字节是地址(因为配置寄存器的时候已经设置好了)
18楼的程序中http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_341506.jpg
(原文件名:11.jpg)
缓存中的数据是不对了,应该改成char txBuffer[] = {0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
接收时原来的char len=10;
if (RFReceivePacket(rxBuffer,&len))
也应该改成 char len;
if (RFReceivePacket(rxBuffer,&len)) 请问:你是用http://focus.ti.com/lit/an/slaa325/slaa325.zip这里的程序吗?
我发现 TI_CC_spi.c中,TI_CC_SER_INTF_USCIB0中
void TI_CC_SPIWriteReg(char addr, char value)
{
TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN; // /CS enable
while (TI_CC_SPI_USCIB0_PxIN&TI_CC_SPI_USCIB0_SOMI);// Wait for CCxxxx ready
IFG2 &= ~UCB0RXIFG; // Clear flag
UCB0TXBUF = addr; // Send address
while (!(IFG2&UCB0RXIFG)); // Wait for TX to finish??
IFG2 &= ~UCB0RXIFG; // Clear flag??
UCB0TXBUF = value; // Send data
while (!(IFG2&UCB0RXIFG)); // Wait for TX to finish??
TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN; // /CS disable
}有点不对,while (!(IFG2&UCB0RXIFG)); // Wait for TX to finish??中为什么不是while (!(IFG2&UCB0TXIFG)); 不知道能不能给些cc2500的WOR功能代码参考,yisheng-1@163.com 大吓们给我看看,这个东西怎么编程.
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_368393.JPG
(原文件名:未命名3.JPG) 正用的上。 正为此事头疼! 楼主,我毕业设计就是你发帖的题目,请问可不可以指导指导我? 学习一下~~~~~~
页:
[1]