TI中文支持网
TI专业的中文技术问题搜集分享网站

cc254x simpleBLECentral RSSI 获取更新问题

一个板子跑SimpleBLEPeripheral 做 从设备

另外一个板子使用CC2540 Development Kit套件,软件用simpleBLECentral 工程。如果使用BLE-CC254x-1.4的协议栈,central设备跟peripheral设备连上之后,按向下键,获取并在LCD上显示当前的RSSI。 这个RSSI并不能实时更新,无论central和peripheral的距离怎么改变。 除非是断开后重新连接,RSSI显示数值才会改变。

但是同样的操作,在BLE-CC254x-1.2.1的协议栈中,RSSI是能根据距离变化而改变的。

有谁知道其中原因吗,能在BLE-CC254x-1.4上优化好这个问题吗,请教如何解决?谢谢

Yan:

boson,

这是已知的一个bug, 在下一版新的SDK中会修正。

谢谢!

Zhu.L:

这个是在BLE1.4的协议栈中的问题,没有源码可以修正。只好等下一个版本。但如果没有特别要求的话,可以用BLE 1.3.2版替代,1.3.2的处理是比较正确的。

Rssi的周期获取是在Profile Role 中的center.c中实现的,提供部分回调接口供simpleBLECentral注册使用。

static const gapCentralRoleCB_t simpleBLERoleCB ={ simpleBLECentralRssiCB, // RSSI callback simpleBLECentralEventCB // Event callback};

在APP层的simpleBLECentralRssiCB回调中只简单打印LCD。

LCD_WRITE_STRING_VALUE( "RSSI -dB:", (uint8) (-rssi), 10, HAL_LCD_LINE_1 );

整个routing是开始时启动一个计时器,周期为1秒。然后在center.c中的gapCentralRole_ProcessOSALMsg( )函数中处理rssi消息,调用HCI层的API接口HCI_ReadRssiCmd( pRssi->connHandle )。这也是异步的,当获取到rssi值后,系统会调用初始化时注册的simpleBLECentralRssiCB。 

 

但是最终问题就在这个过程中,int8 rssi这个参数传递的永远是第一次连接或者最后一次读写GATT value时的rssi值,并不会动态地提供瞬时rssi值。其实在Advertising和Connect Event过程中,底层数据包都携带rssi参数,但是1.4 SDK没有在Connect Event中把系统传过来的rssi值透传给注册的simpleBLECentralRssiCB函数的参数int8 rssi,从而导致LCD显示的值毫无变化,除非做一次读写操作。

如果回退到SDK1.3.2版本,仍然会有显示的minor bug. 在距离较远的时候,rssi信号不强,跳变比较厉害的时候,-rssi会显示129。因为一个uint8是255,如果传入的rssi为0,-0的时候会出问题。所以在使用是,可以把这个特殊数据过滤掉,则基本不影响使用。

zwq zhou:

回复 Zhu.L:

 你好,这句话:“整个routing是开始时启动一个计时器,周期为1秒。”

是不是就是: GAPCentralRole_StartRssi( p->simpleBLEConnHandle, DEFAULT_RSSI_PERIOD );

这个里面的:“DEFAULT_RSSI_PERIOD ”,宏定义为1000。

那是否是我最小可以定义为1即1ms。在1.3.2协议栈下获取RSSI。

yongcai zhang:

回复 Yan:

@Y

1)麻烦问下可以测量主机本身的rssi的值么?我是做主机的,如果可以通过哪个函数实现呢???

2)SimpleBLECentralRssiCB( uint16 connHandle, int8 rssi )

这个是么?

3)这个是在什么时候调用的呢?

4)是测量哪个rssi的值的呢??

cedar_xuesong:

回复 yongcai zhang:

http://blog.csdn.net/Stephen_Lu_Fahai/article/details/49893509

赞(0)
未经允许不得转载:TI中文支持网 » cc254x simpleBLECentral RSSI 获取更新问题
分享到: 更多 (0)