Other Parts Discussed in Thread: MSP430G2433,
在对CC2500发送sleep命令之后,我们发现它有时候并没有进入sleep状态,这导致我们的产品耗电速度加快。查看芯片手册,发现CC2500没有提供sleep状态的某些反馈查询手段,所以目前无法确定CC2500是否进入sleep状态。以上情况概率性发生,我们将MCU睡眠,而刻意不发送sleep命令,能百分之百复现上述情况。低功耗电流为1.7mA,故此,我们认为芯片未进入sleep状态。想请问,CC2500的sleep命令,是否需要注意某些特定操作步骤或者时序问题。相关代码,我贴在下面。MCU用的MSP430G2433,系统关机之前,采用看门狗复位方式,从mian函数开头进入休眠。
void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer IFG1 = 0; CLK_init(); Port_init(); memset(id, 0xff, sizeof(id)); read_array((unsigned char *) FLASH_ADDRESS, id, sizeof(id)); // If the work mode in flash is empty, just use the default one. if (FALSE == CheckValidInFlash()) { restore_saving_data(); } adc_off(); PWM_Init(); Unit_Init(); SPI_Init(); CC2500_Init(); CC2500_Write_RxADDR(); CC2500_Command(CCxxx0_SPWD); //CC2500 Sleep if(((P2IN & PRECHARGE_STATE) ==PRECHARGE_STATE)) // no charge battery tonya { #if AUTO_TURN_ON_IN_ABNORMAL_SHUTDOWN if (id[DEVICE_AVOID_ESD] == KEEP_WORKING_AFTER_ABNORMAL_SHUTDOWN_FLAG_OFF) #endif { _BIS_SR(LPM4_bits + GIE); // Enter LPM4 w/interrupt } } else { #if DEVICE_LOCK_FUNCTION id[DEVICE_LOCK_STATE] = UINT_UNLOCK; // Release key lock #endif #if AUTO_TURN_ON_IN_ABNORMAL_SHUTDOWN id[DEVICE_AVOID_ESD] = KEEP_WORKING_AFTER_ABNORMAL_SHUTDOWN_FLAG_OFF; #endif id[LOW_POWER_INDICATOR_FLAG] = LOW_POWER_INDICATOR_FLAG_OFF; __disable_interrupt(); flash_erase( (unsigned int *) FLASH_ADDRESS); write_array((unsigned char *) FLASH_ADDRESS, id, sizeof(id)); Delay_ms(5); ChargeFlag=1; ChargeState = CHARGING_NOT_IN_STATUS; _BIS_SR(GIE); // Enter interrupt } } void CC2500_Init(void) { unsigned char temp; CSN_ON(); delay_ms(1); CSN_OFF(); delay_ms(1); CSN_ON(); delay_ms(1); CSN_OFF(); SPI_Write(CCxxx0_SRES); //write reset command CSN_ON(); do{ CC2500_WriteReg(CCxxx0_FSCTRL1, CC2500_Config.FSCTRL1); CC2500_WriteReg(CCxxx0_FSCTRL0, CC2500_Config.FSCTRL0); CC2500_WriteReg(CCxxx0_FREQ2, CC2500_Config.FREQ2); CC2500_WriteReg(CCxxx0_FREQ1, CC2500_Config.FREQ1); CC2500_WriteReg(CCxxx0_FREQ0, CC2500_Config.FREQ0); CC2500_WriteReg(CCxxx0_MDMCFG4, CC2500_Config.MDMCFG4); CC2500_WriteReg(CCxxx0_MDMCFG3, CC2500_Config.MDMCFG3); CC2500_WriteReg(CCxxx0_MDMCFG2, CC2500_Config.MDMCFG2); CC2500_WriteReg(CCxxx0_MDMCFG1, CC2500_Config.MDMCFG1); CC2500_WriteReg(CCxxx0_MDMCFG0, CC2500_Config.MDMCFG0); CC2500_WriteReg(CCxxx0_CHANNR, CC2500_Config.CHANNR); CC2500_WriteReg(CCxxx0_DEVIATN, CC2500_Config.DEVIATN); CC2500_WriteReg(CCxxx0_FREND1, CC2500_Config.FREND1); CC2500_WriteReg(CCxxx0_FREND0, CC2500_Config.FREND0); CC2500_WriteReg(CCxxx0_MCSM0 , CC2500_Config.MCSM0 ); CC2500_WriteReg(CCxxx0_FOCCFG, CC2500_Config.FOCCFG); CC2500_WriteReg(CCxxx0_BSCFG, CC2500_Config.BSCFG); CC2500_WriteReg(CCxxx0_AGCCTRL2, CC2500_Config.AGCCTRL2); CC2500_WriteReg(CCxxx0_AGCCTRL1, CC2500_Config.AGCCTRL1); CC2500_WriteReg(CCxxx0_AGCCTRL0, CC2500_Config.AGCCTRL0); CC2500_WriteReg(CCxxx0_FSCAL3, CC2500_Config.FSCAL3); CC2500_WriteReg(CCxxx0_FSCAL2, CC2500_Config.FSCAL2); CC2500_WriteReg(CCxxx0_FSCAL1, CC2500_Config.FSCAL1); CC2500_WriteReg(CCxxx0_FSCAL0, CC2500_Config.FSCAL0); CC2500_WriteReg(CCxxx0_FSTEST, CC2500_Config.FSTEST); CC2500_WriteReg(CCxxx0_TEST2, CC2500_Config.TEST2); CC2500_WriteReg(CCxxx0_TEST1, CC2500_Config.TEST1); CC2500_WriteReg(CCxxx0_TEST0, CC2500_Config.TEST0); CC2500_WriteReg(CCxxx0_IOCFG2, CC2500_Config.IOCFG2); CC2500_WriteReg(CCxxx0_IOCFG0, CC2500_Config.IOCFG0); CC2500_WriteReg(CCxxx0_PKTCTRL1, CC2500_Config.PKTCTRL1); CC2500_WriteReg(CCxxx0_PKTCTRL0, CC2500_Config.PKTCTRL0); CC2500_WriteReg(CCxxx0_ADDR, CC2500_Config.ADDR); CC2500_WriteReg(CCxxx0_PKTLEN, CC2500_Config.PKTLEN); CC2500_WritePaTable(CCxxx0_PATABLE,PaTabel); //to set output power temp = CC2500_ReadReg(CCxxx0_FREQ0); }while(temp!=CC2500_Config.FREQ0); CC2500_Command(CCxxx0_SFRX); CC2500_Command(CCxxx0_SFTX); CC2500_Command(CCxxx0_SIDLE); } void CC2500_Command(uint8 cmd) { CSN_OFF(); while (MISO_IN); SPI_Write(cmd); CSN_ON(); }