你好,
为什么写开发名称和读取ori dev name使用相同的索引?
dis_idx_ieee_char,
dis_idx_ieee_val,
dis_idx_pnp_id_char,
dis_idx_pnp_id_val,
dis_idx_nb,
// PNP ID特征声明
[dis_idx_pnp_id_char] = {att_decl_characterativom,perm(rd,启用),sizeof(dist_pnp_id_char),
sizeof(dist_pnp_id_char),(uint8_t *)和diss_pnp_id_char},
// PNP ID特征值
[dis_idx_pnp_id_val] = {att_char_pnp_id,perm(rd,启用),dis_pnp_id_len,0,null},
//读写dev name特征声明
[dis_idx_pnp_id_char] = {att_decl_characterativom,perm(rd,启用),sizeof(dist_pnp_id_char),
sizeof(dist_pnp_id_char),(uint8_t *)和diss_pnp_id_char},
//读写dev name特征值
[dis_idx_pnp_id_val] = {att_char_pnp_id,perm(rd,启用),dis_pnp_id_len,0,null},
//读取ori dev name特征声明
[dis_idx_pnp_id_char] = {att_decl_characterativom,perm(rd,启用),sizeof(dist_pnp_id_char),
sizeof(dist_pnp_id_char),(uint8_t *)和diss_pnp_id_char},
//读取ori dev name特征值
[dis_idx_pnp_id_val] = {att_char_pnp_id,perm(rd,启用),dis_pnp_id_len,0,null},
- 另一个问题:我可以在普通中添加128位特征吗?
为什么?智能手机应用程序需要从128bit uuid中读取写开发名称。
我可以在原始代码上更改基础,还是我必须重写spotar_create_db_req_handler()等代码?
谢谢!
嗨Antony42,
我想你想从智能手机改变设备的名字是正确的吗?您必须将Permmisions更改为适当的特征,并将写命令处理到DA对于特定IDX,使用Sample128作为引用(Gattc_Write_cmd_ind_handler)。我想你可以,但你要改变一个由sig定义的配置文件。
谢谢mt_dialog.
嗨,mt_dialog,
绝对正确 !
我需要将这些信息保存到Flash。
你能给我一些建议吗?
非常感谢 !
嗨Antony42,
我建议您不要更改普通的配置文件(您可能对其他设备有兼容性问题),而是可以将其与您的服务一起包含并创建新的自定义配置文件(Sample128教程),其中包含您需要的额外信息。正如我之前提到的那样,幻灯片是从蓝牙SIG定义的服务。您可以使用信标项目来处理您的邮件的广告。
谢谢mt_dialog.
嗨mt_dialog,
我尝试了,但在初始化数据时,我无法获得正确的句柄索引。
另一个问题:
为什么产品标题以下结构中的不同与AN-B-010 Page10不同?
来自Beacon Ref项目:
#define product_header_position 0x1f000.
// Suota的产品标题
struct product_header.
{
UINT8_T签名[2];
UINT8_T版[2];
UINT32_T保留[4];
uint32_t config_offset;
};
struct product_header p_header;
spi_flash_read_data((uint8_t *)&p_header,(unsigned long)product_header_position,(unsigned long)sizeof(struct product_header));
app_config_header_offset = p_header.config_offset;
我打印数据,看起来像:
0x70 0x52 0x0 0x1 0x0 0x80 0x0 0x0 0x0 0x30 0x1 0x0 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
与AN-B-010相同(签名7052,版本0100,偏移1,偏移2)
但是p_header.config_offset =?
struct config_header也与AN-B-010不同
谢谢!
嗨Antony42.
你是什么意思是不同的,你无法看到偏移量下的其他字段#2字段?这是因为其他字段没有从信标应用程序中使用。您无法读取CONFIG_OFFSET,因为您必须在SPI中加载标题才能读取它,您可以使用SMART SCIPPETS专有头程序员来设置CONFIG_OFFSET和BEACON配置。
谢谢mt_dialog。
嗨mt_dialog,
在UM-B-019(信标参考)中9.7.1内存映射:
配置存储使用双映像引导加载程序的存储映射。更具体地说,它使用
如上所述,产品标题中的“保留”字段(Byte Offset 12)的前四个字节
[6]的第6.1节,用于定义配置区域的内存地址。地址必须点
SPI Flash扇区的开始,并且没有其他信息必须存储在同一扇区中。
[6]的第6.1节在哪里
UM表示使用“保留”字段的前四个字节来存储配置地址,
struct product_header.
{
UINT8_T签名[2];
UINT8_T版[2];
UINT32_T保留[4];
uint32_t config_offset;
};
现在我的标题文件(.txt文件)是:
2签名产品标题签名。必须包含0x7052
2版本产品标题版本
4 LE格式的图像标题#1的offset1内存偏移
4 offset2在Le格式中图像标题#2的内存偏移量
用专有标题编程器打开,并设置右侧值7052,0001,00800000,00300100。
谢谢!
嗨Antony42,
产品标题应为辅助引导程序标题的形式。您可以使用12byte offset(bdaddress)或放置一些填充,并使用17byte(保留)偏移量以放置配置标题格式的地址。product_header.config_offset将包含驻留的偏移量,它位于配置标题的地址。您应该在product_header.txt中添加额外的字段,以便放置配置头文件的地址。配置偏移将指向配置标题。配置数据位于字节偏移64中的配置标题下方。
谢谢mt_dialog.
嗨mt_dialog,
我不完全明白。
//产品标题结构
typedef struct __productheader {
UINT8签名[2];
UINT8版本[2];
UINT32_T OFFSET1;
uint32_t offset2;
S_ProductHeader;
// Suota的产品标题
struct product_header.
{
UINT8_T签名[2];
UINT8_T版[2];
UINT32_T保留[4];
uint32_t config_offset;//为什么这与上面不同?
};
似乎是一个完整的版本。
在此文件12-31保留
32-37 BD地址......
谢谢!
嗨Antony42.
以上2个结构是不同的,因为在信标中,我们没有指定图像偏移,我们只添加一些
填充UINT32_T保留[4]。
1-uint32_t用于图像offset1,2-uint32_t的图像offset2,3-4 uint32_t为dbaddress和一些额外的
保留数据。
在信标应用程序中,如果配置已启用,则必须在产品中添加额外的字段
例如,标题.... configOffset。然后在您制作产品_header.txt之后,您可以从智能播放
片段工具并将值添加到相应的字段。app_read_config_header会找到
Product_Header并读取配置标题的Config_offset ......从App_Read_Config
数据将使用配置数据填充相应的结构。您可以使产品标题
对应于如此:
创建一个product_header.txt文件并添加以下字段
2字符串签名产品标题签名(7052)
2字符串版本产品标题版本
16整数保留保留填充
4 Integer ConfigOffset配置
是的,我想你可以使用硬编码地址并从那里读取配置数据。
谢谢mt_dialog.
嗨mt_dialog,
我在app_connection_func中调用LED_ON(),设置PIN低,
但是LED只有闪烁一次,我找不到IO输出设置得高?
app_adv_stop();
Switch(app_advertise_mode)
{
案例GAPM_ADV_NON_CONN:
app_advertise_mode = gapm_adv_undirect;
休息;
案例GAPM_ADV_UNDIRECT:
app_advertise_mode = gapm_adv_non_conn;
休息;
}
这将改变广告模式,但它不会调用app_adv_start(),因此当广告模式将改变?
你能解释一下关于app_asynch_trm()的更多信息吗?
此Func还有代码:
Switch(app_advertise_mode)
{
案例GAPM_ADV_NON_CONN:
app_advertise_mode = gapm_adv_undirect;
休息;
案例GAPM_ADV_UNDIRECT:
app_advertise_mode = gapm_adv_non_conn;
休息;
}
我需要添加到按钮来更改广告模式。
定时器立即触发,然后我设置了一个标志,
在下文中,工作正常,为什么?
app_adv_undirect_complete.
{
if(标志){
set_timer();
标志= false;
}
在计时器处理程序中,我清除了另一个计时器,不行,
设置上面的另一个标志,我成功清除了计时器,为什么?
谢谢,
安东尼
嗨Antony,
您可以定义您的设备将在DA14580_Config中的可连接工作中工作.H检查您正在使用的Dev套件并定义cfg_connectable_adv_mode.在那里。如果定义了CFG_CONECTABLE_ADV_MODE,则无需按钮更改为可连接模式,设备将在可连接和不可连接的模式之间旋转。如果未定义,则必须使用按钮以更改ADV模式(有一个定义)。我想你正在使用睡眠,当你的设备唤醒引脚返回句子的句子periph_init()函数命令....如果要保持按钮点亮,则必须放置一个将记住以前状态的变量每当您的da醒来时,LED并设置对应的值。在app_asynch_trm中,如果您定义了CFG_CONNECTABLE_ADV_MODE作为我在非可连接模式之间提到的设备周期。由于App_adv_stop()发出的app_adk.c案Gapm_adv_undirect,该设备再次启动广告案例Gapm_adv_non_conn。如果您尝试从外部中断设置计时器,请在App_button_press_cb()函数中建议SmartTag参考设计,并检查此外常见问题解答http://support.dialog-semicondiondiondum/faq-page#n1508.。
谢谢mt_dialog.
嗨mt_dialog.
调用app_timer_set(app_restart_adv_timer,task_app,timer_ticks)重新启动adv,
这是定期宣传的方法吗?
我在这个func中设置了一个断点,似乎这个函数未调用,但app_adv_stop()将要做。
从App_adv_stop()发出,
现在我需要在数组中存储10个不同的adv数据,并宣传阵列[0],然后阵列[1] ...
每个都是32字节。
我认为将代码添加到app_adv_undirect_complete()是一个不错的选择,
我可以单独设置adv间隔,并在app_restart_adv_timer处理程序中更改adv数据。
所以如何在每次广告后调用app_adv_undirect_complete()?
这是可能还是其他更好的解决方案?
谢谢,
安东尼
嗨Antony,
app_adv_undirect()在Adv_Stop()完成后执行并将计时器设置为Timer以便再次启动广告,请在IF语句上设置您的断点。是的,您可以在广告停止时更改广告数据。每次停止广告时都会调用app_adv_undirect_complete。
谢谢mt_dialog.
嗨mt_dialog.
在app_restart_adv_timer_handler中:
app_adv_start();
app_adv_stop();//我可以在这里添加它来调用app_adv_undirect_complete吗?
return(ke_msg_consumed);
我应该何时调用app_adv_stop()?
谢谢,
安东尼
嗨Antony42,
当DA靴子您可以启动并启动计时器时,当定时器过去时,您可以调用app_adv_stop(),当广告停止时,app_adv_undirect_complete将执行(此函数在调用app_adv_stop之后执行opp_adv_stop是未连接的广告或不可连接之后)然后你可以调用app_adv_start();如果您喜欢填充广告字符串的位置,您可以在App_adv_Func()中更改广告字符串。
谢谢mt_dialog.
嗨mt_dialog,
谢谢你的回复,我会尝试一下。
当我打电话给app_adv_start()时,广告开始,而不是一次,它是连续的,
谢谢,
安东尼
嗨Antony,
广告程序是持续的,意思是,如果您不发送取消命令,广告将继续。如果要在3广告字符串之间旋转,您可以在广告功能中制作开关盒检查当前的通告模式并切换到下一个模式(每个模式加载不同的广告字符串)。当设置广告字符串时,将设置指定设备在特定模式中宣传的长度的计时器。当计时器经过时,更改广告模式,调用app_adv_stop.并在获得广告已停止的指示时重新启动广告。
谢谢mt_dialog.
嗨mt_dialog,
非常感谢你!
它现在正在运作。
在app_adv_undirect_complete()
{
app_set_timer(x,y);
app_adv_start();
}
在Timer Handler()
{
app_adv_stop();
}
我将定时器与副房(100ms)设置相同的值,
从嗅探器中,我可以看到每个adv数据只广告一次!
谢谢,
安东尼
嗨mt_dialog,
谢谢你的回复。
现在它可以正常工作,我在button_press_callback()中设置标志,并在app_adv_undirect_complete()中设置/清除计时器。
我也发现了两个旧但有用的主题:
http://support.dialog-semicondiondiondum/ketcerset-not-execute why.
http://support.dialog-semicondiondiond.com/problem-about-wakeup-timer-inter ...
顺便说一下,如果我使用ext睡眠,则无需使用__attribute __((部分(“保留_mem_area0”),zero_init)
这样对吗?
谢谢,
安东尼
你好,
那是正确的。在延长睡眠中,保留包含全局变量的RAM中的所有数据。