Tinyos 采集noise floor

update 2018-6-4:

更新了可以用的tinyos noise 采集的代码,非常简单的从tinyos 本身提取出来的。

https://download.csdn.net/download/ls1160/10457438

==========================


最近在搞Tinyos,苦于网络上资料实在太少,而且bbs等问答平台已经没有人在更新了,因此主要根据前人留下的代码,以及相关文档,自己摸索,以实现自己的需求。 就目前来看,利用现有的资源,基本能够满足的需求,只是需要多花时间。说实话,自己做之前那个项目的老毛病还是没有改掉:太着急。

总是急于想要一步能够跨到结果,想要敏捷开发,但是却常常扇着腰。


在预估工作量的时候,切记一定将某些必须花长时间才能搞定的东西考虑进去,不能认为任何事情自己都能迅速弄懂,花上一天,两天,研究一个东西的运行机制是非常有可能,也是很有必要的。特别对于系统的关键环节,它可能都是会对系统最终的性能产生直接的影响的。
之前的项目,在做的时候,一直都是利用机器学习算法,然而并不曾深入了解这个算法,然而对于我的系统而言,了解算法的推导与计算,对于系统的性能是非常必要的。现在同样的,了解RSSI采样的机制,SFD,CCA运行的机制,非常有必要,而且不能少。  之后一定对需要长时间完成的工作进行提前预估,并且按部就班进行。好的,进入正题:


本节主要根据已有的代码,解释如何直接采集信道的RSSI,而不是提取MAC pkg中的RSSI。
Tinyos官方教程里面的Demo是提取包里面的(http://tinyos.stanford.edu/tinyos-wiki/index.php/Rssi_Demo),对于直接采,如noise floor,只是说自己看module的实现,这个感觉有点坑了,不过还好,有以前实现的代码。


# 坑1
1. 这个位置,我其实入了一个坑,曾经尝试自己找找,在接受pkg的时候,tinyos是如何提取RSSI,并且将它append到包尾。
就找到了这么一个command,看起来超级合理,超级像。


在tos/chips/cc2420/control/CC2420ControlP 中,有个command。


  /***************** ReadRssi Commands ****************/
  command error_t ReadRssi.read() { 
    return call RssiResource.request();
  }






# 坑2
2. 结果发现采集到的数据很奇怪,在换算之前是76上下,换算之后76-304= -228dBm,这是不科学的。此方法,卒。
所以直接翻看之前的代码,之前的代码修改了driver,从buffer里面去rssi的速度变快了,但是我并不需要。因此,照葫芦画瓢的修改了一下。


最终整理下来,应当有如下修改:


2.1 XAppC.nc 中。

  components new CC2420RssiC() as RssiC;
  App.RssiResource -> RssiC;
  App.Rssi -> RssiC;




2.2 XC.nc中,接口调用。
  interface Resource as RssiResource;
  interface CC2420Register as Rssi;


2.3 Rssi从buffer读取的代码。这段不是太懂,
/******************* rssi related functions ***************/
   static inline void split_write(uint8_t val) {
       U0TXBUF = val;
  }
    static inline uint8_t split_read() {
        while ( !(IFG1 & URXIFG0) ){}
        return U0RXBUF;
    }
    static inline uint8_t split_read_write(uint8_t val) {
        uint8_t tmp;
        while ( !(IFG1 & URXIFG0) ){ }
        tmp = U0RXBUF;
        while ( !(IFG1 & UTXIFG0) ){}
        U0TXBUF = val;
        return tmp;
    }

uint16_t Rssi;
    uint16_t readRSSI() {
      uint8_t addr = 0x13 | 0x40;
      P4OUT |= (1 << 2);
      P4OUT &= ~(1 << 2);
      split_write( addr );
      split_read_write( 0 );              //reading the return value of split_write(addr)
      split_read_write( 0 );              //reading the high 8 bits
      Rssi = split_read_write( addr );     //reading the low 8 bits and write addr to bus.   
      P4OUT |= (1 << 2);
      return Rssi;
    }




2.4 Rssi采样的请求,以及释放这个请求。
    
  if (call RssiResource.immediateRequest() == SUCCESS ){ //first calling the rssi sampling.
          eint(); // not know, may be in the standard head files.
          rssi= readRSSI();
          printf("-%u.\n", ((~ ((uint8_t) (rssi&0xff))) + 45 )&0xff);
        call RssiResource.release();
        dint();
      }else{
        call RssiResource.request();
      }




2.5 在调用RssiResource.request函数的时候,会调用的callback。


event void RssiResource.granted(){
        rssi= readRSSI();
  	printf("-%u.\n",  ((~ ((uint8_t) (rssi&0xff))) + 45 )&0xff);
	call RssiResource.release(); //release the resource. 
}



2.6 RssiC.nc
/******************************************************************
    CC2420RssiC.nc created by HyungJune Lee (abbado@stanford.edu)
 ******************************************************************/


generic configuration CC2420RssiC()
{
        provides interface Resource;
        provides interface CC2420Register as RSSI;
}


implementation
{
        enum
        {
                SPI_ID = unique("CC2420Spi.Resource")
        };
        components CC2420SpiP as Spi;


        Resource = Spi.Resource[SPI_ID];
        RSSI = Spi.Reg[CC2420_RSSI];
}




2.7 至此,这个Rssi数据应当是正常获取了。实际使用的时候,主要是2.4 和2.5 两个部分。





















评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值