嗨,
我的申请有两个580,一个主从机我希望两者有时间同步,时间精度为0.01s,更好为0.001秒。
假设同步要求仅适用于连接状态,您应该能够依赖连接事件结束的定时(此事件可以在RWBE.C中检测到该文件中的BLE_EVT_END)。
/ MHv
谢谢MT_dialog,
我现在研究了你的建议,我想主机和从属BLE_EVT_END发生同步,我可以在BLE_EVT_END发生在两侧后立即获得时间,然后我可以让时间同步。虽然BLE_EVT_END经常发生,但我找不到两侧的相应事件,如何解决这个问题?
非常感谢。
BLE Master和Slave上的BLE_EVT_END事件应尽可能接近同步。如果要限制同步何时进行,则可以实现写入的GATT字符,然后将逻辑驱动到以下事件结束时驱动逻辑以同步。您可以在录制事件后立即在Rwble.c中添加同步码(此行记录事件:ARCH_RWBLE_LAST_EVENT = BLE_EVT_END; - 请注意,您将在RWBE.C中找到此行两次。它们实际上是哪一个执行取决于您的电源优化设置)。在中央的事件和外围设备上触发的事件触发之间可能存在固定的时间延迟,但它将是小的,常数,因此可以得到补偿。
使用BLE_EVT_END的一个优点是您将有很多时间来管理同步算法。直到下一个连接事件之前,否则不需要高优先级。
您可以使用uint32_t lld_evt_time_get(void)来获取625us增量的当前时间。如果您需要比这更好的时间,您将不得不禁用睡眠并使用Systick计时器,该计时器可以提供低至1US精度。
如果您设法实施建议的解决方案,请告诉我们。我想到这种同步方案与测距/距离应用中的超声相结合真正强大。正确实施,您可能会达到英寸甚至厘米型精度。
亲爱的mt_dialog,
非常感谢你的快速回复。
我的问题中心周围如何“识别”相应的BLE_EVT_END与主站和从站相同的连接,因为该事件陆续到另一个非常快,我无法区分不同的BLE_EVT_END事件。
应用程序是距离应用,但不是超声测距。0.01s时间同步精度可以满足我的应用要求,更好的同步,因为我不需要由于时间漂移来重置同步,我将实施建议的解决方案,但现在我专注于如何“识别'来自双方的相应ble_evt_end。
再次感谢。
写入特征并知道连接间隔将允许您标记连接。数据的传输将在接下来的连接事件中发生,服务器端的接收也将发生(同样,可能会有一个偏移量,但这个偏移量应该是常量)。当数据被传输时,客户端将收到一个确认,服务器将收到一个数据已经到达的指示。
您好!我的不法是580主从时空的问题,如何才能确定主从的的ble_evt_end为相对应的事件呢?因为ble_evt_end是什么是在不到的地方重复出现,我不再如何确定主从的事件。只有确定了主从相对应的BLE_EVT_END事件后才可以在事件发生后取得时间以同步。谢谢!
亲爱的mhv_dialog,非常感谢您的回答。要坦率地,我是这个领域的新手,虽然我觉得你的答案可能是一个正确的问题,但在很多学习之后,仍然不知道怎么办。
1.确认和指示是什么?BLE_EVT_END吗?或其他事件吗?2.still我不知道如何标记连接,我认为应该有一些不同的东西来区分它。
希望你对我的问题不耐烦。
嗨本杰明,
首先,我想说的是,你们要做的事情并不简单。
但这是我如何尝试实现它的核心。首先,在中央和外设都使用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计时器只能工作,因此精细定时器仅在唤醒时有效。
我希望这对你有所帮助。让我们都知道结果如何。
/ mikael.
你好再次,
我刚刚实施了上述概念,结果很有希望。我将无附庸项目用作起点并更改了rwble.c在ble_evt_end上切换gpio。然后,我将此已修改的无附件六角文件加载到两个开发套件上,并通过命令在它们之间建立连接(请参阅无附带文档)。我使用逻辑分析仪监视两个GPIO,我看到它们被3US偏移分隔,偏差偏差+/- 500ns。在使用声音的测距应用程序中,500ns的声音行驶小于0.2mm。
有时,从奴隶会错过来自主人的传输(这是rf的“美”),因此您需要在事件之间进行一些死亡时间来过滤掉这些实例。但它们应该很容易被发现。
嗨mikael,
我正在测试你给我的方法,总的来说,这是一个很好的方法,可以满足我的需求。我计划有更多的测试,因为有问题,看到你有更多的信息在这里,我把我的测试结果放在这里。我遇到的问题是,大约有1%的情况下BLE_EVT_END不是同步发生的,无论是从主端还是从药膏端,在最严重的情况下,异步是0.5ms,而其他99%的情况下,同步非常好。对于我的应用,实际上,0.5ms的异步是可接受的,如果我想要,我可以找到仿咽部。我正在进行更多的测试,以了解它是否是真实的异步,否则它是由于其他原因。
你提到的“奴隶会错过主人的传输”你的意思是ble_evt_end不会成对发生?我担心了这一点,但是acc。到我的测试,这从未发生过。如果这可以理论上可能发生或在您发现的时候实际发生,我可以设法避免它的效果。
再次感谢mikael。
很高兴听到你已经看到成果了。在RF的世界中,您偶尔会遇到被其他流量阻塞的通道,这将导致“丢失”连接事件。从机可能会错过来自主机的TX,并将尝试保持它的接收器打开一段时间。slave直到超时才认为事件结束,从slave的角度来看,这会导致稍后触发BLE_EVT_END。事件仍然会发生-但你实际上与主服务器不同步。这很可能就是你所观察到的。0.5毫秒听起来差不多。
嗨MHv_Dialog,
非常感谢你的快速回复。仍然对于“从机将错过从机的传输”,它听起来有时可能错过的内容,而事件(BLE_EVT_END)永远不会错过(偶尔可能会有一些延迟),换句话说,BLE_EVT_END始终成对在主机和从站。
这是非常重要的,如果我想事件成对发生,而有时在单侧丢失事件(主机或从属),则可能存在大问题。
我需要确认一下。如果在理论上,不会有任何遗漏的事件或双方的遗漏,我就放心了。或者理论上,在单侧将有可能丢失事件,我需要在我的功能中考虑这一点。
谢谢。
我可以确认两侧总会有相同数量的事件。从中央奴隶可能不会“听到”,但事件仍然会结束 - 尽管时机会错过一半的东西。换句话说,将有一些异常值与时序一样,但主侧的事件计数将始终匹配从设备的。在您的情况下,其中1ms精度足够好,您真的不必过滤掉。
嗨mhv_dialog,
我将使用uint32_t lld_evt_time_get(void)获取当前时间,因为您推荐,我发现我能够重置这个计时器将非常方便,有没有任何功能可供我这样做?
不幸的是,没有这样的功能。
嗨MHv_Dialog团队,
在使用上述方法的同时,我遇到了一个新问题。我使用“app_connect_confirm”而不是“app_on_connection”(我的sdk是3.x,我在sdk5.x中没有示例,虽然我想使用它)来重置全局计数器。在“Arch_rwble_last_Event = BLE_EVT_END”之后,当您建议时,我将全局计数器递增,直到找到新问题,这会很好。
问题如下:有一段时间后,从奴隶和掌握后,短到几分钟,更长的是20分钟,在奴隶侧,在呼叫“app_disconnect_func”的时候,从机无法从主站接到信息,但“arch_rwble_last_event =”app_rwble_last_event =BLE_EVT_END“可以在两侧令人作呕,从站仍然处于先前的速度,但在主侧,速度是从速度的15倍。
我的分析如下:Connect坏了,因为从机无法接收来自主机的信息,但为什么在两侧,设备都可以执行“Arch_rwble_last_event = ble_evt_end”?
你能帮我解决以下问题吗?在从端调用"app_disconnect_func"的可能原因是什么?我认为这两个设备应该没有糟糕的连接环境。因为它显然,时间同步是不可能的,希望您能帮助我解决问题。
谢谢
嗨BenjaminDu,
是的,如果设备通过app_disconnect_func,那么连接断开了,BLE_EVT_END是一个状态,当设备在发布广告时,当设备连接时,它表示BLE活动的结束周期。所以你的设备失去了连接,它继续广告,所以你将从广告事件获得BLE_END_EVT。关于的断开,断开的发生有许多原因,可以初始化从中央或断开外围本身,可能松散连接的设备如果外围出于某种原因没有找到主人指定的连接上的间隔,或者由于某种原因,当连接间隔时间到达时,从服务器的主服务器发送或接收延迟。首先可以在app_disconnect_func()中检查设备断开时的原因,以确定580报告的断开原因。
谢谢mt_dialog.
嗨mt_dialog团队,
正如前面讨论的,BLE_EVT_END总是成对发生在主机和从端在事件发生后,与计数器一起,时间可以循环。但是如果其中一个设备繁忙(例如:如果长时间或频繁定时器中断),计数器在两边的显示是不同的。
1.如果BLE_EVT_END总是在主机和从端成对发生,这怎么可能发生2.任何其他方式保持时间同步吗?
非常感谢便雅悯
嗨,
假设同步要求仅适用于连接状态,您应该能够依赖连接事件结束的定时(此事件可以在RWBE.C中检测到该文件中的BLE_EVT_END)。
/ MHv
谢谢MT_dialog,
我现在研究了你的建议,我想主机和从属BLE_EVT_END发生同步,我可以在BLE_EVT_END发生在两侧后立即获得时间,然后我可以让时间同步。
虽然BLE_EVT_END经常发生,但我找不到两侧的相应事件,如何解决这个问题?
非常感谢。
BLE Master和Slave上的BLE_EVT_END事件应尽可能接近同步。如果要限制同步何时进行,则可以实现写入的GATT字符,然后将逻辑驱动到以下事件结束时驱动逻辑以同步。您可以在录制事件后立即在Rwble.c中添加同步码(此行记录事件:ARCH_RWBLE_LAST_EVENT = BLE_EVT_END; - 请注意,您将在RWBE.C中找到此行两次。它们实际上是哪一个执行取决于您的电源优化设置)。在中央的事件和外围设备上触发的事件触发之间可能存在固定的时间延迟,但它将是小的,常数,因此可以得到补偿。
使用BLE_EVT_END的一个优点是您将有很多时间来管理同步算法。直到下一个连接事件之前,否则不需要高优先级。
您可以使用uint32_t lld_evt_time_get(void)来获取625us增量的当前时间。如果您需要比这更好的时间,您将不得不禁用睡眠并使用Systick计时器,该计时器可以提供低至1US精度。
如果您设法实施建议的解决方案,请告诉我们。我想到这种同步方案与测距/距离应用中的超声相结合真正强大。正确实施,您可能会达到英寸甚至厘米型精度。
/ MHv
/ MHv
亲爱的mt_dialog,
非常感谢你的快速回复。
我的问题中心周围如何“识别”相应的BLE_EVT_END与主站和从站相同的连接,因为该事件陆续到另一个非常快,我无法区分不同的BLE_EVT_END事件。
应用程序是距离应用,但不是超声测距。
0.01s时间同步精度可以满足我的应用要求,更好的同步,因为我不需要由于时间漂移来重置同步,我将实施建议的解决方案,但现在我专注于如何“识别'来自双方的相应ble_evt_end。
再次感谢。
写入特征并知道连接间隔将允许您标记连接。数据的传输将在接下来的连接事件中发生,服务器端的接收也将发生(同样,可能会有一个偏移量,但这个偏移量应该是常量)。当数据被传输时,客户端将收到一个确认,服务器将收到一个数据已经到达的指示。
/ MHv
您好!
我的不法是580主从时空的问题,如何才能确定主从的的ble_evt_end为相对应的事件呢?因为ble_evt_end是什么是在不到的地方重复出现,我不再如何确定主从的事件。
只有确定了主从相对应的BLE_EVT_END事件后才可以在事件发生后取得时间以同步。
谢谢!
亲爱的mhv_dialog,
非常感谢您的回答。
要坦率地,我是这个领域的新手,虽然我觉得你的答案可能是一个正确的问题,但在很多学习之后,仍然不知道怎么办。
1.确认和指示是什么?BLE_EVT_END吗?或其他事件吗?
2.still我不知道如何标记连接,我认为应该有一些不同的东西来区分它。
希望你对我的问题不耐烦。
嗨本杰明,
首先,我想说的是,你们要做的事情并不简单。
但这是我如何尝试实现它的核心。首先,在中央和外设都使用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计时器只能工作,因此精细定时器仅在唤醒时有效。
我希望这对你有所帮助。让我们都知道结果如何。
/ mikael.
你好再次,
我刚刚实施了上述概念,结果很有希望。我将无附庸项目用作起点并更改了rwble.c在ble_evt_end上切换gpio。然后,我将此已修改的无附件六角文件加载到两个开发套件上,并通过命令在它们之间建立连接(请参阅无附带文档)。我使用逻辑分析仪监视两个GPIO,我看到它们被3US偏移分隔,偏差偏差+/- 500ns。在使用声音的测距应用程序中,500ns的声音行驶小于0.2mm。
有时,从奴隶会错过来自主人的传输(这是rf的“美”),因此您需要在事件之间进行一些死亡时间来过滤掉这些实例。但它们应该很容易被发现。
/ MHv
嗨mikael,
我正在测试你给我的方法,总的来说,这是一个很好的方法,可以满足我的需求。我计划有更多的测试,因为有问题,看到你有更多的信息在这里,我把我的测试结果放在这里。
我遇到的问题是,大约有1%的情况下BLE_EVT_END不是同步发生的,无论是从主端还是从药膏端,在最严重的情况下,异步是0.5ms,而其他99%的情况下,同步非常好。
对于我的应用,实际上,0.5ms的异步是可接受的,如果我想要,我可以找到仿咽部。
我正在进行更多的测试,以了解它是否是真实的异步,否则它是由于其他原因。
你提到的“奴隶会错过主人的传输”你的意思是ble_evt_end不会成对发生?我担心了这一点,但是acc。到我的测试,这从未发生过。如果这可以理论上可能发生或在您发现的时候实际发生,我可以设法避免它的效果。
再次感谢mikael。
嗨本杰明,
很高兴听到你已经看到成果了。在RF的世界中,您偶尔会遇到被其他流量阻塞的通道,这将导致“丢失”连接事件。从机可能会错过来自主机的TX,并将尝试保持它的接收器打开一段时间。slave直到超时才认为事件结束,从slave的角度来看,这会导致稍后触发BLE_EVT_END。事件仍然会发生-但你实际上与主服务器不同步。这很可能就是你所观察到的。0.5毫秒听起来差不多。
/ MHv
嗨MHv_Dialog,
非常感谢你的快速回复。
仍然对于“从机将错过从机的传输”,它听起来有时可能错过的内容,而事件(BLE_EVT_END
)永远不会错过(偶尔可能会有一些延迟),换句话说,BLE_EVT_END始终成对在主机和从站。
这是非常重要的,如果我想事件成对发生,而有时在单侧丢失事件(主机或从属),则可能存在大问题。
我需要确认一下。
如果在理论上,不会有任何遗漏的事件或双方的遗漏,我就放心了。
或者理论上,在单侧将有可能丢失事件,我需要在我的功能中考虑这一点。
谢谢。
我可以确认两侧总会有相同数量的事件。从中央奴隶可能不会“听到”,但事件仍然会结束 - 尽管时机会错过一半的东西。换句话说,将有一些异常值与时序一样,但主侧的事件计数将始终匹配从设备的。在您的情况下,其中1ms精度足够好,您真的不必过滤掉。
/ MHv
嗨mhv_dialog,
我将使用uint32_t lld_evt_time_get(void)获取当前时间,因为您推荐,我发现我能够重置这个计时器将非常方便,有没有任何功能可供我这样做?
谢谢。
嗨本杰明,
不幸的是,没有这样的功能。
/ MHv
嗨MHv_Dialog团队,
在使用上述方法的同时,我遇到了一个新问题。
我使用“app_connect_confirm”而不是“app_on_connection”(我的sdk是3.x,我在sdk5.x中没有示例,虽然我想使用它)来重置全局计数器。
在“Arch_rwble_last_Event = BLE_EVT_END”之后,当您建议时,我将全局计数器递增,直到找到新问题,这会很好。
问题如下:
有一段时间后,从奴隶和掌握后,短到几分钟,更长的是20分钟,在奴隶侧,在呼叫“app_disconnect_func”的时候,从机无法从主站接到信息,但“arch_rwble_last_event =”app_rwble_last_event =BLE_EVT_END“可以在两侧令人作呕,从站仍然处于先前的速度,但在主侧,速度是从速度的15倍。
我的分析如下:
Connect坏了,因为从机无法接收来自主机的信息,但为什么在两侧,设备都可以执行“Arch_rwble_last_event = ble_evt_end”?
你能帮我解决以下问题吗?
在从端调用"app_disconnect_func"的可能原因是什么?我认为这两个设备应该没有糟糕的连接环境。
因为它显然,时间同步是不可能的,希望您能帮助我解决问题。
谢谢
嗨BenjaminDu,
是的,如果设备通过app_disconnect_func,那么连接断开了,BLE_EVT_END是一个状态,当设备在发布广告时,当设备连接时,它表示BLE活动的结束周期。所以你的设备失去了连接,它继续广告,所以你将从广告事件获得BLE_END_EVT。关于的断开,断开的发生有许多原因,可以初始化从中央或断开外围本身,可能松散连接的设备如果外围出于某种原因没有找到主人指定的连接上的间隔,或者由于某种原因,当连接间隔时间到达时,从服务器的主服务器发送或接收延迟。首先可以在app_disconnect_func()中检查设备断开时的原因,以确定580报告的断开原因。
谢谢mt_dialog.
嗨mt_dialog团队,
正如前面讨论的,
BLE_EVT_END总是成对发生在主机和从端
在事件发生后,与计数器一起,时间可以循环。
但是如果其中一个设备繁忙(例如:如果长时间或频繁定时器中断),计数器在两边的显示是不同的。
1.如果BLE_EVT_END总是在主机和从端成对发生,这怎么可能发生
2.任何其他方式保持时间同步吗?
非常感谢
便雅悯
嗨BenjaminDu,
谢谢mt_dialog.