生产过程中在OTP NVDS内存中刻录设备名

14个职位/ 0个新
最后发表
Wouter Vos
离线
最后看到:4年6个月前
加入:2016-02-18 15分
生产过程中在OTP NVDS内存中刻录设备名

亲爱的读者,
我已经根据外设示例代码为自己的BLE外设创建了自己的供应商定义的BLE配置文件。到目前为止,我已经成功地在一个从OTP内存运行的独立版本中运行固件。但是,现在我必须在每个设备的固件中更改设备名称,并在生产过程中重新构建固件。我想在生产期间在OTP NVDS内存(NVDS_TAG_DEVICE_NAME)中刻录设备名称。然而,我一直没有成功地这样做;目前还不清楚如何正确地做到这一点,以及需要设置哪些值。你能帮我一下吗?

到目前为止,我得到了以下信息:
I undefined: CFG_INITIALIZE_NVDS_STRUCT;CFG_DEVELOPMENT_DEBUG
我定义了:CFG_BOOT_FROM_OTP
当我使用SmartSnippets使用正确的OTP头将二进制文件刻录到OTP时,从0x40340开始的OTP NVDS内存块仍然为空。当我用从另一个设备的OTP NVDS内存创建的NVDS模板十六进制文件填充此区域时,该设备运行的固件中仍然定义了CFG_INITIALIZE_NVDS_STRUCT的代码(而使用NVDS .c中的NVDS结构),那么设备将不会开始发布。

问候,
Wouter

设备:
Wouter Vos
离线
最后看到:4年6个月前
加入:2016-02-18 15分
亲爱的Dialog员工:

亲爱的Dialog员工:
你能回答一下吗?
问候,
Wouter

MT_dialog
离线
最后看到:两个月前两个星期前
工作人员
加入:2015-06-08 34
你好,沃特·沃斯,

你好,沃特·沃斯,

抱歉回复晚了,同事正在调查,我们会尽快通知你。

由于MT_dialog

LC_Dialog
离线
最后看到:2周4天前
工作人员
加入:2016-09-19 23:20
你好Wouter,

你好Wouter,

我为耽搁道歉。请看我们对你的问题的分析。

你不能在OTP中保留一部分NVDS,而在你的代码中保留另一部分。当您在OTP中刻录代码时,没有CFG_INITILIALIZE_NVDS_STRUCT定义了你留下的全部。

OTP镜像中的NVDS区域为空,供您使用NVDS OTP工具刻录。稍后,您将不得不使用OTP NVDS选项卡来填充该区域(内存偏移量为0 x340直到0 x440).所以你
你必须要么在你的代码中用NVDS数据来刻录图像,要么随后用OTP NVDS工具刻录。

您提到的#定义是定义/取消定义的正确定义,以便在刻写过程中从OTP启动。确保OTP头中的应用程序标志都被刻录为yes,以便引导加载程序使OTP镜像发生(您可以通过检查引导加载程序是否正在执行,只需打开UART端口并检查RX TX引脚是否被切换)。

请让我们知道这是否帮助您解决了问题,或者如果您还有其他问题。

问候,
LC_Dialog

Wouter Vos
离线
最后看到:4年6个月前
加入:2016-02-18 15分
亲爱的对话框,

亲爱的对话框,
谢谢你的回答。我知道你在答复中指出的项目。不幸的是,它帮不了我。与CFG_INITILIALIZE_NVDS_STRUCT定义设备按预期运行,并从OTP正确启动。然而,当我把这个设备称为A,我烧掉了另一个叫做B的设备CFG_INITILIALIZE_NVDS_STRUCT未定义的并使用OTP NVDS工具将设备A的NVDS内存复制到设备B的空NVDS内存中,设备B不会开始发布。设备B的程序计数器似乎在内存位置0x805B4附近运行,而设备A的程序计数器在0x20000000以上的某处。
起初我认为广告数据可能不正确,因为USER_ADVERTISE_DATA定义为空字符串user_config.h.但在筛选代码后,我注意到它附加了NVDS_TAG_DEVICE_NAME在函数中app_easy_gap_undirected_advertise_start_create_msgapp.c)如果USER_CONFIG定义为user_config.h-这是在我的代码中的情况。
现在我开始怀疑是否有可能继续CFG_INITILIALIZE_NVDS_STRUCT定义,但离开USER_DEVICE_NAME空的user_config.h然后烧掉NVDS_TAG_DEVICE_NAME以及它在OTP内存中的手动长度(因为它是一个或内存,0可以被更改为1,但不能反过来)。

我还有几个与上述问题没有直接关系的问题:
我们有设备运行作为SPI奴隶和发送数据从一个主机MCU。基于中断的通信已经实现并发挥了作用。然而,目前我们必须将SPI主SPI时钟设置在1mhz以下,并在字节之间添加延迟以确保正确的传输。
A) SPI模块的时钟速度是多少?时钟分频寄存器似乎被设置为零,但我不知道这代表什么时钟速度。
B)在结构中nvds_data_storagenvds.c睡眠(NVDS_TAG_SLEEP_ENABLE),并且外部唤醒(NVDS_TAG_EXT_WAKEUP_ENABLE他们是固定的。那么影响是什么呢CFG_EXTERNAL_WAKEUP而且CFG_MEM_MAP_DEEP_SLEEP设备的睡眠和唤醒行为?我希望设备在SPI通信发生时被唤醒。目前我有睡眠定义未定义。这是否意味着设备不会进入睡眠状态?

问候,
Wouter

Wouter Vos
离线
最后看到:4年6个月前
加入:2016-02-18 15分
你能回答一下吗?

你能回答一下吗?
问候

LC_Dialog
离线
最后看到:2周4天前
工作人员
加入:2016-09-19 23:20
你好,沃特·沃斯,

你好,沃特·沃斯,

我正在研究你的问题,以得到一个解决方案。我会尽快回复你解决方案。

谢谢你!感谢你的耐心。

问候,

信用证

LC_Dialog
离线
最后看到:2周4天前
工作人员
加入:2016-09-19 23:20
你好,沃特·沃斯,

你好,沃特·沃斯,

首先,您可以使用设备A的NVDS数据并将其写入设备B,假设设备B配置了NVDS工具可编程(undefCFG_INITIALIZE_NVDS_STRUCT).并且,您将能够写入NVDS使用工具时CFG_INITIALIZE_NVDS_STRUCT定义,填充可用的0。这一点,我们没有尝试过,也不建议这样做,因为你可能会在NVDS内存中随机定义数据。

A)主模式默认时钟速度设置为2MHz。为了修改时钟速度,您需要更改CLK_PER_REG中的SPI_DIV(它控制外围时钟)和spi_init()函数中的SPI_XTAL_Freq_t(这控制SPI块时钟的频率)的值。

B)根据选择的类型,管理各自的内存on /OFF。如果睡眠定义未定义,设备将始终处于活动模式。为了使用SPI唤醒,您可以设置external_wakeup模式,并且您可以在收到外部中断时唤醒系统。

希望这能回答你的问题…

问候,

信用证

Wouter Vos
离线
最后看到:4年6个月前
加入:2016-02-18 15分
亲爱的信用证,

亲爱的信用证,
谢谢你的回答。我让它按我想的那样工作了。(不幸的是,我在从NVDS内存读取名称标签的代码中犯了一个错误。)

关于一个)
从代码中不清楚SPI_DIV的值是什么意思(没有可用的数据表)。你能告诉我吗?

关于B)
如果我理解正确的话。NVDS_TAG_SLEEP_ENABLE和NVDS_TAG_EXT_WAKEUP_ENABLE必须在NVDS内存中启用,CFG_MEM_MAP_EXT_SLEEP和CFG_EXTERNAL_WAKEUP都必须定义,并且唤醒引脚必须定义在user_peripheral_setup.h
中定义了CFG_APP,外部唤醒会工作吗da1458x_config_basic.h?因为CFG_APP定义了BLE_APP_PRESENT,因此external_wakeup_enable ()会不会被处决arch_main.c

LC_Dialog
离线
最后看到:2周4天前
工作人员
加入:2016-09-19 23:20
你好Wouter,

你好Wouter,

听说你能把它修好,我很高兴。

A) SPI_DIV是CLK_PER_REG寄存器的一部分(位8,9),它控制到系统内不同外设的时钟。这将用XTAL时钟除以您提供给它的值。你可以提供4个不同的值将时钟除以1/ 2/ 4/ 8次。这在14580的数据表(我的情况是第29页)中被引用,您可以在支持网站上下载。

B)关于这一点,我想知道,

您是否在14580 M0上使用任何外部处理器系统或主机应用程序?既然你提到了从SPI通信中唤醒,那么它连接到什么?你能详细说明这个用例吗?

问候,

信用证

Wouter Vos
离线
最后看到:4年6个月前
加入:2016-02-18 15分
你好,信用证,

你好,信用证,
B) DA14580充当收发器,在通过SPI连接的本地MCU和远程蓝牙支持平台之间交换数据包。因此DA14580一直处于空转状态,直到本地MCU或远程平台需要发送数据。

问候,
Wouter

LC_Dialog
离线
最后看到:2周4天前
工作人员
加入:2016-09-19 23:20
你好Wouter,

你好Wouter,

如果我理解正确,您正在使用外部MCU配置?应用程序在MCU上,你是通过GTL接口连接到外部MCU吗?

我还建议你们看一下ble_app_all_in_oneble_app_sleepmodeSDK中提供的项目,因为他们展示了使用外部唤醒的睡眠模式唤醒,这将给你一个选项,从OTP可选运行,否则必须启用deep_sleep_mode

而且,我不建议你在arch_main文件。一般来说,您应该能够启用deep_sleep_mode通过在user_config.h文件,并通过设置所需的标志运行应用程序的OTP内存。这个简单的设置应该使您能够使用deep_sleep_mode

问候,

信用证

Wouter Vos
离线
最后看到:4年6个月前
加入:2016-02-18 15分
你好,信用证,

你好,信用证,
我想我创造了一个混合版本;在蓝牙模块上,一个独立的应用程序正在运行,它管理连接和SPI接口。SPI接口仅用于发送和接收分别已接收或需要通过空中发送的数据。这意味着CF_APP定义在da1458x_config_basic.h因此是BLE_APP_PRESENT。
我不清楚什么需要定义和未定义。

问候,
Wouter

LC_Dialog
离线
最后看到:2周4天前
工作人员
加入:2016-09-19 23:20
你好Wouter,

你好Wouter,

如果我没理解错的话,你只有一个处理器系统。因此,在单处理器系统中,您不必担心CFG_EXTERNAL_WAKEUP、NVDS_TAG_EXT_WAKEUP_ENABLE和ext_wakeup_enable()。这些仅用于外部处理器配置。

在你的单处理器配置中,你必须在config.h中启用睡眠模式类型(deep_sleep或extended_sleep)。为按钮按下的外部输入启用相应的gpio,并在检测到按钮按下时设置回调函数。请参考项目ble_app_sleepmode和用户手册文档UM-B-006。该项目设置了一些回调函数,以检测按钮按下以及按下按钮时必须做什么。如果您在这方面还有其他问题,请让我知道。

问候,

信用证