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
}
Peter_Zheng:
PxIES的bit=0是low-high,bit=1是high-low,你的问题中就是中断是上升沿还是下降沿的问题,那么中断就是根据GDO2的电平跳变一致
Yun Zhang:
回复 Peter_Zheng:
为什么设置 TI_CC_GDO2_PxIES 为0时收不到数据、而设置为1却能收到呢?
仔细想了一下,可能的原因:
设置为0时,当GDO2出现 Low->High ,此时是接收到同步信号,如果立即切换为检查收到的RF数据,可能因为后续的数据包传输的时间因素,而未能收到,造成RF接收失败。
也许在GDO2中断后,在RF接收程序中根据数据包长加入适当的延时,就能正确地接收了?
待验证……