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

CC2540–关于osal_getClock()和osal_setClock()函数相关问题

在系统启动初始化我利用osal_setClock()设置时间初始值为0,蓝牙和手机不连接,间隔半小时用LightBlue连接读取芯片上时间(利用osal_getClock()),读了四次,读到时间是正确的,和我手机计时器上的时间一致。

同样方法,区别是蓝牙始终和LightBlue保持连接状态,但是读取到时间明显比手机计时器的时间滞后,在两个小时30分钟后慢了75秒

请问为什么会这样???

Barbara Wu:

请问在第一种状态下,蓝牙不和手机连接的时候保持在什么状态?广播状态?

zhaoyan Wu:

回复 Barbara Wu:

没有,广播180s后不再广播,除非按钮触发它。

Barbara Wu:

回复 zhaoyan Wu:

那也就是说广播之后就进入PM3模式了,最低功耗必须要外部中断才能唤醒。那么可以理解没有使用到慢时钟,或者快慢时钟的切换使用的不是那么频繁。如果是保持连接power saving打开的话在两个connection intervel之间就是PM2模式 会有快慢时钟的切换 可能导致不准

可以把Power saving关掉再试试看结果如何

zhaoyan Wu:

回复 Barbara Wu:

很抱歉,这么晚回复!最近在忙其他事。

我做了测试,关闭了Power Saving ,但是时间还是出现偏差。

Barbara Wu:

回复 zhaoyan Wu:

在代码里面加HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT );试一下

zhaoyan Wu:

回复 Barbara Wu:

 我在初始化地方加入HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT );

时间还是有偏差,我用两个模块同时工作,一个我用LightBlue一直连接,一个没有连接做了对比。

测试两种情况:1,关闭POWER SAVING宏 和添加HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT );—-测试0.5H,连接的滞后13秒左右

2,开启POWER SAVING宏和添加HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT );—-测试0.5H,连接的滞后13秒左右

另外,请问这个HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT );我添加地方是否正确?我就放在xxxBLEPeripheral_Init( uint8 task_id )函数开始的位置。HCI_EXT_ClkDivOnHaltCmd返回值为0.

zhaoyan Wu:

回复 Barbara Wu:

Hi,WBJ。如果系统时间不准确是由于振荡器引起,我查了一下资料。有下面几个问题,麻烦您看一下。

问题1:协议栈使用那个振荡器为系统提供时间,32KHz XOSC(32.768KHz)??

问题2,:如果问题1的答案是32KHz XOSC,那么我的时间不准确可能是在蓝牙设备和手机一直保持连接时,蓝牙设备可能进入PM1或PM2,这时可能协议栈自动去选择使用32KHz XOSC还是32KHz RCOSC,如果选择了RCOSC,可能导致时间不正确。这种说法是否正确?

问题3,:如果问题2我的说法正确,那么我要保证我的系统时间正确,我就要保证我的系统要选择在32KHz XOSC。我的设备不会进入PM3模式,我能不能设置,我的蓝牙设备无论在哪个模式下(除PM3),我都要32KHz XOSC这个在工作。请问怎么设置?

Barbara Wu:

回复 zhaoyan Wu:

协议栈选用的时钟源是根据不同的状态决定的 当active的时候应该是32M的时钟, 进入PM2应该是32K的时钟,但是是R还是X是代码里面可以设置的,R没有X准这是肯定的,所以我们不建议会采用PM2模式的BLE设备不使用外部32K时钟。PM3模式下,应该是所有的时钟都会停下来不工作。

zhaoyan Wu:

回复 Barbara Wu:

Hi,WBJ.

协议栈是否有提供接口函数来设置32K振荡器是R还是X?

目前我没有条件去使用外部时钟,但是CC2540本身就有一个32.768的时钟。所以只要保证我的蓝牙设备一定不会进入PM3模式,而在其他模式中,我的32.768振荡器一直是工作的,这样我就可以保证系统时间的准确性。这个想法是否正确?有可行性吗?我要怎样去保证32.768的振荡器一直在工作?

Barbara Wu:

回复 zhaoyan Wu:

看一下文件hal_board_cfg.h

CC2540的RCOSC不那么准,在有用到sleep mode的时候就会用到32K的clock,所以如果没有外部32K,进入PM2会导致timer不准。但是在BLE active工作的时候又会切到32M clock。不是说内部32K RC一直开着就不会偏,精度不高越跑兴许偏差越大。

赞(0)
未经允许不得转载:TI中文支持网 » CC2540–关于osal_getClock()和osal_setClock()函数相关问题
分享到: 更多 (0)