void CC1101_WOR_Init( uint8 EN_wor, uint16 t_100ms )//一个单位100ms
{
uint16 time_Event0;
//time_Event0=t_100ms*3467;//WOR_RES=0的情况下
time_Event0=t_100ms*109;//WOR_RES=1的情况下
//—————————————————————–
halSpiStrobe(CCxxx0_SIDLE);
if(EN_wor)//使能WOR配置
{
//—————————————————————–
// 设置RX溢出时间:Setting Rx_timeout > 225.0 ms.
// MCSM2[2:0].RX_TIME = 000b
// Rx_timeout = T_event0*12.505%=225ms — 12.505%(WOR_RES=0) RX 占空比
halSpiWriteReg(CCxxx0_MCSM2,0x08);
//—————————————————————–
// RXOFF_MODE=00b (RX->IDLE: no FS calib: 0.1 us), TXOFF_MODE=00b (TX->IDLE, no FS calib: 0.1 us).
halSpiWriteReg(CCxxx0_MCSM1,0x00);//RX和TX后都回到空闲状态
//—————————————————————–
//MCSM0[5:4]FS_AUTOCAL=11b
halSpiWriteReg(CCxxx0_MCSM0,0x38); //IDLE转到RX、TX自动校准;PO_TIMEOUT=150us
//—————————————————————–
// 使能自动校准晶振
// 设置事件1:WORCTRL[6:4]EVENT1 = 111b ;T_event1=1.4 ms
// Enable RC oscillator before starting with WOR (or else it will not wake up).
halSpiWriteReg(CCxxx0_WORCTRL,0x79);//WOR_RES[1:0]=01b
//—————————————————————– // 设置事件0溢出时间:Set Event0 timeout = (RX polling interval)
// 条件1:WOR_RES = 1
// 条件2:EVENT0 = // 条件3:Assuming f_xosc = 26 MHz
// 公式:T_event0 = (750 / f_xosc) * EVENT0 * 2**(5*WOR_RES) = ms
halSpiWriteReg(CCxxx0_WOREVT1,0xFF&(time_Event0>>8)); //高字节事件0 超时
halSpiWriteReg(CCxxx0_WOREVT0,0xFF&(time_Event0)); //低字节事件0 超时
//halSpiStrobe( CCxxx0_SWORRST );//复位实时时钟为事件1 值
halSpiStrobe( CCxxx0_SWOR );//
}
else
{
;//不执行WOR配置
}
}
以上是我的代码设置WOR,现在我有几个问题需解决
1、CC1101使用手册中提到进入SWOR选通脉冲前启用RC振荡器,但我没有找到RC振荡器启用的地方?
2、WOR的流程是不是这样理解的:a、打开SWOR,之后会休眠;b、休眠时间结束,醒来之后判断是否有数据,没有继续休眠。我想问一下b的这种状况是怎么继续休眠的?因为我的设备休眠醒来之后无法进入休眠,要继续休眠是否需要发送SWOR滤波命令?
3、在发送或者接收之后再回到休眠模式是自动还是需要手动发送SWOR呢?
Butterfly:
建议看下http://www.ti.com/lit/an/slaa459a/slaa459a.pdf
打开SWOR之后,周期性定时唤醒通过CS或者PQT方式嗅探空中是否有包,不需要MCU的干预,相当于芯片内部有个定时器
再次回到WOR需要再次手动发送SWOR
botong Liu:
回复 Butterfly:
谢谢Butterfly,我详细看了关于WOR方面的文档及例程,我总结了以下几个知识点,不知道对不对。
1、刚开始的时候,我以为WOR的功能就是空中有数据的时候,接收机就会唤醒接收数据;这个错误的观点一直误导了我,其实这个功能真正描述是这样的:WOR是在定时周期唤醒的时候才会接收数据,而不是空中有数据就会接收;那么如何能让接收机收到数据呢?官方文档讲述了wor的300ms例子,事件0的时间是300ms,接收时间是1.17ms,由于我们不知道接收机什么时候会醒来,所以发射机需要以间隔1ms的时间持续发送相同的数据包,发送的数据包超过300个,接收机就会在唤醒接收的时间里收到发射机的数据。这就意味着发射机发送数据要持续发送300ms以上。当然为了避免发送那么多次,于是又有了WOR-ACK;就是接收机收到数据后,回发响应信息给发射机,发射机就会停止继续发送。我理解的整个WOR的流程就是这样,但是做起来的时候特别困难,WOR官方例程传输只是一个字节,实际应用时字节应该比较多,那么发射机定时发送时,发送一包数据时间会增长吧,那么怎么拿捏发射机的发送时间间隔和接收机接收时间就变得很重要;我测试的时候明显发现发射机的发送字节越多发送时间越长。
2、鉴于以上的WOR方式,我觉得不太合理,于是想了另一个方案,不知道可靠不可靠。方案大概如下:a、GDO0判断事件0的时间到来(事件0的时间设为3000ms),触发中断退出WOR;b、退出WOR后从机向主机询问是否有数据下发(发送完询问消息后进入接收状态);c、从机在接收状态等待100ms的时间,如果有数据则处理完数据后立即进入WOR,如果没有数据则等待100ms后也进入WOR;d、继续等待下一个的事件0的到来。这种方案的缺点就是主机必须缓存很多数据,主机下发的数据都缓存起来,等到从机询问的时候再下发数据,如果同时有两个或者更多的从机询问时,主机下发数据就会冲突。
3、还有一种实现低功耗的方案就是使用SPWD指令进入休眠状态,由MCU定时唤醒,执行类似于方案2的方式。
目前正在尝试方案2,希望可以实现低功耗,也希望TI大神多给点建议或者补充不足之处,谢谢!
Butterfly:
回复 botong Liu:
简单来说WOR功能,发射端加长Preabmle,而接收端唤醒的间隔小于Preamble长度,从而不会出现丢包情况,但因为Tx Preamble的加长,所以Tx功耗肯定会上升一点
所以,说说你的应用场景,以及发送端和接收端的功耗要求?
botong Liu:
回复 Butterfly:
Butterfly,你好!这几天忙于赶其他的事情,以至于这时候才回帖;我们公司开发这个项目,主要是应用在智能家居无线数据的传输方面,及家电控制方面;我们设置一个主机和多从机,主机不考虑功耗,从机功耗最好可以达到官方手册的参考值;我在测试还是有几个问题没解决:
1、WOR方式,主机多字节发送给从机,丢包很严重;
2、WOR方式,主机连续发送300ms时,其他从机有数据来,会冲突或者丢包吧?
Butterfly:
回复 botong Liu:
“ 2、WOR方式,主机连续发送300ms时,其他从机有数据来,会冲突或者丢包吧?”
1、你组网方式是点对点还是星型网?
2、如果用WOR方式的话,用CC1101,不考虑发送端的功耗,只考虑接收的话,功耗可以做到几个mA。丢包严重,估计是接收端WOR时间寄存器设的不对。另外,环境干扰情况怎么样?
3、如果接收功耗要做到极致的话,用CC1200或者CC1120(有例程),WOR+智能包头方式,平均接收功耗可以做到20uA,参考文档 http://www.ti.com/lit/an/swra438/swra438.pdf
botong Liu:
回复 Butterfly:
1、组网方式是星型网络的
2、CC1101,WOR方式功耗不会这么高吧,如果是平均功耗的话倒也是事实。一般办公室环境,桌面附近有个无线路由器。
3、我看了这两款芯片,的确比较吸引人,但是我们前期想做软件先,硬件等软件稳定再做,考虑成本问题,目前CC1101是比较好的选择,市面上的模块比较多。而且我们已经入手CC1101这芯片的模块了,如果要换,时间和精力都很大……
Butterfly:
回复 botong Liu:
星型网没有问题,WOR功耗取决于Sleep间隔
lei li9:
回复 botong Liu:
你的问题解决了吗?我也碰到同样的问题,能否加我QQ交流下,QQ:562212636或者你留个联系方式,望不吝赐教,多谢!!!
lei li9:
回复 botong Liu:
@botong Liu 能否加我QQ交流下,QQ:562212636,或者你留个联系方式,我加你。