⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.wsdof.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
20个职位/ 0新
最后发表
BenjaminDu
离线
最后看到:5个月2天前
加入:2016年3月14日02:38
主从时间同步

你好,

我的应用程序有两个580,一个主机和从机
我想让两者时间同步,时间精度是0.01,最好是0.001。

关键词:
设备:
MHv_Dialog
离线
最后看到:3周1小时前
工作人员
加入:2013年12月6日15:10
你好,

你好,

假设同步要求只适用于连接状态,您应该能够依赖于连接事件结束的时间(该事件可以在rwble.c中检测到——在该文件中查找BLE_EVT_END)。

/ MHV

BenjaminDu
离线
最后看到:5个月2天前
加入:2016年3月14日02:38
谢谢MT_dialog,

谢谢MT_dialog,

这几天我研究了你的建议,我认为主从BLE_EVT_END是同步发生的,我可以在双方发生BLE_EVT_END后立即得到时间,然后我可以同步时间。
而BLE_EVT_END发生的如此频繁,我从双方找不到相应的事件,如何解决这个问题?

非常感谢。

MHv_Dialog
离线
最后看到:3周1小时前
工作人员
加入:2013年12月6日15:10
在BLE_EVT_END事件

BLE主服务器和从服务器上的BLE_EVT_END事件应该尽可能接近同步。如果希望限制同步发生的时间,可以实现一个GATT特性,然后写入该特性,然后驱动逻辑在接下来的事件结束时进行同步。你可以在事件被记录之后在rwble.c中添加你的同步代码(这一行记录了事件:arch_rwble_last_event = BLE_EVT_END;-注意,你会在rwble.c中找到两次这样的行。它们中的哪一个实际执行取决于您的电源优化设置)。在中央触发事件和外围触发事件之间可能有一个固定的时间延迟,但它很小,是恒定的,因此可以补偿。

使用BLE_EVT_END的优点之一是您将有大量的时间来管理同步算法。在下一次连接事件之前,不需要处理高优先级的irq。

你可以使用函数uint32_t lld_evt_time_get(void)来获取当前时间,每次增加625us。如果你需要更好的计时,你将不得不禁用睡眠和使用systick定时器,它可以提供低至1us的精度。

请让我们知道,如果你设法实施建议的解决方案。我想这个同步方案将在测距/距离应用中与超音结合起来会非常强大。适当地执行,您可能会得到英寸甚至厘米的类型精度。

/ MHV

/ MHV

BenjaminDu
离线
最后看到:5个月2天前
加入:2016年3月14日02:38
亲爱的MT_dialog,

亲爱的MT_dialog,

非常感谢你的快速反应。

我的问题是如何“识别”同一个主从连接对应的BLE_EVT_END事件,因为事件一个接一个发生的非常快,我无法区分不同的BLE_EVT_END事件。

应用是距离应用,而不是超声波测距。
0.01秒时间同步精度可以满足我的应用程序的要求,更好的同步是首选的,因为我不需要重置同步由于时间漂移短时间使用,我将实现建议的解决方案,但现在我专注于如何“识别”对应的BLE_EVT_END双方。

再次感谢。

MHv_Dialog
离线
最后看到:3周1小时前
工作人员
加入:2013年12月6日15:10
根据特点写作

写入的特性,知道的连接间隔应该让你标记的连接。数据传输将发生在以下连接事件,因此将在服务器端接收(再次,有可能是一个偏移,但该偏移应该是恒定的)。客户端将收到确认时,数据已传输,服务器将收到的指示数据已经到达。

/ MHV

BenjaminDu
离线
最后看到:5个月2天前
加入:2016年3月14日02:38
您好!

您好!
我的问题是两个580主从时间同步的问题,如何才能确定主从的BLE_EVT_END为相对应的事件呢?因为BLE_EVT_END是在不停快速地重复出现,我不知道如何确定主从对应的事件。
只有确定了主从相对应的BLE_EVT_END事件后才可以在事件发生后取得时间以同步。
谢谢!

BenjaminDu
离线
最后看到:5个月2天前
加入:2016年3月14日02:38
亲爱的MHv_Dialog,

亲爱的MHv_Dialog,
非常感谢你的回答。
坦率地说,我是这个领域的新手,虽然我觉得你的回答可能是对的,但经过很多研究,我还是不知道该怎么做。

1.什么是确认和指示?BLE_EVT_END?或其他事件?
2.我仍然不知道如何标记连接,我想应该有一些不同的东西来区分它。

希望你不要对我的问题不耐烦。

MHv_Dialog
离线
最后看到:3周1小时前
工作人员
加入:2013年12月6日15:10
你好,本杰明,

你好,本杰明,

让我说,你已经着手开始做的并不简单:O)

但以下是我如何实现它的核心。首先,在中央和外围设备上,使用app_on_connection事件来重置全局计数器。然后,在rwble.c中,找到指向BLE_EVT_END的两个位置(这个事件有两个实现。哪一个运行取决于您使用的“USE_POWER_OPTIMIZATIONS”)。两个实现都有这样一行:

arch_rwble_last_event = BLE_EVT_END;

在这行之后,在中央和外围设备上,您可以增加在app_on_connection事件中重置的全局计数器,如上所述。两个计数器,一个在中央/主服务器上,一个在外设/从服务器上,将同步运行,因为双方的BLE事件在“几乎完全”相同的时间(微秒间隔)结束——只要你不开始实现从服务器延迟。计数器将是你的粗糙时间。这将给你一个同步的主服务器和从服务器,但是粒度取决于连接间隔(最小7.5ms)。要实现更细的粒度,您可以基于SysTick计时器实现一个细的计时器(有关详细信息,请参阅参考手册)。这个计时器应该在每个BLE_EVT_END重置,并允许您将粒度降低到几微秒。请注意SysTick计时器只在设备处于清醒状态时工作,因此fine计时器仅在您处于清醒状态时有效。

我希望有所帮助。我们都知道它是如何工作的。

/米凯尔

MHv_Dialog
离线
最后看到:3周1小时前
工作人员
加入:2013年12月6日15:10
嗨再次,

嗨再次,

我刚刚实现了上面描述的概念,结果很有希望。我使用无代码项目作为起点,并改变rwble.c来切换BLE_EVT_END上的GPIO高。然后将这个修改过的codelless hexfile加载到两个开发工具包中,并通过AT命令在它们之间建立连接(请参阅codelless文档)。我使用一个逻辑分析仪来监测两个gpio,我看到他们被一个3us偏移与偏移+/- 500ns分开。在使用声音的测距应用中,500ns相当于声音传播不到0.2mm。

有时从服务器会错过从主服务器的传输(这就是RF的“美丽”之处),所以你需要对事件之间的计时器做一些死推算来过滤掉那些实例。但它们应该很容易被发现。

/ MHV

BenjaminDu
离线
最后看到:5个月2天前
加入:2016年3月14日02:38
嗨,米凯尔,

嗨,米凯尔,

我测试的方法,你送给我的,一般来说,这是一个很好的方法,能满足我的需求。我计划有更多的测试因为有问题,看到你这里有更多的信息,我先在这里把我的测试结果。
我遇到的问题是,有大约1%的情况下的BLE_EVT_END不happend同步,无论是从主端或从侧面药膏,在最严重的情况下,不同步为0.5ms,而另外99%的情况下,同步是非常好的。
对于我的应用程序,0.5ms的异步是可以接受的,实际上,如果我愿意,我可以找出异步。
我将进行更多测试,以确定这是真正的异步化还是其他原因。

你提到“从机将错过从机的传输”,你的意思是BLE_EVT_END不会成对发生吗?我很担心这个,但是acc。在我的测试中,这从未发生过。如果这在理论上可以发生,或者像你发现的那样确实发生了,我可以设法避免它的影响。

再次谢谢你,迈克尔。

MHv_Dialog
离线
最后看到:3周1小时前
工作人员
加入:2013年12月6日15:10
你好,本杰明,

你好,本杰明,

很好听,你已经seing结果。在RF的世界里,你偶尔会遇到由其他流量,这会导致“miissing”连接事件阻塞通道。该从机可从主错过TX并试图保持其接收器打开一个长一点。奴隶不考虑事件超时,这会导致过度,直到它的BLE_EVT_END触发后从视从设备的角度看到了一点。该事件仍然发生 - 但你实际上并没有与主机同步。这可能是你在观察什么。为0.5ms听起来是正确的。

/ MHV

BenjaminDu
离线
最后看到:5个月2天前
加入:2016年3月14日02:38
嗨MHv_Dialog,

嗨MHv_Dialog,

非常感谢你的快速反应。
还在为“奴隶将错过从主传输”,它的声音内容,有时可能会错过,而事件(BLE_EVT_END
)永远不会错过(虽然偶尔可能会有一些延迟),换句话说,BLE_EVT_END总是成对发生在主机和从端。

这是非常重要的,如果我假设事件成对发生,而有时在单方(主机或从机)有丢失的事件,这可能是大问题。

我需要一个确认。
如果从理论上讲,不会有任何丢失的事件或错过两侧,我会很放心。
或者在理论上,在单方可能会有缺失的事件,我需要在我的函数中考虑这个。

谢谢。

MHv_Dialog
离线
最后看到:3周1小时前
工作人员
加入:2013年12月6日15:10
我可以肯定会有的

我可以确定,双方的事件数量总是相同的。slave可能不会从中央“听到”消息,但事件仍然会结束——尽管时间会错过大约半毫秒的时间。换句话说,在时间方面会有一些异常值,但主端事件计数总是与从端事件计数相匹配。在您的例子中,1ms的精度已经足够好了,您真的不需要过滤任何内容。

/ MHV

BenjaminDu
离线
最后看到:5个月2天前
加入:2016年3月14日02:38
嗨MHv_Dialog,

嗨MHv_Dialog,

我将使用函数uint32_t lld_evt_time_get(void)来获得你推荐的当前时间,我发现这将是非常方便的,我可以重置这个定时器,有什么函数可以让我这样做吗?

谢谢。

MHv_Dialog
离线
最后看到:3周1小时前
工作人员
加入:2013年12月6日15:10
你好,本杰明,

你好,本杰明,

可没有这样的功能,很遗憾。

/ MHV

BenjaminDu
离线
最后看到:5个月2天前
加入:2016年3月14日02:38
嗨MHv_Dialog队,

嗨MHv_Dialog队,

在使用上述方法时,我遇到了一个新的问题。
我使用“app_connect_confirm”而不是“app_on_connection”(我的SDK是3。我在SDK5中没有例子。x虽然我想使用它)重置一个全局计数器。
在“arch_rwble_last_event = BLE_EVT_END”之后,我按照你的建议在中央和外围增加全局计数器,这工作得很好,直到我发现新的问题。

问题如下:
一段时间后连接的奴隶和主人,短的几分钟,时间是20分钟,在奴隶身边,“app_disconnect_func”电话后,奴隶不能接收信息从主,但“arch_rwble_last_event = BLE_EVT_END”可以excuted两边,奴隶还在前面的速度,但在主端,速度是从属端的15倍。

我的如下分析:
连接断了,因为从端无法接收到主端信息,为什么两边设备都能执行“arch_rwble_last_event = BLE_EVT_END”?

你能在以下方面帮助我吗?
什么是可能振振有辞为什么“app_disconnect_func”被称为在从侧?我认为应该有两个设备没有坏连接的环境。
很明显时间同步是不可能的,希望你能帮我解决这个问题。

谢谢

MT_dialog
离线
最后看到:5个月3个星期前
工作人员
加入:2015-06-08 34
嗨BenjaminDu,

嗨BenjaminDu,

是的,如果设备穿过app_disconnect_func,则连接断开时,BLE_EVT_END是一种状态,当设备是广告,而设备连接,它标志着一个BLE活动结束期间,你应该得到的。所以,你的设备丢失的连接,并将其与广告能够继续,那么你会得到从广告事件BLE_END_EVT。关于你得到断开,也有发生断线,断线可以从中央或外设本身进行初始化,如果外围出于某种原因不可用找师傅的设备可能会连接松动的原因很多指定的连接的时间间隔,或者因某种原因要么从设备的主被推延到发送时,或者当连接间隔时间到达接收。您可以通过在app_disconnect_func()时,设备以确定哪些580个报告,断线原因断开检查的原因下手。

由于MT_dialog

BenjaminDu
离线
最后看到:5个月2天前
加入:2016年3月14日02:38
嗨MT_dialog团队,

嗨MT_dialog团队,

如前所述,
BLE_EVT_END总是发生在成对的主机和从机
并且有了计数器,事件发生后,时间可以同步。
但计数器节目不同地在两侧如果设备中的一个是忙(例如:如果长时间或frquent定时器中断)

1.如何能这样呢,如果BLE_EVT_END总是成对出现在主机和从机发生
2.还有其他保持时间同步的方法吗?

多谢
本杰明

MT_dialog
离线
最后看到:5个月3个星期前
工作人员
加入:2015-06-08 34
嗨BenjaminDu,

嗨BenjaminDu,

  1. 我认为,如果你保持设备占用和替代,维修BLE中断它别的东西的应用程序,这样的事件不会被调度,这可能如果设备之一错过任何一种理由的情况下,例如发生它会被错过。
  2. 没有关于同步两个设备的官方例子。

由于MT_dialog