关于MSP430与CC1101低功耗问题
小弟最近在采用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模式的逻辑顺序以及怎么样做低功耗发送数据,感谢不已,同样欢迎各位同行人进行交流,在这里留下QQ:97068204(加好友请注明中国电子开发网) 顶一个,希望大家多多讨论,共同进步 楼主顶一下你吧,虽然对CC1101不是很了解,但现在正在用MSP430,主要是低功耗功能,而且还要与运算放大器相结合,愁死人了 恩 是的低功耗这东西搞起来的确比较麻烦的,尤其是既要马儿跑得快,又要马儿不吃草的时候 按照楼主所说的情况,显示的功耗为1.5mA左右的确是模块处在IDLE模式,并没有进入SPWD模式。
我现在也发现这个情况一直没能解决。是否可以考虑在SPWD之后加入延时,再把CSn拉高。让模块充分进入SPWD 已经尝试过加延时,在多处地方尝试过,比如说等待模块进入IDLE状态,以及等待模块进入SPWD状态,但是均无效果 既然用MSP430 + CC1101,为什么不用CC430? my_avr 发表于 2012-4-13 09:18 static/image/common/back.gif
既然用MSP430 + CC1101,为什么不用CC430?
那是因为还很多硬件资源需要使用,比如说外部的按键、液晶屏、EEPROM、FLASH、ADC、RTC、等等等
目前进展:在休眠发送数据后,未能恢复250uA的问题已经解决,原因是设备未能进入IDLE模式,现在设备功耗已经能维持在250uA,距离目标40uA更近一步了。
同时,希望有CC1101低功耗发送数据经验的前辈指导!!! 按照手册上所说,进入SPWD状态后只有500na的功耗,现在相差的不是一点点,估计是哪个寄存器没有配置正确,导致不能正确进入SPWD模式。 CSNsunli56xxx 发表于 2012-4-13 11:14 static/image/common/back.gif
按照手册上所说,进入SPWD状态后只有500na的功耗,现在相差的不是一点点,估计是哪个寄存器没有配置正确, ...
感谢您的回复,设备肯定是进入SPWD模式了,可能有些寄存器配置还有问题,继续调试中 网上几乎所有的人都是先SPWD然后CSn拉高就能进入低功耗模式l了,而且很多电流都是在几十个uA。 现在我也在弄这个模块,但是弄了几天还是没什么结果,想用硬件SPI实现的,能设置寄存器也能读出寄存器的值,但是发射接受测验的时候没反应啊,lz能不能指点一下啊,能给个例程最好, liuzs09 发表于 2012-4-13 16:14 static/image/common/back.gif
现在我也在弄这个模块,但是弄了几天还是没什么结果,想用硬件SPI实现的,能设置寄存器也能读出寄存器的值 ...
这是杭州利尔达公司提供的资料,可以给你参考,至于我的代码,暂时无法给你参考,商业机密的问题! 设备功耗问题已经查到,原因是在设计硬件的时候,在CC1101所有的IO口,都采用了上拉电阻,然后的低功耗的时候,模块GDO0 GDO2为低电平,功耗大!!
所以希望这个结论对大家有好处,在设计CC1101的时候,千万别在GDO0 GDO2上加上拉电阻,加了之后,无论你配置为输出高或者输入,都是没有用的,除非你在休眠时,修改GDO0,GDO2寄存器配置!
目前遇到一个问题,就是在接收状态下,切换至发送数据时,发送完成后等待IDLE状态,这个时间太长!不知道是什么原因 seawind319 发表于 2012-4-13 16:21 static/image/common/back.gif
这是杭州利尔达公司提供的资料,可以给你参考,至于我的代码,暂时无法给你参考,商业机密的问题! ...
非常感谢!我再好好看看,得自己摸索摸索 CC430可以到1ua以下的。但是流程我我害得弄下。CC1101可能会稍大。 我用CC430,基本就是2ua左右的电流,如果是什么问题的话,基本就是使用到的端口要特别注意,这部分的漏电流不仔细的话很难发现 最近在学CC1101 ,mark下。 1101的待机0.2,我也是430+1101总功耗0.7,当然无其他外设。
来自:amoBBS 阿莫电子论坛 iPhone客户端 这个东西我也在搞,不过我用的是MSP430+CC1100,原来用的电磁波激活模式,待机电流能到3uA;这次准备采用主动发送模式了,程序还没有改完。
主动发送模式下,如果要进行双向通讯,是不是在从机主动发送完毕后进入接收状态一段时间等待主机发送数据?这个时间如何确定比较好?
再有就是从机主动上传的电磁波碰撞问题,多个从机如果同时发送就会造成电磁波碰撞,我现在的想到的处理方法如下,请大家看看对不对:
1.首先在发送前使用载波监听功能,如果没有监听到载波就立即发送,否则,延时一个随机时间后再发送;
2.从机每次发送完成后,都要求能接收到下发的数据,如果多次接收不到主机下发的数据,则下次定时发送时间将加上一个随机的延时时间。(这种情况是为了避免多个从机完全同时刻发送的极端情况) wor模式和从机主动发送后接收主机命令模式我都测试过,可行性都可以
wor模式不用多讲了,有很多好处,开启rssi判断后,功耗有大大降低
从机发送结束后,会立即进入接收模式,接收超时时间对于1101是可配置的,无需mcu介入,接收时间无需太长,只要保证能接收到主机的第一个字节即可,因为1101的机制是在接受状态下,即使超时时间到了,只要同步字已经被接收到,那么rx的时间将继续延迟到帧完整的接收到。
对于主机,当收到从机时,将进入tx模式,通过软件判断之前预存的命令将发给谁,进行匹配,立即发送。 我做的人员标签也是430加CC平时PD模式0.3UA。。。
好好看看DATASHEET, 注意控制字的写入顺序,多参考下官方的历程 最近正在芯片选型,,,,看到上面这么多大牛,功耗都在个位数的ua,心里有底了,望多多交流啊....... 低功耗不单单是芯片的低功耗,外围电路的低功耗设计非常重要
最简单的,给无线模块加个电源控制引脚,那么在无线模块上电的瞬间可以省不少电
测试过用mos管控制无线模块电源,加一个电容和不加电容,示波器测量出来,有电容时电源关闭时间2us,没电容时,电源关闭时间是30ms
对于某些场合,特别是能量收集系统,这是非常重要的 顶一个,希望大家多多讨论,共同进步 也在搞430低功耗,我现在用149,整机休眠大概4uA左右 正在用,学习中,谢谢 本帖最后由 movenight 于 2012-6-27 09:24 编辑
mark一下,最近也很关注cc430方案的功耗问题。这里有没有南京的兄弟能做兼职的?有的话给我发悄悄话。谢谢 不错哈,谢谢分享。 求楼主QQ 求指导~~~求帮助,我发送 却总是无法接收 不知道为什么,我用示波器看过波形,但是 怎么都是不对 求指导 求帮助~~~ MARK !!!!!! 楼主还在吗,从发送转到接收后接收不到数据有遇到过吗。 ddddddddddddddddddddddd mark一下,楼主经验之谈 cc430价格多少啊 标记一下,正在用CC430做低功耗 Cortex_M3 发表于 2013-2-26 13:57 static/image/common/back.gif
标记一下,正在用CC430做低功耗
嗯,我也一样,有机会多向前辈们学习,少走弯路。 seawind319 发表于 2012-4-13 16:25 static/image/common/back.gif
设备功耗问题已经查到,原因是在设计硬件的时候,在CC1101所有的IO口,都采用了上拉电阻,然后的低功耗的时 ...
这条对我很有启发。谢谢
顶一下,最近在研究CC的WOR中 现在也在做无线低功耗的东西,顶一下
页:
[1]