你好所有的,
我使用了从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
嗨Utkarash,
你提到当运行你的代码在调试模式下工作很好,但问题是当读取/写入数据到闪存,我的理解是正确的吗?如果在调试模式下运行您的代码,请说明与flash交互时会发生什么?
不建议在peri_init()函数中与SPI Flash交互。该功能将在系统引导和设备唤醒时触发。您是否在已实现的读/写函数中添加了断点?另外,你能告诉我你是否开启或关闭了看门狗吗?你的问题最可能的原因是你的固件可能卡住了。
如果设备停止发布且固件运行正常,则应该触发.app_on_adv_undirect_complete回调。能否在这个回调函数中增加一个断点?
“我不明白原因,因为我在另一个项目中使用了相同的方法和相同的源和头文件,这也是基于连接的,在那里我能够从/写入数据从flash没有任何问题。这里我的起始地址是0x7000,大小是150字节。”
你能告诉我这个代码在SDK的哪个项目中正常工作吗?你是在使用睡眠模式还是设备在活动模式下运行?
谢谢,PM_Dialog
感谢您的回复
你提到当运行你的代码在调试模式下工作很好,但问题是当读取/写入数据到闪存,我的理解是正确的吗?是的,当我闪现代码并执行SPI flash读/写时,它就会停止广告。
如果在调试模式下运行您的代码,请说明与flash交互时会发生什么?在调试中,一切工作正常,没有问题被观察到,代码流是正确的,即,读写fxn的代码正确地回到正常的代码流。
您是否在已实现的读/写函数中添加了断点?是的,我试过保持断点,但没有遇到任何问题,我也试过改变读取flash的调用位置从外围init。现在我调用读取flash在定时器处理程序fxn后5/10秒初始化。但问题还是一样。
另外,你能告诉我你是否开启或关闭了看门狗吗?不,我没有启用或禁用看门狗。如果我的代码卡住了,我怎么能找到它卡住的地方和解决方案呢?
能否在这个回调函数中增加一个断点?请接受我真诚的道歉。实际上,我昨天忘记通知,我已经在ble_peripheral代码做了一些修改,因为我想在观察者和外设模式下操作我的设备,所以现在我没有“app_on_adv_undirect_complete回调”,但我的设备工作良好。这是在制造问题吗?
你能告诉我这个代码在SDK的哪个项目中正常工作吗?项目相同的外围设备,但只基于连接,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 flash地址,这反过来导致擦除我的一些代码部分在flash。
当我检查了智能片段转储代码后,总代码扩展到内存地址0x7D40。
请尽快帮助避免这个问题。
感谢和问候
Utkarsh
嗨Utkarash,
你这是什么意思?看门狗可以被禁用或启用。如果定义了da1458x_config_basic.h中的CFG_WDOG宏,则启动看门狗。默认的看门狗周期是在arch_wdg.h中定义的WATCHDOG_DEFAULT_PERIOD宏。有关看门狗的更多信息,请参阅数据表。
说实话,我不确定你是如何实现这个功能的。你是否实现了角色转换?如果你移除闪存读写,它是否正常工作?
"正常模式"是什么意思?
最可能的原因可能是您的代码可能卡在了某个地方。我建议您在调试模式下运行代码,跳过代码并尝试找到它卡住的地方。例如,读/写过程是否完成?你检查过代码的功能了吗?请阅读教程8:调试方法.
谢谢,PM_Dialog
感谢您的回复
老实说,我不知道你们是如何实现这个功能的。你是否实现了角色转换?如果你移除闪存读写,它是否正常工作?
答:是的,我实现了角色转换。它可以在没有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)例如,读/写过程是否完成?你检查过代码的功能了吗?
答:谢谢你的链接,我会通过它。是的,我检查了什么代码做读写假操作后,它不停止任何地方
请验证我在下面提到的调试步骤
请尽快帮助我。
感谢和问候
Utkarash
你好所有的,
这个案子有什么进展吗
请帮忙,
感谢和问候
嗨Utkarash,
谢谢,PM_Dialog
感谢您的回复
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
嗨Utkarash,
请执行内存保护并让我知道。
谢谢,PM_Dialog
你好所有的,
我实现了内存保护,但我面临的问题是,我不能转储/程序/烧录代码在我的设备使用智能片段工具箱,即,我不能擦除我的闪存。
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
嗨Utkarash,
据我所知,从你的描述,可能你正在运行的固件是损坏的。你能告诉我你是从Sys-RAM还是SPI Flash引导的吗?你的固件烧坏了SPI Flash吗?如果是,请执行以下步骤,以确保二进制图像在写入闪存时是否已损坏。
谢谢,PM_Dialog
你好所有的,
谢谢你的回复,
你能告诉我你是从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
嗨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中,所以您应该做以下修改:
#定义x08000 USER_FLASH_RW_ADDRESS 0
spi_flash_block_erase (USER_FLASH_RW_ADDRESS SECTOR_ERASE);
因此,在执行spi_flash_block_erase()时,将删除不包含执行代码的Sector_8。
谢谢,PM_Dialog
你好先生,
感谢您的回复
我已经用虚拟数据检查过了,广告问题已经解决了。不过,现在我会写正确的数据进行测试,然后让你知道
最后一个问题,正如你说的,我正在使用扇区7 (0x07000)和在flash中读写我的数据,我应该使用扇区8,地址是0x08000,
考虑到这一点,到底有多少扇区可供用户保存数据。这对固件有什么影响吗?
再次感谢大家
感谢和问候
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