小弟最近在采用MSP430 与 CC1101做一个无线通讯的项目,项目进行到现在已经大概一个月了,基本功能都已经调通,目前遇到棘手的问题未能解决,忘各位高手指点!
项目描述:
项目有两个设备组成,一个为从机、一个为主机,主机与从机是一对多的通讯方式,从机(电池供电)平时处于低功耗休眠模式,每个10秒发送一个数据,主机负责接收,要求从机功耗控制在30uA一下,主机采用市电供电。
目前进展:
1、主机与从机已经能正常通讯,且通讯稳定性都正常;
2、从机在未接CC1101模块时,低功耗已经完成,且其他切换功能均正常,功耗在27uA左右,包括外设EEPORM、FLASH以及其他等等;
3、但是设备接上CC1101模块时,让模块进入低功耗只能做到250uA,暂且还是查找问题中,未找到问题所在;
4、从机在低功耗状态转入发送数据后,不能正常进入SLEEP模式,所以一旦有数据发送后,设备功耗就维持在1.9mA左右,等于模块的IDLE状态工作电流,并且这个时候继续写入SPWD,也不能进入SLEEP状态。
工作方式:
1、设备休眠时间到,执行以下指令,让模块进入SLEEP状态:
ti_CC_ChangeStateToIDLE(); // SPWD切换在IDLE 状态下有效
TI_CC_SPIWriteByte(TI_CCxxx0_IOCFG2, 0x2F);
TI_CC_SPIWriteByte(TI_CCxxx0_IOCFG0, 0x2F);
TI_CC_SPIStrobe(TI_CCxxx0_SPWD); // 进入断电模式
TI_CCxxx0_CSn_DISABLE(); // CS 拉高
其他IO口置位,设备进入低功耗状态,整个设备进入低功耗模式,功耗为250uA,偏大!!!
2、设备数据发送时间到,执行以下指令,使模块退出低功耗模式
UCSCTL4 = (SELM__DCOCLK + SELA__XT1CLK + SELS__DCOCLK); // 切换SPI时钟为DCO
UCA1Init(); // 初始化SPI端口配置
TI_CCxxx0_CSn_ENABLE(); // 拉高,使得模块退出低功耗模式
// 发数据代码如下,采用中断方式发送,并且为不定长度发送数据模式
TI_CC_ChangeStateToIDLE();
TI_CC_SPIWriteBurst(TI_CCxxx0_TXFIFO, &SendNum, 1);
TI_CC_SPIWriteBurst(TI_CCxxx0_TXFIFO, SendBuf, SendNum);
TI_CC_GDOx_INT_OPEN(EXTI_INT_GDO2_ON);
TI_CC_SPIStrobe(TI_CCxxx0_STX); // Change state to TX, initiating
// 等到检测到中断发送完成后,执行以下代码
TI_CC_ChangeStateToIDLE(); // SPWD切换在IDLE 状态下有效
TI_CC_SPIWriteByte(TI_CCxxx0_IOCFG2, 0x2F);
TI_CC_SPIWriteByte(TI_CCxxx0_IOCFG0, 0x2F);
TI_CC_SPIStrobe(TI_CCxxx0_SPWD); // 进入断电模式
TI_CCxxx0_CSn_DISABLE(); // CS 拉高
其他IO口置位,设备进入低功耗状态,整个设备进入低功耗模式,功耗为1.9mA,非常偏大!!! === 模块IDLE电流
3、附上寄存器配置状态
TI_CC_SPIWriteByte(TI_CCxxx0_IOCFG2, 0x06); //
TI_CC_SPIWriteByte(TI_CCxxx0_IOCFG1, 0x2E); // 默认值
TI_CC_SPIWriteByte(TI_CCxxx0_IOCFG0, 0x01); // 与 RX FIFO 相关:达到或超出 RX FIFO 阈值填充 RX FIFO 时置位,或到达数据包结尾时置位。RX FIFO 为空时取消置位。
TI_CC_SPIWriteByte(TI_CCxxx0_FIFOTHR, 0x07); // 默认值: TX_FIFO_THR:33, RX_FIFO_THR:32
TI_CC_SPIWriteByte(TI_CCxxx0_SYNC1, 0xD3); // 默认值
TI_CC_SPIWriteByte(TI_CCxxx0_SYNC0, 0x91); // 默认值
TI_CC_SPIWriteByte(TI_CCxxx0_PKTLEN, 0x40); // 可变数据包长度,最大允许数据包长度为64字节
TI_CC_SPIWriteByte(TI_CCxxx0_PKTCTRL1, 0x0C); // 开启CRC错误自动刷新功能,且FIFO后包含两个字节的状态State
TI_CC_SPIWriteByte(TI_CCxxx0_PKTCTRL0, 0x45); // 开启数据白化,开启CRC检验,可变数据包长度
TI_CC_SPIWriteByte(TI_CCxxx0_ADDR, 0x00); // 默认值: 无地址
TI_CC_SPIWriteByte(TI_CCxxx0_CHANNR, 0x00); // 默认值: 00
TI_CC_SPIWriteByte(TI_CCxxx0_FSCTRL1, 0x08); // 中频计算
TI_CC_SPIWriteByte(TI_CCxxx0_FSCTRL0, 0x00); // 频率补偿
TI_CC_SPIWriteByte(TI_CCxxx0_FREQ2, 0x10); // 432.999878频率
TI_CC_SPIWriteByte(TI_CCxxx0_FREQ1, 0xA7);
TI_CC_SPIWriteByte(TI_CCxxx0_FREQ0, 0x62);
TI_CC_SPIWriteByte(TI_CCxxx0_MDMCFG4, 0x5B); // Baud : 100K,RX Filter BW : 325KHZ
TI_CC_SPIWriteByte(TI_CCxxx0_MDMCFG3, 0xF8);
TI_CC_SPIWriteByte(TI_CCxxx0_MDMCFG2, 0x03); // 2-FSK
TI_CC_SPIWriteByte(TI_CCxxx0_MDMCFG1, 0x22);
TI_CC_SPIWriteByte(TI_CCxxx0_MDMCFG0, 0xF8);
TI_CC_SPIWriteByte(TI_CCxxx0_DEVIATN, 0x47); // 调制解调器偏差设置: 47.6K
TI_CC_SPIWriteByte(TI_CCxxx0_MCSM2, 0x07); // 默认值
TI_CC_SPIWriteByte(TI_CCxxx0_MCSM1, 0x30); // 接收到一个数据包后保持IDLE,择发送一个数据包后保持IDLE
TI_CC_SPIWriteByte(TI_CCxxx0_MCSM0 , 0x08); // 手动校准频率
TI_CC_SPIWriteByte(TI_CCxxx0_FOCCFG, 0x1D); // 频率偏移补偿配置
TI_CC_SPIWriteByte(TI_CCxxx0_BSCFG, 0x1C); // 位同步配置
TI_CC_SPIWriteByte(TI_CCxxx0_AGCCTRL2, 0xC7); // 自动增益控制
TI_CC_SPIWriteByte(TI_CCxxx0_AGCCTRL1, 0x00);
TI_CC_SPIWriteByte(TI_CCxxx0_AGCCTRL0, 0xB2);
TI_CC_SPIWriteByte(TI_CCxxx0_WOREVT1, 0x87); // 默认值
TI_CC_SPIWriteByte(TI_CCxxx0_WOREVT0, 0x6B);
TI_CC_SPIWriteByte(TI_CCxxx0_WORCTRL, 0xF8); // 无线唤醒设置: 默认值
TI_CC_SPIWriteByte(TI_CCxxx0_FREND1, 0xB6); // 前端 RX 配置
TI_CC_SPIWriteByte(TI_CCxxx0_FREND0, 0x10); // 前端 TX 配置
TI_CC_SPIWriteByte(TI_CCxxx0_FSCAL3, 0xEA); // 频率合成器校准
TI_CC_SPIWriteByte(TI_CCxxx0_FSCAL2, 0x2A);
TI_CC_SPIWriteByte(TI_CCxxx0_FSCAL1, 0x00);
TI_CC_SPIWriteByte(TI_CCxxx0_FSCAL0, 0x1F);
TI_CC_SPIWriteByte(TI_CCxxx0_RCCTRL1, 0x41); // 振荡器配置: 默认值
TI_CC_SPIWriteByte(TI_CCxxx0_RCCTRL0, 0x00);
TI_CC_SPIWriteByte(TI_CCxxx0_TEST2, 0x88); // Various test settings.
TI_CC_SPIWriteByte(TI_CCxxx0_TEST1, 0x31); // Various test settings.
TI_CC_SPIWriteByte(TI_CCxxx0_TEST0, 0x0B); // Various test settings.
4、请各位高手指点,CC1101进入SLEEP模式的逻辑顺序以及怎么样做低功耗发送数据,感谢不已
1