阻止DA14580的机制接收来自控制器的GATT读/写响应

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
6个帖子/ 0新
最后一篇
Dhrishi.
离线
最后一次露面:3年3个月前
加入:2017-02-10 09:56
阻止DA14580的机制接收来自控制器的GATT读/写响应

你好,

我们有一个外设解决方案,其中DA14580通过UART连接到我们的微控制器。DA14580查询控制器以获取来自中心的GATT读/写请求的特征值。
我们捕获read(atts_read_req_ind)和write(gattc_write_cmd_nind)事件在user_catch_rest_hndl()中
是否有一种机制可以阻止我们可以阻止,直到我们从控制器上从UART获取读取或写入请求的响应,然后从user_catch_rest_hndl()发送响应

简而言之,我们需要从user_catch_rest_hndl()中发送读/写请求并等待接收响应(UART中断),然后从user_catch_rest_hndl()发送响应数据。你能告诉我们这是怎么做的。任何指针,例子都会有所帮助。

谢谢,
hrishikesh.

设备:
mt_dialog.
离线
最后一次露面:2个月1周前
职员
加入:2015-06-08 11:34
嗨Dhrishi,

嗨Dhrishi,

我不太了解用例,你提到580附加到外部MCU(我想这就是你说控制器时的意思),控制器提供了特征的值。

  • 作为了解您所说的究竟是什么例子,让我们掌握ATTS_READ_REQ_IND这将一旦中央将读取580的特征,因此您将获得该消息,并且您希望阻止发送确认中央,直到您从外部处理器读取值?是你在说什么。
  • 关于GATTC_WRITE_CMD_IND,这将在中央写入指定的特征时触发,因此您希望在发送确认之前阻止(如果外设需要确认,因为存在不需要响应的写入,因为不需要响应)?

那么,上面的情景做出了你想做的事吗?

谢谢mt_dialog.

Dhrishi.
离线
最后一次露面:3年3个月前
加入:2017-02-10 09:56
是的。确切地。那是对的。

是的。确切地。那是对的。
我们如何做到这一点

mt_dialog.
离线
最后一次露面:2个月1周前
职员
加入:2015-06-08 11:34
嗨Dhrishi,

嗨Dhrishi,

由于在580的内部数据库中保存数据库值,因此您尝试执行的内容毫无示例,我也不确定您提到的块,因为您一旦获得指示(即中心)已阅读或写作了一个特征)SDK将仅向申请报告并取决于您将要做的事。据我所知,关于你喜欢做的,BLE规范中使用的大多数命令都是顺序的,这意味着大多数命令(包括读取请求和写入请求)在由中央发出时应由外围设备确认,这意味着中央诱饵如果没有从前一个命令的响应,则会发送其他请求(此请求/响应方案就像BLE协议实现的流控制)。因此,您可以从读取或写请求中获取指示,捕获它们在catch_rest函数中并启动您的UART事务,中央不会发出任何其他请求,直到您发送确认消息,就在您的UART交易完成之前可以在链接的另一边发送确认。还要注意,并非所有命令都遵循请求/响应方案,例如写命令(没有响应写)将触发您的指示,但中央不会等待响应,并且在处理前一个时仍然可以发出额外的命令这需要额外的流量控制方案。

因此,根据上面,当读取指示来自中心时,可以通过UART写入UART。关于发送你从UART读取的价值,就像我在不同的帖子中提到的那样,你不能只发送你通过UART直接获得的值,但你必须尽快在内部数据库中设置值读取指示,然后发送读取的确认。因此,在读取接收时触发UART事务调用ATTMDB_ATT_SET_VALUE()以便在数据库中设置值,然后在DG_ATTS_READ_CFM()中发送值。

此外,请注意,当您从UART读取时,您将不得不醒来,因此没有睡眠以获得XTAL16。

谢谢mt_dialog.

Dhrishi.
离线
最后一次露面:3年3个月前
加入:2017-02-10 09:56
我已经有了attmdb_att

我已经有Attmdb_att_set_value()和dg_atts_read_cfm()在我的实现中。问题是,当在user_catch_rest_hndl()中收到Atts_Read_Req_ind时,我将必须先向外部MCU发送请求,以获得该特征的值在数据接收时,调用上述两个功能。正确的?

现在,来自外部MCU的UART响应将来自中断上下文。因此,如何使当前执行线程在user_catch_rest_hndl()中等待,直到从外部MCU接收到适当的响应。否则它将通过调用以上两个功能来返回,其中垃圾/不正确值以及对中央的读取响应将不正确。

简而言之,我们应该等到接收到UART(从中断上下文)的响应,并且在GATT数据库中保存相同,然后发送读取确认。

mt_dialog.
离线
最后一次露面:2个月1周前
职员
加入:2015-06-08 11:34
嗨Dhrishi,

嗨Dhrishi,

是的,这是我思考的,获取指示,启动UART事务,获取数据,并通过UART获得的值发送确认。

580不是基于线程的系统,它只需一个调度程序,该调度程序将消息和执行相应的回调常常从主循环运行来执行邮件和执行相应的rundracks。因此,一旦获得读取指示,您可以尝试的是,启动UART事务或设置UART以从外部MCU接收数据(这取决于您的实现以及交互方式如何),无论是留下catch_rest处理程序(通过设置读取中断)或留在那里(执行UART Transastion,在这种情况下,只要您想要执行UART事务,您就无法开始,因为您将开始丢失的BLE事件并最终您将断开连接只要交互完成,就会执行调度函数,因为交互完成后立即通过主循环。当UART中断命中或事务已完成后,只需向客户端发送确认消息。

谢谢mt_dialog.