This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430连接CC1101时的GDO2设置问题?

Other Parts Discussed in Thread: CC1101

MCU采用过MSP430的F2132、F247、F5510,遇到一个奇怪的问题。

由于将CC1101的GDO2接至MSP430的P2.0的外部中断模式,希望当收到同步字时(GDO2=0x06)进入中断,然后用RF接收程序检查是否成功接收到数据。

相关设置如下:

 

//====================== GDO2的外部中断设置 ====================
void GDO2_ISR(void)
{
  TI_CC_GDO2_PxSEL &=~TI_CC_GDO2_PIN;      // 普通IO
  TI_CC_GDO2_PxDIR &=~TI_CC_GDO2_PIN;       // input
  TI_CC_GDO2_PxREN |= TI_CC_GDO2_PIN;        // Enable P2.0 internal resistance
  TI_CC_GDO2_PxOUT &=~TI_CC_GDO2_PIN;      // Set P2.0 as pull-Down resistance
  TI_CC_GDO2_PxIES &=~TI_CC_GDO2_PIN;        // P2.0 Lo->Hi edge、出问题的地方!!!
  TI_CC_GDO2_PxIFG &=~TI_CC_GDO2_PIN;       // P2.0 IFG cleared 
  TI_CC_GDO2_PxIE  |= TI_CC_GDO2_PIN;           // P2.0 interrupt enabled,GDO2

}

 

根据CC1101的数据手机,当GDO2=0x06时,应该是接收到同步字时该引脚置位,可如果设定为 P2IES &=~BIT0 则始终收不到另一模块发过来的数据,而如果修改成 P2IES |= BIT0 却能正确地接收到RF传过来的数据。感觉这与手册上的说明是反着的?

以下是RF接收程序的代码:

 

//================= RF接收程序 ==================

char RFReceivePacket(char *rxBuffer, char *length)
{
  char status[2];
  char pktLen;

  INT8U i=(*length)*4;          //等待时间,具体多少要根据datarate和length来决定
  TI_CC_Wait(30);
  while (TI_CC_GDO0_PxIN&TI_CC_GDO0_PIN)
  {
    TI_CC_Wait(30);
    --i;
    if(i<1)
      return 0;     
  } 

  
  if ((TI_CC_SPIReadStatus(TI_CCxxx0_RXBYTES) & TI_CCxxx0_NUM_RXBYTES))
  {
    pktLen = TI_CC_SPIReadReg(TI_CCxxx0_RXFIFO);
    
    TI_CC_SPIReadBurstReg(TI_CCxxx0_RXFIFO, rxBuffer, pktLen); // Pull data
    *length = pktLen;                       // Return the actual size

    TI_CC_SPIReadBurstReg(TI_CCxxx0_RXFIFO, status, 2);

    return (char)(status[TI_CCxxx0_LQI_RX]&TI_CCxxx0_CRC_OK);
  }
  else
    return 0;                               // Error
}

 

  • PxIES的bit=0是low-high,bit=1是high-low,你的问题中就是中断是上升沿还是下降沿的问题,那么中断就是根据GDO2的电平跳变一致

  • 为什么设置 TI_CC_GDO2_PxIES 为0时收不到数据、而设置为1却能收到呢?

    仔细想了一下,可能的原因:

    设置为0时,当GDO2出现 Low->High ,此时是接收到同步信号,如果立即切换为检查收到的RF数据,可能因为后续的数据包传输的时间因素,而未能收到,造成RF接收失败。

    也许在GDO2中断后,在RF接收程序中根据数据包长加入适当的延时,就能正确地接收了?

    待验证......