你好所有的,
我使用了来自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
嗨Utkarash,
你提到在调试模式下运行代码时工作正常,但问题是当读取/写入数据到闪存时,我的理解是正确的吗?如果在调试模式下运行您的代码,请说明与flash交互时会发生什么?
不建议在外围init()函数中与SPI Flash交互。该功能将在系统引导和设备唤醒时触发。您是否在已实现的读/写函数中添加了断点?另外,请告诉我你是否已经启用或禁用了看门狗?你的问题最可能的原因是你的固件可能卡在了某个地方。
如果设备停止发布且固件运行正常,则应该触发.app_on_adv_undirect_complete回调。你能在这个回调函数中添加断点吗?
“我不理解原因,因为我在另一个项目中使用了相同的方法、相同的源文件和头文件,这也是基于连接的,在那里我能够从/写入数据到flash而没有任何问题。这里我的起始地址是0x7000,大小是150字节。”
请问在SDK的哪个项目中代码正常工作?你是否正在使用任何睡眠模式或设备在活动模式下运行?
谢谢,PM_Dialog
谢谢你的回复
你提到在调试模式下运行代码时工作正常,但问题是当读取/写入数据到闪存时,我的理解是正确的吗?是的,当我闪现代码并执行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)
你是否正在使用任何睡眠模式或设备在活动模式下运行?不。
请注意我下面提到的确切流程,以了解当我闪烁代码时设备停止广告
更改过
我注释了api“spi_flash_block_erase(USER_FLASH_RW_ADDRESS, SECTOR_ERASE)”,并在flash中转储了相同的代码。
按照上面提到的步骤,它可以正常工作。
我可能错了,但只是有一个查询,所以想向您确认,这个api是否会导致问题,因为对于块擦除,我在开始地址(即512字节(7E00到7FFF))后剩下的内存非常少?
如果是这样,我们可以使用任何替代函数而不是“spi_flash_block_erase”,我可以擦除自定义的字节数(擦除256或512字节也会有帮助)?或者还有其他问题吗?
请尽快帮助我。
感谢和问候
Utkarsh
你好所有的,
昨天的帖子有什么更新吗?,
还有一个我想分享的观察spi_flash_block_erase”API做的是耳朵包含从0x7000闪存地址,这反过来导致擦除我的一些代码部分在闪存。
由于我在转储代码后检查了Smart snippet,总代码扩展到内存地址0x7D40。
请尽快帮助避免此问题。
感谢和问候
Utkarsh
嗨Utkarash,
你这话是什么意思?看门狗可以被禁用或启用。如果定义了da1458x_config_basic.h中的CFG_WDOG宏,则开启看门狗。默认的看门狗周期是在arch_wdg.h中定义的WATCHDOG_DEFAULT_PERIOD宏。有关看门狗的更多信息,请参阅数据表。
老实说,我不确定你是如何实现这个功能的。您是否实现了角色切换?如果移除闪存读写,它是否正常工作?
"正常模式"是什么意思?
最可能的原因可能是您的代码可能会卡在某个地方。我建议您在调试模式下运行代码,逐步检查代码并尝试找到它卡住的地方。例如,当读/写时,程序是否已经完成?你检查过代码是做什么的吗?请细阅教程8:调试方法.
谢谢,PM_Dialog
谢谢你的回复
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)例如,读/写的时候,程序完成了吗?你检查过代码是做什么的吗?
答:谢谢你的链接,我会通过它。是的,我已经检查了代码在读写假操作后做什么,它不会在任何地方停止
请验证我在下面提到的调试步骤
请尽快给予帮助。
感谢和问候
Utkarash
你好所有的,
这个案子有什么更新吗
请帮忙,
谢谢和问候
嗨Utkarash,
谢谢,PM_Dialog
谢谢你的回复
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
嗨Utkarash,
请实施内存保护,并告诉我。
谢谢,PM_Dialog
你好所有的,
我实现了内存保护,但我面临的问题是我不能转储/程序/燃烧代码在我的设备使用智能片段工具箱,即,我无法消除我的闪存。
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
嗨Utkarash,
据我所知,从你所描述的,可能你正在运行的固件损坏了。请说明您是从Sys-RAM引导还是从SPI Flash引导?你把SPI Flash和固件一起烧了吗?如果是,请执行以下步骤,以确保写入数据到闪存时二进制图像是否损坏。
谢谢,PM_Dialog
你好所有的,
谢谢你的回复,
请说明您是从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
嗨Utkarash,
你能不能把这两张二进制图片都压缩并附上以便检查?
如果您不调用spi_flash_block_earse,在将数据写入SPI flash后,您是否能够引导?我想知道你的问题的原因可能是什么。
谢谢,PM_Dialog
嗨Utkarash,
你能不能把这两张二进制图片都压缩并附上以便检查?
如果您不调用spi_flash_block_earse,在将数据写入SPI flash后,您是否能够引导?我想知道你的问题的原因可能是什么。
谢谢,PM_Dialog
你好所有的,
谢谢你的回复。
你能不能把这两张二进制图片都压缩并附上以便检查?抱歉给您带来不便,我在此邮件中附上了。zip文件。
如果您不调用spi_flash_block_earse,在将数据写入SPI flash后,您是否能够引导?我想知道你的问题的原因可能是什么。你的理解是正确的,如果我不打电话spi_flash_block_earse”我能够启动,但如果flash没有earsed我的数据也没有写入flash。
请尽快帮助,因为设备即将进入生产阶段,只有这个问题我需要紧急解决。
我请求你请帮助,如果可能的话,任何其他api,我只能擦除页面的flash
谢谢大家
Utkarsh
你好所有的,
是否有最新进展?
我请求你尽快帮助,因为设备即将进入生产阶段,只有这个问题还没有解决,我需要紧急解决它。
感谢和问候
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
你好先生,
谢谢你的回复
我已经用虚假数据进行了检查,广告问题已经解决。但是现在我将通过编写正确的数据进行测试,并让你知道
只有一个问题,正如你所说的,我正在使用扇区7 (0x07000),在flash中读取/写入我的数据,我应该使用地址0x08000的扇区8,
所以考虑到这一点,到底有多少扇区可供用户保存数据。这对固件有什么影响吗?
再次感谢
谢谢和问候
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