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

你好所有的,

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

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

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

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

我已经做了所需的改变为相同的,并使独立的头文件和源文件处理Flash读/写操作,我附上了这篇文章。

我面临的问题是,当我读/写数据闪存时,我的设备停止广告时,它重新供电。

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

我的代码内存扩展到地址0x7DC8在闪存,所以我已经给了开始地址0x 7E00与读/写操作时的256字节的读/写大小。

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

请尽快帮我解决这个问题

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

有关更多信息,根据我的测试

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

我观察到,在api“spi_flash_block_erase”(USER_FLASH_RW_ADDRESS, SECTOR_ERASE)中使用的“spi_flash.h”中的参数“SECTOR_ERASE”;因此flash写操作影响设备广告的停止,

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

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

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

感谢和问候

Utkarsh

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

嗨Utkarash,

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

不建议在peri_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的代码正确地回到正常的代码流。

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

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

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

你能告诉我这个代码在SDK的哪个项目中正常工作吗?项目相同的外围设备,但只基于连接,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 flash地址,这反过来导致擦除我的一些代码部分在flash。

当我检查了智能片段转储代码后,总代码扩展到内存地址0x7D40。

请尽快帮助避免这个问题。

感谢和问候

Utkarsh

PM_Dialog
离线
最后看到:4小时56分钟前
工作人员"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
感谢您的回复

感谢您的回复

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

答:是的,我实现了角色转换。它可以在没有flash读/写的情况下正常工作。另外请注意,我观察到,如果我删除flash写功能,只保留flash读功能,它完全正常,没有问题。

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

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

根据我之前分享的观察,那就是“spi_flash_block_erase”API是flash写函数的一部分,从0x7000 flash地址删除内容,这反过来导致在flash中删除我的部分代码。当我检查了智能片段转储代码后,总代码扩展到内存地址0x7D40。

我可能是错的,然而,我认为在调试模式下,代码在RAM中,当执行写flash操作时,它不会影响代码,但当代码转储到flash(使用智能片段工具箱)和执行flash写操作,从地址0x7000写到0x7D40的代码部分被擦除(检查与智能片段工具箱上的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这又导致耳朵我的代码内存部分在flash

4)例如,读/写过程是否完成?你检查过代码的功能了吗?

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

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

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

请尽快帮助我。

感谢和问候

Utkarash

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

你好所有的,

这个案子有什么进展吗

请帮忙,

感谢和问候

PM_Dialog
离线
最后看到:4小时56分钟前
工作人员"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

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

另外,请帮助我使用内存保护api,因为它只有一个参数和选项传递poparameter是“W25x10_MEM_PROT_NONE”,“W25x10_MEM_PROT_UPPER_HALF”,“W25x10_MEM_PROT_LOWER_HALF”,“W25x10_MEM_PROT_ALL”,在这里,我想保护0x7000到0x7DF0。

感谢和问候

Utkarsh

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

嗨Utkarash,

请执行内存保护并让我知道。

谢谢,PM_Dialog

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

你好所有的,

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

1)也如我之前所告知的,在智能片段和总闪存占用的代码从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或代码部分正在被earsed。这个问题仍然没有改变

我请求你请帮忙

感谢和问候

Utkarsh

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

你好所有的,

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

感谢和独立

Utkarash

PM_Dialog
离线
最后看到:4小时56分钟前
工作人员"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闪光。

你的固件烧坏了SPI Flash吗?答:是的

比较这两张图片并指出它们是否相同。使用差异工具来比较它们。答:我按照你推荐的步骤做了,也比较了winmerge工具中的两个文件,但是两个图像看起来都不一样

您在SPI Flash中写入的数据,其中地址是写入的?答:要得到确切发生了什么之前和之后的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”,我只能擦除一个页面而不是块内存。

感谢和问候

Utkarash

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

嗨Utkarash,

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

如果您不调用spi_flash_block_earse,在将数据写入SPI flash之后,您能够引导吗?我正在试图了解你的问题的原因可能是什么。

谢谢,PM_Dialog

PM_Dialog
离线
最后看到:4小时56分钟前
工作人员"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
离线
最后看到:4小时56分钟前
工作人员"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中,所以您应该做以下修改:

#定义x08000 USER_FLASH_RW_ADDRESS 0

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中读写我的数据,我应该使用扇区8,地址是0x08000,

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

再次感谢大家

感谢和问候

Utkarash

PM_Dialog
离线
最后看到:4小时56分钟前
工作人员"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_peripheral _setup.h头文件中,在USER_CFG_APP_BOND_DB_USE_SPI_FLASH宏下,你会发现以下定义:

#define SPI_FLASH_DEFAULT_SIZE 131072 // SPI Flash内存大小,单位为字节

#定义SPI_FLASH_DEFAULT_PAGE 256

#定义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