⚠️
大家好. .谢谢你来参加论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,并包含在Dialog主网站中。所有的帖子和账户都已迁移。我们现在只接受新论坛的流量-请张贴任何新的线程//www.wsdof.com/support.我们将在未来几天修复漏洞/优化搜索和标签。
21个岗位/ 0个新岗位
最后发表
Utkarash
离线
最后看到:1年7个月前
加入:2019-01-18 06:36
无法从Flash中读取/写入数据

你好所有的,

我使用了来自SDK 5.0.4的ble_peripheral示例作为参考,在DA14583的子板上构建我的应用程序,

我用的是基于连接的方法,

在那里我得到了一些数据(即,128字节)在基于连接的方法和相同的数据,我想写入/读取/从Flash。

当设备从中心断开连接时,我将数据写入flash,并在所有初始化后在外围初始化函数中读取数据。

我已经做了相同的必要的改变,并使单独的头文件和源文件来处理Flash读/写操作,我已附在这篇文章。

我面临的问题是,当我读/写数据到flash时,我的设备在重新充电时停止广告。

我试图调试相同的,但设备在调试它工作得很好。然而,当我在Flash读/写周期后将代码转储到Flash中,如果我重新启动设备,它将停止广告。这种情况在执行写循环时尤其会发生。

我的代码内存扩展到Flash内存中的地址0x7DC8,所以我已经给出了起始地址为0x 7E00,读/写大小为256字节,而读/写操作。

我已经尝试将开始地址更改为0x7E10, 0x7EF0, 0x7F00,读/写大小为255,100,128,注意flash的最后一个地址(0x7FFF)不超过。

这件事请尽快帮我

我不理解原因,因为我在另一个项目中使用了相同的方法和相同的源文件和头文件,这也是基于连接的,在那里我能够读取/写入数据从/到flash没有任何问题。这里我的起始地址是0x7000,大小是150字节。

根据我的测试获取更多信息

我有一些观察,也可能是错误的,但只是告诉你,如果它有用的话

我已经观察到参数“SECTOR_ERASE”从“spi_flash.h”中使用的api“spi_flash_block_erase(USER_FLASH_RW_ADDRESS, SECTOR_ERASE);“而闪存写入操作影响设备广告的停止,所以,

当我将这个参数更改为0x10, 0x05或当我直接在api中传递255/256而不是传递参数“SECTOR_ERASE”时。

广告问题得到解决,但要么数据没有写入flash,要么写入的数据被操纵

我已经在调试和智能代码片段工具中检查了这一点。

谢谢和问候

Utkarsh

PM_Dialog
离线
最后看到:11小时12分钟前
工作人员"title=
加入:2018-02-08 11:03
嗨Utkarash,

嗨Utkarash,

你提到在调试模式下运行代码时工作正常,但问题是当读取/写入数据到闪存时,我的理解是正确的吗?如果在调试模式下运行您的代码,请说明与flash交互时会发生什么?

不建议在外围init()函数中与SPI Flash交互。该功能将在系统引导和设备唤醒时触发。您是否在已实现的读/写函数中添加了断点?另外,请告诉我你是否已经启用或禁用了看门狗?你的问题最可能的原因是你的固件可能卡在了某个地方。

如果设备停止发布且固件运行正常,则应该触发.app_on_adv_undirect_complete回调。你能在这个回调函数中添加断点吗?

“我不理解原因,因为我在另一个项目中使用了相同的方法、相同的源文件和头文件,这也是基于连接的,在那里我能够从/写入数据到flash而没有任何问题。这里我的起始地址是0x7000,大小是150字节。”

请问在SDK的哪个项目中代码正常工作?你是否正在使用任何睡眠模式或设备在活动模式下运行?

谢谢,PM_Dialog

Utkarash
离线
最后看到:1年7个月前
加入:2019-01-18 06:36
谢谢你的回复

谢谢你的回复

你提到在调试模式下运行代码时工作正常,但问题是当读取/写入数据到闪存时,我的理解是正确的吗?是的,当我闪现代码并执行SPI flash读/写时,它就会停止广告。

如果在调试模式下运行您的代码,请说明与flash交互时会发生什么?在调试中,一切工作正常,没有问题,观察到代码流是正确的,即,读写fxn的代码正确地回到正常的代码流。

您是否在已实现的读/写函数中添加了断点?是的,我尝试了保持断点,但没有遇到任何问题,我还尝试了从periph init改变读取flash的调用位置。现在我在初始化5/10秒后在定时器处理程序fxn中调用read flash。但问题仍然没有改变。

另外,请告诉我你是否已经启用或禁用了看门狗?不,我没有启用或禁用看门狗。如果我的代码卡住了,我怎么能找到它卡住的地方和解决方案呢?

你能在这个回调函数中添加断点吗?请接受我诚挚的道歉。实际上,我忘记通知昨天,我已经在ble_peripheral代码做了一些修改,因为我想在观察者和外围模式下操作我的设备,所以现在我没有“app_on_adv_undirect_complete回调”,但我的设备工作良好。这会产生问题吗?

请问在SDK的哪个项目中代码正常工作?项目相同的ble外围设备,但仅基于连接和SDK也相同(5.0.4)

你是否正在使用任何睡眠模式或设备在活动模式下运行?不。

请注意我下面提到的确切流程,以了解当我闪烁代码时设备停止广告

  • 我上电设备,然后连接到它->在连接到它之后共享关于特征的所需数据->,然后我断开连接,同时我已经调用了写Flash功能->然后,如果我重新扫描设备是广告->现在我关机并上电设备->重新扫描设备现在停止广告。

更改过

我注释了api“spi_flash_block_erase(USER_FLASH_RW_ADDRESS, SECTOR_ERASE)”,并在flash中转储了相同的代码。

按照上面提到的步骤,它可以正常工作。

我可能错了,但只是有一个查询,所以想向您确认,这个api是否会导致问题,因为对于块擦除,我在开始地址(即512字节(7E00到7FFF))后剩下的内存非常少?

如果是这样,我们可以使用任何替代函数而不是“spi_flash_block_erase”,我可以擦除自定义的字节数(擦除256或512字节也会有帮助)?或者还有其他问题吗?

请尽快帮助我。

感谢和问候

Utkarsh

Utkarash
离线
最后看到:1年7个月前
加入:2019-01-18 06:36
你好所有的,

你好所有的,

昨天的帖子有什么更新吗?,

还有一个我想分享的观察spi_flash_block_erase”API做的是耳朵包含从0x7000闪存地址,这反过来导致擦除我的一些代码部分在闪存。

由于我在转储代码后检查了Smart snippet,总代码扩展到内存地址0x7D40。

请尽快帮助避免此问题。

感谢和问候

Utkarsh

PM_Dialog
离线
最后看到:11小时12分钟前
工作人员"title=
加入:2018-02-08 11:03
嗨Utkarash,

嗨Utkarash,

  • 不,我没有启用或禁用看门狗。如果我的代码卡住了,我怎么能找到它卡住的地方和解决方案呢?

你这话是什么意思?看门狗可以被禁用或启用。如果定义了da1458x_config_basic.h中的CFG_WDOG宏,则开启看门狗。默认的看门狗周期是在arch_wdg.h中定义的WATCHDOG_DEFAULT_PERIOD宏。有关看门狗的更多信息,请参阅数据表。

  • 请接受我诚挚的道歉。实际上,我忘记通知昨天,我已经在ble_peripheral代码做了一些修改,因为我想在观察者和外围模式下操作我的设备,所以现在我没有“app_on_adv_undirect_complete回调”,但我的设备工作良好。这会产生问题吗?

老实说,我不确定你是如何实现这个功能的。您是否实现了角色切换?如果移除闪存读写,它是否正常工作?

  • 在调试中,一切工作正常,没有问题,观察到代码流是正确的,即,读写fxn的代码正确地回到正常的代码流。

"正常模式"是什么意思?

  • 请检查使用spi_flash_block_erase()的SDK的spi_flash外设示例。该代码与SECTOR_ERASE一起完美地工作。

最可能的原因可能是您的代码可能会卡在某个地方。我建议您在调试模式下运行代码,逐步检查代码并尝试找到它卡住的地方。例如,当读/写时,程序是否已经完成?你检查过代码是做什么的吗?请细阅教程8:调试方法

谢谢,PM_Dialog

Utkarash
离线
最后看到:1年7个月前
加入:2019-01-18 06:36
谢谢你的回复

谢谢你的回复

1)说实话,我不确定你是如何实现这个功能的。您是否实现了角色切换?如果移除闪存读写,它是否正常工作?

答:是的,我已经实现了角色转换。它的工作正确的flash读/写。另外请注意,我观察到,如果我删除闪存写入功能,只保留闪存读取功能,它完全可以工作,没有问题。

2)“正常模式”是什么意思?

答:正常模式意味着代码按预期运行,即,在调试中,当我运行代码时,正如我前面所说的,它在观察者和外围模式中进行适当的角色切换,我可以连接到设备,我可以交换数据。该数据正确地存储在flash中。如果尝试读取flash,我也可以正确地读取它,而没有代码卡住的地方。

根据我之前的观察,我认为“spi_flash_block_erase”API,这是flash写功能的一部分,从0x7000闪存地址的内容,这反过来导致在flash中擦除我的一些代码的一部分。由于我在转储代码后检查了Smart snippet,总代码扩展到内存地址0x7D40。

我可能错了,但是,我认为在调试模式下,代码在RAM中,当执行写入flash操作时,它不会影响代码,但当代码转储在flash中(使用Smart Snippet Toolbox),并在执行flash写入操作时,从地址0x7000到0x7D40写入的代码部分被擦除(Smart Snippet Toolbox上的Read30KB选项检查)。

3)请查看使用spi_flash_block_erase()的SDK的spi_flash外设示例。

答:感谢您的回复。按照你的建议,我已经完成了"spi_flash外设示例"

然而,正如我提到的“spi_flash_block_erase()”在我的代码中也可以正常工作。但它所做的是,它消除了我的代码的一部分,它转向是导致停止广告,所以我请求你,有没有任何方法/api可用,我可以消除一页(即256字节)的内存大小?那么请尽快提供帮助。

因为在"spi_flash外设示例"我只找到了这样的函数“spi_flash_block_erase()”spi_flash_chip_erase而且spi_flash_chip_erase_forced这又导致耳朵我的代码内存部分在闪光

4)例如,读/写的时候,程序完成了吗?你检查过代码是做什么的吗?

答:谢谢你的链接,我会通过它。是的,我已经检查了代码在读写假操作后做什么,它不会在任何地方停止

请验证我在下面提到的调试步骤

  • 在Debug中运行代码时,设备每2秒切换一次角色。在观察者模式我可以扫描其他ble设备和接收他们的广告包和外围模式我可以使用BLE扫描仪连接到我的设备。
  • 现在我连接到设备使用BLE扫描仪应用程序执行数据交换。
  • 数据交换后,我断开设备与app的连接,同时在user_on_disconnect fxn中执行Flash写功能。
  • 然后,设备保持角色切换正常。我也能连接和交换数据与设备和扫描在观察者模式。
  • 然后我尝试执行Flash读取操作,我能够读取正确的数据。
  • 我也试过关闭设备(即,退出调试和断开设备)。然后再次上电设备运行代码调试和执行读取Flash操作。我能正确地获取数据。
  • 另外,如果我重复这些步骤,我没有任何问题。

请尽快给予帮助。

感谢和问候

Utkarash

Utkarash
离线
最后看到:1年7个月前
加入:2019-01-18 06:36
你好所有的,

你好所有的,

这个案子有什么更新吗

请帮忙,

谢谢和问候

PM_Dialog
离线
最后看到:11小时12分钟前
工作人员"title=
加入:2018-02-08 11:03
嗨Utkarash,

嗨Utkarash,

  • 您已经使app_on_adv_undirect_complete回调无效。这可能是一个问题,因为SDK5无法同时处理观察者角色和外围角色。对于双重角色实现,你需要停止空中操作,如广告,然后你可以切换到观察者角色
  • 请指出da1458x_config_basic.h中的CFG_WDOG宏是否被定义。
  • USER_FLASH_RW_ADDRESS的值是什么?
  • 我建议您使用spi_flash_configure_memory_protection () API来确认不应该写入内存的哪一部分。之后,他可以调用spi_flash_chip_erase API来删除不受保护的内存区域。我的意思是应用内存保护到你的闪存,然后用一个API调用擦除内存,只会擦除未保护的内存区域

谢谢,PM_Dialog

Utkarash
离线
最后看到:1年7个月前
加入:2019-01-18 06:36
谢谢你的回复

谢谢你的回复

1)请说明da1458x_config_basic.h中的CFG_WDOG宏是否被定义。

答:是的,它是默认定义的,我没有做任何改变。

2) USER_FLASH_RW_ADDRESS的值是什么?

答:0 x7e00

我将尝试在我的代码中实现这种内存保护,并尝试运行代码并返回给你,在此之前请检查并告诉Watchdog或“USER_FLASH_RW_ADDRESS”地址是否导致任何问题。

你也可以帮助我使用内存保护api,因为它只有一个参数和选项,传递参数是“W25x10_MEM_PROT_NONE”,“W25x10_MEM_PROT_UPPER_HALF”,“W25x10_MEM_PROT_LOWER_HALF”,“W25x10_MEM_PROT_ALL”,其中我想保护0x7000到0x7DF0。

感谢和问候

Utkarsh

PM_Dialog
离线
最后看到:11小时12分钟前
工作人员"title=
加入:2018-02-08 11:03
嗨Utkarash,

嗨Utkarash,

请实施内存保护,并告诉我。

谢谢,PM_Dialog

Utkarash
离线
最后看到:1年7个月前
加入:2019-01-18 06:36
你好所有的,

你好所有的,

我实现了内存保护,但我面临的问题是我不能转储/程序/燃烧代码在我的设备使用智能片段工具箱,即,我无法消除我的闪存。

1)同样,正如我之前告诉过的,在智能代码段和代码占用的总flash是从0x00000到0x07D48,其中当我使用api阻止擦除时“spi_flash_block_erase (0 x07e00 SECTOR_ERASE)”从0x07000到0x07D48的代码部分,其中我已经给出了起始地址0x07E00。

考虑到点1的情况下,如果我在这种情况下使用内存保护api,我无法将我的数据重写到闪存上的相同内存地址[即0x07E00],

我已经尝试了内存保护api与所有这些参数如下所示,

一)spi_flash_configure_memory_protection (W25x20_MEM_PROT_UPPER_QUARTER);

b) spi_flash_configure_memory_protection(W25x20_MEM_PROT_UPPER_HALF);

c) spi_flash_configure_memory_protection(W25x20_MEM_PROT_LOWER_QUARTER);

d) spi_flash_configure_memory_protection(W25x20_MEM_PROT_LOWER_HALF);

e) spi_flash_configure_memory_protection (W25x20_MEM_PROT_ALL);

我已经尝试了上面提到的所有参数,但我要么无法将数据重写为flash,要么代码部分被烧毁。这个问题仍然没有改变

我请求你帮忙

感谢和问候

Utkarsh

Utkarash
离线
最后看到:1年7个月前
加入:2019-01-18 06:36
你好所有的,

你好所有的,

上述问题是否有最新进展?

谢谢,毕业生们

Utkarash

PM_Dialog
离线
最后看到:11小时12分钟前
工作人员"title=
加入:2018-02-08 11:03
嗨Utkarash,

嗨Utkarash,

据我所知,从你所描述的,可能你正在运行的固件损坏了。请说明您是从Sys-RAM引导还是从SPI Flash引导?你把SPI Flash和固件一起烧了吗?如果是,请执行以下步骤,以确保写入数据到闪存时二进制图像是否损坏。

  • 构建您的项目,然后使用SmartSnippets工具箱中的Flash程序员工具,以便刻录SPI Flash并使设备可引导。
  • 之后,导出二进制图像,因为它是燃烧在SPI Flash。
  • 然后,连接到对等设备,并将您想要的数据写入SPI Flash
  • 一旦写入数据,再次从SPI Flash导出二进制图像。
  • 比较这两幅图像并指出它们是否相同。使用差异工具来比较它们。你在SPI Flash中写入的数据,在哪个地址中被写入?

谢谢,PM_Dialog

Utkarash
离线
最后看到:1年7个月前
加入:2019-01-18 06:36
你好所有的,

你好所有的,

谢谢你的回复,

请说明您是从Sys-RAM引导还是从SPI Flash引导?答:SPI FLASH。

你把SPI Flash和固件一起烧了吗?答:是的

比较这两幅图像并指出它们是否相同。使用差异工具来比较它们。答:我遵循了你建议的步骤,并在WinMerger工具中比较了这两个文件,但两个图像都出现了不同

你在SPI Flash中写入的数据,在哪个地址中被写入?答:为了得到准确的发生了什么之前和之后的闪存写入操作,我在智能片段中使用SPI flash程序员选项卡中的浏览选项加载了两个文件。同样的,我附上了一个图像称为比较,请检查它

我还附上了在flash数据写入操作之前和在flash数据写入操作之后导出的二进制文件。

在此之后,导出二进制图像,因为它在SPI Flash中刻录。,文件命名为在数据写入flash.bin之前在下面给出的链接

https://drive.google.com/file/d/10tSntB6UZ1bX7yvFYnb5SMey4PEW0sw-/view?u..。

一旦写入数据,再次从SPI Flash导出二进制图像。文件命名为数据写入flash.bin后在下面给出的链接

https://drive.google.com/file/d/10tSntB6UZ1bX7yvFYnb5SMey4PEW0sw-/view?u..。

请帮助我,如果有任何替代api,而不是“spi_flash_block_earse”,我只能earse一个页面,而不是块内存。

感谢和问候

Utkarash

附件:
PM_Dialog
离线
最后看到:11小时12分钟前
工作人员"title=
加入:2018-02-08 11:03
嗨Utkarash,

嗨Utkarash,

你能不能把这两张二进制图片都压缩并附上以便检查?

如果您不调用spi_flash_block_earse,在将数据写入SPI flash后,您是否能够引导?我想知道你的问题的原因可能是什么。

谢谢,PM_Dialog

PM_Dialog
离线
最后看到:11小时12分钟前
工作人员"title=
加入:2018-02-08 11:03
嗨Utkarash,

嗨Utkarash,

你能不能把这两张二进制图片都压缩并附上以便检查?

如果您不调用spi_flash_block_earse,在将数据写入SPI flash后,您是否能够引导?我想知道你的问题的原因可能是什么。

谢谢,PM_Dialog

Utkarash
离线
最后看到:1年7个月前
加入:2019-01-18 06:36
你好所有的,

你好所有的,

谢谢你的回复。

你能不能把这两张二进制图片都压缩并附上以便检查?抱歉给您带来不便,我在此邮件中附上了。zip文件。

如果您不调用spi_flash_block_earse,在将数据写入SPI flash后,您是否能够引导?我想知道你的问题的原因可能是什么。你的理解是正确的,如果我不打电话spi_flash_block_earse”我能够启动,但如果flash没有earsed我的数据也没有写入flash。

请尽快帮助,因为设备即将进入生产阶段,只有这个问题我需要紧急解决。

我请求你请帮助,如果可能的话,任何其他api,我只能擦除页面的flash

谢谢大家

Utkarsh

Utkarash
离线
最后看到:1年7个月前
加入:2019-01-18 06:36

你好所有的,

是否有最新进展?

我请求你尽快帮助,因为设备即将进入生产阶段,只有这个问题还没有解决,我需要紧急解决它。

感谢和问候

Utkarash

PM_Dialog
离线
最后看到:11小时12分钟前
工作人员"title=
加入:2018-02-08 11:03
嗨Utkarash,

嗨Utkarash,

根据数据写入SPI Flash前的二进制,执行代码存储在0x0000 (Sector_0)到0x7BD7(Sector_7)之间。每个扇区为0x1000字节。在你的固件中,数据将从USER_FLASH_RW_ADDRESS (0x07E00)开始写入/擦除,它位于Sector_7井中。当执行spi_flash_block_erase(USER_FLASH_RW_ADDRESS, SECTOR_ERASE)时,洞Sector_7将被擦除,其中包含您的固件和存储的数据。这意味着二进制映像已损坏,因此您将无法启动。请在数据写入SPI Flash后检查二进制,您将看到Flash从0x7000地址被擦除。如果您想在将数据写入闪存之前擦除扇区,则应该在下一个扇区中执行此操作。例如,在“Sector_8”中,需要进行如下修改:

#定义USER_FLASH_RW_ADDRESS 0x08000

spi_flash_block_erase (USER_FLASH_RW_ADDRESS SECTOR_ERASE);

因此,当执行spi_flash_block_erase()时,将删除不包含执行代码的Sector_8。

谢谢,PM_Dialog

Utkarash
离线
最后看到:1年7个月前
加入:2019-01-18 06:36
你好先生,

你好先生,

谢谢你的回复

我已经用虚假数据进行了检查,广告问题已经解决。但是现在我将通过编写正确的数据进行测试,并让你知道

只有一个问题,正如你所说的,我正在使用扇区7 (0x07000),在flash中读取/写入我的数据,我应该使用地址0x08000的扇区8,

所以考虑到这一点,到底有多少扇区可供用户保存数据。这对固件有什么影响吗?

再次感谢

谢谢和问候

Utkarash

PM_Dialog
离线
最后看到:11小时12分钟前
工作人员"title=
加入:2018-02-08 11:03
嗨Utkarash,

嗨Utkarash,

DA14583内置1Mbit SPI闪存,对应1024 x 1024 = 1048576位或131072字节。您可以查看SDK5.0.4的ble_app_secutity示例,其中使用SPI flash来存储绑定数据。在user_peri_setup .h头文件中,在USER_CFG_APP_BOND_DB_USE_SPI_FLASH宏下,你会发现以下定义:

// SPI Flash大小(以字节为单位

#定义SPI_FLASH_DEFAULT_PAGE

#定义SPI_SECTOR_SIZE 4096

每个扇区是4096 (= 0x1000)个字节对齐的,因此每个扇区= 32 (=0x20)个可用扇区有131072字节/ 4096字节,对应于0x00000 - 0x1FFFF地址空间。你也可以用SmartSnippets工具箱中的flash程序员来阐明它。

根据将数据存储到闪存之前的二进制文件,固件位于0x0000 (Sector_0)到0x7BD7(Sector_7)之间。为此,如果希望执行扇区擦除,可以使用0x08000 (Sector_8) - 0x1FFFF(Sector_32)。

请检查附上的图片,你会在我之前的帖子中提到的关于损坏的固件。

谢谢,PM_Dialog