faq-da1458x-software-peripherals

为了提高产品和抵押品的便捷性,我们更新了我们的雷电竞官网登录对话框的网站SmartBondBluetooth®低能量产品页面。自2019年4月15日起,Dialog Se雷竞技电竞平台miconductor网站将成为整个SmartBond投资组合资源的单一接入点。对话台连接/蓝牙低能量支持站点仅用作用论坛门户网站.如果您有任何疑问或技术咨询,请在我们的专家团队的论坛上发布您的问题,将回答您的问题或填写此表格。您还可以找到联系信息本地团队在这里
我怎样才能在580上启用睡眠功能?

580的低能量位于连接或广告间隔之间。当模块无事可做时,例如在不久的将来有一个BLE事件,如果用户打开了睡眠功能,它将自动切换到睡眠模式。为了让用户打开睡眠功能,他必须:

  • 在user_config.h中的SDK5中,在Arch_ext_sleep_on中设置App_default_sleep_mode变量,用于扩展睡眠或arch_deep_sleep_on以进行深度睡眠。
  • 在SDK3的da14580_config文件中#定义CFG_EXT_SLEEP或CFG_DEEP_SLEEP定义。

在设置了上述定义或变量之后,模块将在每个BLE事件(连接事件或广告事件)之后进入睡眠模式。

用户可以改变默认睡眠模式,即在运行时切换每个睡眠模式(关闭,扩展,深度模式),通过使用函数:

  • Arch_disable_sleep:关闭休眠模式。
  • Arch_set_extended_sleep:启用扩展睡眠模式。
  • ARCH_SET_DEEP_SLEEP:启用深度睡眠功能。

重要提示:当睡眠模式被启用时,你将无法使用keil来调试代码,当调试睡眠功能时,应该始终关闭。在睡眠和调试580将保持空闲,直到调试器被分离,或者你将收到一个错误在keil提到“JLink error: Can not read register xx (xxx) while CPU is running”

有可能用外部处理器控制DA14580吗? DA14580可用作单个处理器解决方案或外部处理器。在外部处理器解决方案中,在DA14580上运行蓝牙低能量堆栈和配置文件。自定义应用程序层部署在外部处理器上。DA14580上的外部应用程序和配置文件/堆栈之间的通信是通过对话框提供的外部处理器接口。外部处理器接口可以物理映射在UART或SPI上。
对话框是否提供蓝牙低能耗配置? 对话框为客户开发了一组SIG合格的配置文件。配置文件作为SDK的一部分以源代码格式交付。用户同意对话框软件许可证后,这些配置文件可以自由地用作用户应用程序的一部分。雷竞技安卓下载
当DA14580失去连接时会发生什么情况,例如由于监督超时。

当DA14580失去连接时会发生什么情况,例如由于监督超时?如何将其配置为立即重新发布广告…

如果由于监控超时等原因导致连接丢失,GAP层将向应用程序任务发送GAPC_DISCONNECT_IND消息。在GAPC_DISCONNECT_IND处理程序中,开发人员可以设置他们的应用程序重新开始广告。

如果开发人员希望重新启动堆栈,则可以通过应用程序任务将GAPM_RESET_CMD发送到GAP层

DA14580是否支持应用级数据AES-128加密?

DA14580支持AES-128加密和解密,一旦在配对/绑定过程中启用加密,就可以保护BLE链路。这是由Dialog堆栈处理的,开发人员不需要实现任何专有的加密/解密算法。

如果开发人员想通过加密应用程序数据来增加额外的安全性,也可以使用DA14580集成的AES-128硬件块。GAP API GAPM_USE_ENC_BLOCK_CMD可以访问AES-128硬件块,用于加密应用数据。该API的Oprant 2是明文,Oprant 1是用于加密的密钥。加密完成后,应用软件将收到来自堆栈的GAPM_USE_ENC_BLOCK_IND消息和加密后的数据。加密后的数据可以通过各种开源工具破译,例如:http://seit.unsw.adfa.edu.au/staff/sites/lpb/src/AEScalc/

在应用层,DA14580不支持使用AES-128硬件块进行解码。

如何使用UART进行调试?

1)必须在da14580_config.h中定义

#定义CFG_PRINTF
#定义CFG_DISABLE_RTS_CTS

2)从DA14580_SDK_3.0.2.1\DA14580_SDK_3.0.2.1\dk_apps\src\modules\app\src\app_utils \app_console中添加app_console.c文件夹

3)从Options for target -> C/ c++ tab ->中包含app_console文件夹的路径。

4)在Periph_init中,添加:

SetBits16 (CLK_PER_REG UART1_ENABLE 1);//为UART 1启用时钟
SetWord16 (UART_LCR_REG 0 x80);//设置访问DLH和DLL寄存器的位
//除数= 1000000 / 115200 = 9
SetWord16 (UART_IER_DLH_REG (9 &0xff > > 8)); / /设置高字节
SetWord16 (UART_RBR_THR_DLL_REG 9 &0xff); / /设置低字节
SetWord16 (UART_LCR_REG 3);//没有奇偶校验,1停止位8数据长度和清除位8
SetBits16 (UART_MCR_REG UART_SIRE 0);//正常模式为0,IRDA模式为1
SetWord16 (UART_IIR_FCR_REG, 1);/ /启用先进先出
SetBits16 (UART_IER_DLH_REG ERBFI_dlh0 0);//访问IER,禁用中断可用的数据

5)在GPIO_reservations函数中,添加:

Reserve_gpio (uart1_tx, gpio_port_0, gpio_pin_4, pid_uart1_tx);
Reserve_gpio (uart1_rx, gpio_port_0, gpio_pin_5, pid_uart1_rx);

6)在set_pad_function中添加:

gpio_configurepin(gpio_port_0,gpio_pin_4,输出,pid_uart1_tx,false);
GPIO_ConfigurePin(GPIO_PORT_0, GPIO_PIN_5, INPUT, PID_UART1_RX, false);

7)在必须使用printf命令的文件中添加:#include "app_console.h"

要打印1个字节:
char ch = 0xFF;
arch_puts (ch);
要打印1个字符串:
arch_printf(“测试”)
arch_printf(“actual_triming_value = % Lx”actual_triming_value);
arch_printf(" reason= %Lx",param ->reason);

如何在扩展睡眠模式下创建计时器(SDK 3)

1)内核定时器的新处理器

必须为超时事件定义消息,必须在app_api.h文件中的enum APP_MSG中声明。在本例中,我们将使用:APP_ADV_BEACON_INACTIVE_MODE。

BLE定时器的消息处理函数必须添加到app_task_handlers.h文件中:

2)必须调用先前声明的处理程序名称的app_timer_set。

调用app_timer_set函数来启动app_dialog_beacon_proj.c文件中的计时器:

注意:timeout: 30 000 => 5分钟:这是定时器能达到的最高超时。

在唤醒时如何在唤醒期间使用ke_timer?

ke_timer的思想是利用ble定时器,将ble定时器中断转换为ke_message并发送到相应的任务消息队列。
KE_TIMER机制需要主循环计划,主循环计划需要BLE处于活动状态。
在某些应用程序设计中,系统会进入永久休眠,等待外部唤醒,从而使BLE断电。
CPU唤醒后,CPU将通过wake_ble_up()唤醒BLE。这个函数将写入某个寄存器来发出ble唤醒请求。
BLE将在几次中断后最终激活,一旦在此阶段设置BLE定时器,系统将得到异常的定时器行为。
一些客户偶然遇到ke_timer从睡眠中醒来后不能正常工作,或者一些客户声称ke_timer只有在不启用睡眠的情况下才能正常工作。
现象是一个特定的计时器(10s)会在随机的时间戳中发生,有时在3s, 6s,8,甚至100毫秒之后,或者没有被执行。
我们认为Dialog SDK/Reference设计需要遵循一条规则,以确保ble_timer得到正确的编程,并在唤醒后正确执行timer消息处理程序。

在HID参考中,我们有以下描述,以确保ble定时器从IDLE_ST开始后工作良好。
****************************************************************************************
用来触发adv定时器的假TASK_APP消息的处理程序
在从IDLE_ST开始发布的情况下,一个假消息被发送到TASK_APP。
当BLE被唤醒时,这个msg被放入队列中。当调用处理程序时,
可以肯定BLE正在运行,定时器可能会启动。


@return KE_MSG_CONSUMED
****************************************************************************************
*/
Int app_start_adv_msg_handler(ke_msg_id_t const msgstr "

在SDK 3.0.6中,我们有类似的唤醒msg,
/ /唤醒祝福

#if(ext_sleep_enabled)
app_set_extended_sleep();
# elif (DEEP_SLEEP_ENABLED)
app_set_deep_sleep ();
其他#
app_disable_sleep();
# endif
SetBits32 (GP_CONTROL_REG BLE_WAKEUP_REQ 1);
app_ble_ext_wakeup_off ();ke_msg_send_basic (APP_WAKEUP_MSG TASK_APP, NULL);

ke_timer应该只在APP_WAKEUP_MSG句柄执行之后启动。

我们通常会遇到这种情况,因为这种情况很容易发生,低于WakeUp回电的代码将触发此案例:
start_adv_undirected();//邮件句柄将仅在CPU运行到主循环之后执行
app_timer_set (APP_HID_ADV_TIMER TASK_APP ADV_KEY_PRESS_TO);//也就是说,app_timer_set将在msg实际执行之前运行,这将在ble激活之前实际编写ble timer。

解决方案

我们已经完成了app_setup_timer的以下扩展。它检查BLE是否处于活动状态,如果不是,它将自动生成消息并自行设置计时器。
这个解决方案还有一个限制,以确保没有重复的虚拟APP_CREATE_NEW_TIMER被发送。

uint8_t app_check_ble_active(void)
{
return ((GetBits16(CLK_RADIO_REG, BLE_ENABLE) == 1) && (GetBits32(BLE_DEEPSLCNTL_REG, DEEP_SLEEP_STAT) == 0) &&\
(rwip_prevent_sleep_get() & RW_WAKE_UP_ONGOING);
}

Int app_create_new_timer(ke_msg_id_t const msgid, const struct create_new_timer_struct *param,
Ke_task_id_t const dest_id, Ke_task_id_t const src_id
{
ke_timer_set (param - > timer_id param - > task_id, param - >延迟);
返回(KE_MSG_CONSUMED);
}

/**

****************************************************************************************
启动一个内核定时器

* @return无效
****************************************************************************************
*/
Void app_timer_set(ke_msg_id_t const timer_id, ke_task_id_t const task_id, uint16_t delay)
{
//延迟不得超过最大允许
如果延迟> KE_TIMER_DELAY_MAX)
{
延迟= KE_TIMER_DELAY_MAX;
}
//延迟不应该为零
Else if(delay == 0)
{
延迟= 1;
}
if(app_check_ble_active()))
ke_timer_set(timer_id,task_id,延迟);
其他的
{
app_ble_force_wakeup();// ket_up ble发送一条消息,等待在执行之前醒来的ble
struct create_new_timer_struct *req = KE_MSG_ALLOC(APP_CREATE_NEW_TIMER, TASK_APP, TASK_APP, create_new_timer_struct);
申请- >延迟=延迟;
req-> task_id = task_id;
req-> timer_id = timer_id;
KE_MSG_SEND(REQ);
}

RSSI值在连接和广告模式下不一致。 GAPC_CON_RSSI_IND在连接模式下返回的RSSI值是原始RSSI值的一半。
在将原始rssi应用到dBm公式之前,应用程序必须将参数>rssi值加倍。
如何在连接的同时做广告?

为了在连接到中央设备时进行广告,必须执行以下步骤:

1)在void app_connection_func(struct gapc_connection_req_ind const * param)中,您必须执行以下操作:

2)创建一个新标志:

3)在int gapc_disconnect_ind_handler()中,你必须做:

4)在app_disconnect_func(dest_id, param);你必须做的事:

5)在int gapm_cmp_evt_handler中,你必须做:

为什么我不能执行定向广告与5.0.3 SDK时,使用app_easy_gap_ directed_advertise_start() api ?

这是一个已知的问题,将在SDK5的新版本中修复。app_easy_gap_directed_ advertise_start()错误调用app_easy_gap_undirected_advertise_start_create_msg();将其替换为app_easy_gap_directed_advertise_start_create_msg(),并在消息的参数中添加intv_min和intv_max的参数,如下面的代码片段所示,然后添加您的自定义直接广告函数。

static struct gapm_start_advertise_cmd * app_easy_gap_dircated_advertise_start_create_msg(void)
{
//为GAP分配消息
if (adv_cmd == NULL)
{
struct gapm_start_advertise_cmd * cmd;
cmd = app_advertise_start_msg_create ();
adv_cmd = cmd;
如果(USER_CONFIG)
{
cmd - > op。代码= user_directed_advertise_conf.advertise_operation;
cmd - > op。addr_src = user_directed_advertise_conf.address_src;
cmd - > channel_map = user_directed_advertise_conf.channel_map;
cmd - > intv_min = 32;
cmd - > intv_max = 32;
ASSERT_WARNING (user_directed_advertise_conf。advertise_operation = = GAPM_ADV_DIRECT);
cmd - > info.direct。addr_type = user_directed_advertise_target_address_conf.addr_type;
memcpy (cmd - > info.direct.addr.addr,
user_directed_advertise_target_address_conf.addr BD_ADDR_LEN)
}
其他的
memcpy((void *)cmd,(void *)和default_dir_adv_cmd,sizeof(default_dir_adv_cmd));
}
返回(adv_cmd);
}

空白user_advertise(空白)
{
app_easy_gap_directed_advertise_start ();
}

1458x家族可以支持多个连接吗? 580和583最多支持6个连接,581最多支持8个同时连接只有作为中央操作时。作为外围设备运行时,可以支持的最大连接是只有一个
1458x家庭可以支持多个角色吗? 蓝牙4.1规范将该特定功能定义为可选功能。58x系列不能支持多个角色(同时支持中央和外围)。目前支持的是角色转换。为了实现这一点,必须在GAPM_RESET完成后发出GAPM_SET_DEV_CONFIG_CMD时,发出GAPM_SET_DEV_CONFIG_CMD并设置580的适当角色。
如何更改软件中使用的低功耗时钟?

用户可以从CFG_LP_CLK定义中更改软件中的低功耗时钟(取决于他想使用哪个振荡器),并放置相应的值。

  • LP_CLK_XTAL32 -使用外部振荡器
  • LP_CLK_RCX20 - 使用内部振荡器
  • LP_CLK_FROM_OTP -使用OTP头中定义的振荡器
如何使我的设备广告与ADV_SCAN_IND包?

adv_scan_ind PDU用于在不可连接模式下操作时发送扫描响应的外围设备,以便在580上执行此操作,您必须在不可连接模式下设置设备广告,并设置扫描响应数据。使用上述配置,堆栈将使用适当的PDU(ADV_SCAN_IND)。

在连接时,发送通知我可以从中央正确DSIConnect,我可以再次看到设备广告,但是当我超出范围时,设备断开连接它永远不会启动广告。问题是什么? 当您从设备发送通知时,您为想要发送的消息和数据分配了空间。当设备连接并发送数据时,在将数据发送到客户端设备时释放为消息和数据分配的空间。当正确断开连接时,设备将停止发送通知,因此代码将继续正常运行,断开连接处理程序将被触发,因此广告将再次开始。当超出范围时,在设备命中断开连接处理程序,它继续生成不离开设备的通知,所以它们累积到堆和580重置。一个适当的解决方案是,通过捕获GATTC请求类型(GATTC_NOTIFY或GATTC_INDICATE)的GATTC_CMP_EVT (GATTC_CMP_EVT),确保在生成一个新通知之前,前面的通知已经成功地离开了580。
我如何可以在SDK5上添加一个实现的配置文件到我的模板或示例项目?

在SDK中添加配置文件非常简单,因为已经实现了App_.c / .h文件的配置文件(例如,我们将使用电池配置文件的文件作为演示)。

  1. 在sdk_profiles项目目录中添加bass.c和bass_task.c。
  2. 通过C/ c++选项卡中的目标选项菜单添加相应的头文件。
  3. 在sdk_app项目目录下添加app_bass.c和app_bass_task.c。
  4. 在user_profiles_config.h中添加#include bass.h。
  5. 将特定的服务添加到您的广告数据中(可选的,只是为了表明您支持该特定的服务)。
  6. 在user_modules_config.h文件中,确保在可用的定义中将相应的EXCLUDE_DLG_profile设置为0。例如,对于电池服务,EXCLUDE_DLG_BASS应该设置为零。

注意:在user_modules_config.h中,用户可以排除的模块不仅是配置文件模块,还包括SDK的特性。

所有这些都是用户在项目中添加已经实现的概要文件时应该遵循的标准过程。

我如何添加一个配置文件到我的项目,当没有实现在应用程序级别(没有app_profile和app_profile_task实现)?

并不是所有的概要文件都有应用程序级的实现(大多数概要文件没有app_profile.c和app_profile_task.c),所以用户必须实现它。这些文件将包括概要级实现的所有实现和消息处理。

给出了一个简单的例子,使用已经实现的电池配置文件。

创建这两个文件的一般规则是,app_bass.c包含所有初始化函数(触发操作的void函数),app_bass_task.c包含操作结束时触发的处理程序函数,应用程序应该相应地采取行动。

例如,当设备启动时,它最终将开始为包含的服务创建数据库,所有的app_profile.c文件包括app_profile_create_db()函数,电池配置文件有app_bass_create_db()。

  • 调用app_bass_create_db()函数并发送一个BASS_CREATE_DB_REQ消息。
  • 消息由bass_task.c文件中的bass_create_db_req_handler()处理。
  • 一旦创建数据库超过该函数,就会向应用程序级别发送由batt_create_db_cfm_handler()处理的应用程序级别。

这是概要文件为了与应用程序交互而遵循的原则。

  • 应用程序通过发送消息来触发所需的操作。
  • 概要文件捕获消息并执行操作,并向应用程序发送确认/指示。
  • 应用程序接收确认/指示消息,以便知道操作已经完成,并相应地采取行动。
如何添加SUOTA配置文件到我的SDK 5.0.3应用程序?

在项目中添加SUOTA配置文件是一项非常简单的任务,可以按照以下步骤将配置文件集成到他的项目中。

  • 在sdk_profiles文件夹中,检查是否包含了spotar文件(spotar.c和spotar_task.c)。如果不包括,请右键单击并选择“添加现有文件到组”。
  • 在sdk_app文件夹中,检查是否包含了sptar应用程序文件(app_spotar.c和app_spotar_task.c),如果没有,像前面提到的一样添加它们。
  • 在项目的主文件中添加on_spotar_status_change()函数。(粘贴下面的代码片段,或者您可以在邻近报告的示例中找到相同的代码片段)。

    #如果BLE_SPOTA_RECEIVER
    /**
    ****************************************************************************************
    * @brief SPOTAR会话启动或停止事件处理程序。

    * @param[in] spar_event spar_start / spar_stop

    * @return无效
    ****************************************************************************************
    */
    Void on_spotar_status_change(const uint8_t spotar_event)
    {
    #if define (__DA14583__) && (!SPOTAR_SPI_DISABLE)
    Int8_t man_dev_id = 0;

    man_dev_id = spi_flash_enable(SPI_EN_GPIO_PORT, SPI_EN_GPIO_PIN);
    if(man_dev_id == spi_flash_auto_detect_not_detected)
    {
    //设备未被识别。使用默认参数。
    //也可以在这里断言错误。
    spi_flash_init(spi_flash_default_size,spi_flash_default_page);
    } if(spotar_event == SPOTAR_END) / /指定事件
    {
    //关闭SPI Flash
    spi_flash_power_down ();
    }
    # endif
    } #endif // (BLE_SPOTA_RECEIVER)

  • 在user_callback_config.h文件中添加user_profile_callbacks变量(对于SUOTA实现,下面的代码片段就足够了):

    Static const struct profile_callbacks user_profile_callbacks = {
    #如果(BLE_SPOTA_RECEIVER)
    .on_spotar_status_change = on_spotar_status_change,
    # endif
    };

  • SUOTA应用程序需要在广告字符串中找到特定的数据,以便在发现的设备屏幕中显示设备。SUOTA应用程序的UUID是ADV_UUID_SPOTAR_SERVICE定义(0XF5, 0xFE)。通过将这些字节放入广告字符串中,android手机就能够发现该设备。

重要提示:如果您正在使用BLE示例,请确保在user_modules_config.h文件中没有排除您将要使用的任何配置文件。通过将定义EXCLUDE_DLG_SPOTAR设置为1,app_spotar_task.c将不会被用作应用程序级实现。

如何读取并将RSSI值转换为DBM?

读取RSSI值有两种方法:

1.在作为中心操作时读取广告字符串的值。

当中央接收广告指示时,虽然作为中央和人们想要读取广告串的RSSI,但可以轻松完成。当广告字符串到达​​中央时,应用程序将通过APP_ON_ADV_REPORT_INC回调函数通知到达。该函数的参数是GAPM_ADV_REPORT_IND,其中包括广告消息的RSSI值的其他信息。使用该值并应用以下公式,可以转换为DBM RSSI(DBM)=(0.474 * LRES) - 112.4。

  • 0.474的值是RSSI步长,用dBb/LSB表示。
  • LRES是RXRSSI[7:0] register = param->rssi的十进制值。
  • -112.4 dBm将是RXRSSI[7:0]寄存器在没有信号条件时的最小读出值。

上述计算的实现可以在windows应用程序中的接近监视器gapm_adv_report_ind_handler()函数中找到。

2.当作为外设操作时,当连接时读取RSSI值。

当作为一个中心操作时,一个人想要获得RSSI值,应用程序必须向堆栈发出请求,以获得关于RSSI值的指示。因此,应用程序应该发送GAPC_GET_INFO_CMD和GAPC_GET_CON_RSSI作为命令的操作。之后,堆栈将用GAPC_CON_RSSI_IND响应,应用程序可以从那里检索rssi值。

有关命令的更多信息,请检查RW-BLE-GAP-IS.PDF

使用上面的值可以通过使用上面的公式进行dBm转换,但是从GAPC_CON_RSSI_IND返回的值必须在进行计算之前加倍。

在gapc_con_rssi_ind_handler()函数中的接近监视器窗口应用程序中可以找到上述计算的应用程序。

如何改变广告类型标志?

广告字符串总是以表示设备的一些基本功能的字节序列开始(例如0x02, 0x01, 0x06 -长度,标志标签类型,通用发现模式/ BR/EDR不支持)。该规范规定,如果这些字节被设置为零,则可以省略这些字节。在580的情况下,因为它是BLE设备,这些字节不能被省略,因为BR/EDR不支持位域。而且这些字节不能被用户更改,ROM堆栈负责将这些字节放置在广告字符串中,例如,如果想让设备Limited可发现,他所要做的就是在GAP_LIM_DISCOVERABLE中设置设备的广告模式,堆栈将负责其余的工作,并在字符串中放置适当的标志。