大家好,,
参考SDK 5.0.4中的ble_peripheral示例,在DA14583的子板上构建我的应用程序。
我使用基于连接的方法,
在这里,我通过基于连接的方法获得一些数据(即128字节),以及我想要写入/读取闪存的相同数据。
当设备与中心断开连接时,我将数据写入闪存,同样地,在所有初始化之后,我将在peripher_init函数中读取数据。
我已经做了相同的必要的改变,并做了单独的头文件和源文件来处理Flash读写操作,我已经附在这篇文章。
我面临的问题是,当我读取/写入数据来闪光时,我的设备在重新充电后就停止了广告。
我尝试调试相同的设备,但当设备在调试时,它工作正常。然而,当我在Flash的读写周期后将代码转储到Flash中,如果我重新启动设备,它将停止广告。这种情况在执行写周期时尤其会发生。
我的代码内存一直扩展到闪存中的地址0x7DC8,因此我在读/写操作时将start address指定为0x 7E00,读/写大小为256字节。
我尝试过将起始地址更改为0x7E10, 0x7EF0, 0x7F00,读写大小为255,100,128,注意闪存的最后地址(0x7FFF)不超过。
请尽早帮我解决这个问题.
我不理解的原因,因为我已经使用了相同的方法,同样的源和头文件在另一个项目,这也是基于连接,我能够读/写数据,从/到flash没有任何问题。这里我的起始地址是0x7000,大小是150字节。
更多信息请参见我的测试
我有几点看法可能是错误的也有,不过只是通知您,如果在情况下,它可以帮助
我观察到,在api“spi_flash_block_ERASE(用户_flash_RW_地址,扇区_ERASE);”中使用的“spi_flash.h”参数“扇区_ERASE”,而闪存写入操作会影响设备so的广告停止,
当我改变此参数为0x10,0x05中或当我在API直接传递255/256而不是传递参数“SECTOR_ERASE”的。
广告问题得到了解决,但要么数据没有写入flash,要么写入的数据被操纵
我已经在调试和智能代码片段工具中检查了这个。
感谢和问候
乌特卡什
嗨Utkarash,
你提到在调试模式下运行代码时工作正常,但问题是读/写数据到闪存时,我的理解是否正确?如果在调试模式下运行你的代码,你能不能请注明使用闪光灯进行交互时,会发生什么?
建议不要在periph_init()函数中与SPI闪存交互。此功能将在系统引导和设备唤醒时触发。您是否在已实现的读/写函数中添加了断点?另外,你能告诉我你是否启用或禁用了看门狗吗?出现问题的最可能原因是固件可能在某个地方卡住。
如果设备停止播发且固件执行正常,则应触发.app_on_adv_undirect_complete回调。您能在这个回调函数中添加一个断点吗?
“我不理解的原因,因为我已经在另一个项目中使用了相同的方法和相同的源和头文件,这也是基于连接的,在那里我能够读/写数据/闪存没有任何问题。这里我的起始地址是0x7000,大小是150字节。”
您能指出代码在SDK的哪个项目中按预期工作吗?您使用的是睡眠模式还是设备在活动模式下运行?
谢谢,下午好
谢谢您的答复
你提到在调试模式下运行代码时工作正常,但问题是读/写数据到闪存时,我的理解是否正确?是的,这是正确的,当我闪光代码和执行SPI闪光读/写,然后它停止广告。
如果在调试模式下运行代码,请指出与flash交互时会发生什么?在调试中,一切正常工作,没有问题被观察到,代码流是正确的,即,读写fxn的代码正确地回到正常的代码流。
您是否在已实现的读写函数中添加了断点?是的,我尝试了保持断点,但没有遇到任何问题,我也尝试了从periph init改变读取flash的调用位置。现在我在5/10秒的初始化之后在定时器处理器fxn中调用read flash。但问题还是一样的。
此外,可以请你让我知道你是否启用或禁用看门狗?不,我没有启用或禁用看门狗。如果我的代码被卡住我如何才能找到其中的stucks和它的解决方案?
你能在这个回调函数中添加一个断点吗?请接受我诚挚的歉意。事实上,我昨天忘了通知您,我已经对ble_Peripheral代码进行了一些修改,因为我想在Observer和Pheriferal模式下操作我的设备,所以现在我没有“app_on_adv_Undirective_complete callback”,但我的设备工作正常。这是否造成了问题?
请问这个代码是在SDK的哪个项目中正常工作的?project same ble peripheral but only connection based and SDK also same (5.0.4)
您是否使用睡眠模式的矿设备在主动模式下运行?不
请注意我下面提到的确切流程,以理解当我闪光代码时,设备停止广告
试图改变
我注释了api“spi_flash_block_erase(USER_FLASH_RW_ADDRESS, SECTOR_ERASE)”,并在flash中转储相同的代码。
在遵循上面提到的要点步骤后,它可以正常工作。
我可能是错的,但只是有一个查询,希望与您确认此api是否导致问题,因为对于块擦除,我在开始地址之后的内存非常少(即512字节(7E00到7FFF))?
如果是这样的话,我们是否可以使用任何替代函数来代替“spi\U flash\U block\U erase”,在这里我可以只擦除自定义的字节数(擦除256或512字节也会有帮助)?。或者还有其他问题吗?
请尽快帮我。
谢谢和问候
乌特卡什
大家好,,
昨天的帖子有更新吗?,
还有一个我想分享的观察结果,什么?”spi_flash_block_erase”API做的是earses包含从0x7000闪存地址,这反过来导致擦除我的一些代码部分在闪存。
正如我在Smart代码段上检查的那样,在转储代码之后,总代码扩展到内存地址0x7D40。
请尽快帮助避免此问题。
谢谢和问候
乌特卡什
嗨Utkarash,
你那是什么意思?看门狗可能是乙醚禁用或启用。如果da1458x_config_basic.h的CFG_WDOG宏定义,看门狗被启用。默认看门狗周期是其在arch_wdg.h定义WATCHDOG_DEFAULT_PERIOD宏。有关看门狗更多信息,请参阅数据表。
老实说,我不确定您是如何实现这个功能的。你是否实施过角色转换?如果您删除闪存读写,它是否工作正常?
“正常模式”是什么意思?
最可能的原因可能是您的代码可能会在某个地方卡住。我建议您在调试模式下运行代码,逐步检查代码并尝试找出卡住的地方。例如,读/写时,过程是否完成?是否检查了代码的功能?请阅读教程8:调试方法.
谢谢,下午好
谢谢你的回复
1) 老实说,我不确定您是如何实现此功能的。您是否实施了角色转换?如果卸下闪存读/写,它是否正常工作?
答复:是的,我已经实现了角色转换。它在没有flash读写的情况下正常工作。另外请注意,我已经观察到,如果我删除flash写功能,只保留flash读功能,它完全好,没有问题。
2) “正常模式”是什么意思?
答复:正常模式意味着代码按预期运行,即运行代码时处于调试状态,正如我前面所说,它在observer和PheriPeral模式下进行适当的角色切换,我可以连接到设备,并且可以交换数据。该数据正确地存储在闪存中。如果我试着读flash,我也能正确地读,而且代码不会出错。
根据我早些时候分享的观察结果“spi_flash_block_erase”API是一部分的flash写函数earses内容从0x7000 flash地址,这反过来导致擦除我的代码的一些部分在flash。正如我在Smart代码段上检查的那样,在转储代码之后,总代码扩展到内存地址0x7D40。
我可能错了,但是,我认为在调试模式下,代码在RAM中,当执行写闪存操作时,它不会影响代码,但是当代码转储到闪存中(使用智能代码段工具箱),并且在执行闪存写操作时,从adddress 0x7000写入0x7D40的代码部分被擦除(使用智能代码段工具箱上的Read30KB选项选中)。
3)请检查SDK中使用spi_flash_block_erase()的spi_flash外接示例。
答复:谢谢你的回复。根据你的建议,我已经通过了考试“spi_flash外围榜样”,
但是正如我提到的“spi_闪存_块_擦除()”在我的代码也工作正常。But what it does is, that it earse some part of my code which it turn is leads to stopping advertisement, So I am requesting you that is there any method/api avliable where i can just earse one page (i.e., 256 bytes) of memory size ?请尽快帮忙。
因为在“spi_flash外围榜样”我只找到喜欢的功能“spi_闪存_块_擦除()”,"spi闪存芯片擦除"和"spi_flash_chip_erase_forced"这再次导致我在闪存中读取代码存储部分
4)例如,当读/写时,过程完成了吗?你检查过代码的功能了吗?
答复:谢谢你的链接,我将穿境而过。是的,我已经检查读写操作的falsh后做什么的代码,它不会在任何地方停止
请验证我在下面提到的调试步骤
请在最早的帮助。
谢谢和问候
Utkarash
大家好,,
这件事有什么最新进展吗
请帮忙,
感谢和问候
嗨Utkarash,
谢谢,下午好
谢谢你的回复
1) 请说明是否定义了da1458x_config_basic.h中的CFG_WDOG宏。
答:是的,它是默认定义我还没有有任何更改。
2)您使用USER_FLASH_RW_ADDRESS的值是多少?
答:0 x7e00
我将尝试在我的代码中实现这种内存保护,并尝试运行代码并返回给您,直到那时,请检查并告知看门狗或“用户\u闪存\u RW\u地址”地址是否导致任何问题。
也可以你请帮我使用的内存保护api,因为它只有一个参数,选择通过poarameters“W25x10_MEM_PROT_NONE”,“W25x10_MEM_PROT_UPPER_HALF”、“W25x10_MEM_PROT_LOWER_HALF”,“W25x10_MEM_PROT_ALL”,因为我想保护0 0 x7df0 x7000。
谢谢和问候
乌特卡什
嗨Utkarash,
请执行内存保护并让我知道。
谢谢,下午好
大家好,,
我实施了内存保护,但我面临的问题是,我无法使用Smart snippet toolbox在设备中转储/编程/刻录代码,即,我无法使用闪存。
1)另外,作为我先前告知智能片断和总闪光占用由代码从0x00000到0x07D48,其中在当我使用API块擦除“spi_flash_block_erase(0x07E00,SECTOR_ERASE)”从0x07000到0x07D48的代码部分,我已经给出了起始地址为0x07E00。
考虑点1的情况,如果我使用内存保护api在这种情况下,我不能重写我的数据到闪存在相同的内存地址[即,0x07E00],
我已经用下面给出的所有参数尝试了内存保护api,
a) spi闪存配置内存保护(W25x20内存保护上四分之一);
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闪存配置内存保护(W25x20内存保护全部);
我已经尝试了上面提到的所有参数,但我要么无法将数据重写到flash,要么代码部分被占用。问题仍然没有改变
我请求你帮忙
谢谢和问候
乌特卡什
大家好,,
关于上述问题有最新进展吗?
谢谢,再次感谢
Utkarash
嗨Utkarash,
就我所能理解的,从你所描述的,可能你运行的固件是损坏的。你能指出你是从Sys-RAM还是SPI Flash启动的吗?您是否已经烧毁SPI Flash与您的固件?如果是,请按照以下程序,以确保二进制图像在写入数据时是否损坏。
谢谢,下午好
大家好,,
谢谢你的回复,
请说明您是从系统RAM启动还是从SPI闪存启动?答:SPI FLASH。
您是否已经烧毁SPI Flash与您的固件?答:是的
比较两幅图像并指出它们是否相同。使用diff工具比较它们。答:我按照你推荐的步骤做了,在winmerge工具中比较了两个文件,但是两个图像看起来都不一样
您在SPI Flash中写入的数据,在哪些地址被写入?答:为了准确了解flash写入操作前后发生的情况,我使用SPI flash程序员选项卡中的浏览选项在智能代码段中加载了这两个文件。为此,我附加了一个名为Comparison的图像,请检查
我还附上了用于闪存数据写入操作前和闪存数据写入操作后的导出二进制文件。
“之后,导出二进制图像,因为它是在SPI Flash烧伤。”,文件名为在数据写入flash.bin之前在下面的链接中
https://drive.google.com/file/d/10tSntB6UZ1bX7yvFYnb5SMey4PEW0sw-/view?u...
“一旦写入数据,再次从SPI闪存导出二进制图像。”,文件命名为数据写入flash.bin后在下面的链接中
https://drive.google.com/file/d/10tSntB6UZ1bX7yvFYnb5SMey4PEW0sw-/view?u...
请帮助我,如果有任何替代api而不是"spi_flash_block_earse",我只能擦除一个页面,而不是块内存。
谢谢和问候
Utkarash
嗨Utkarash,
能否请你拉上和以检查它们连接两个二进制图像的?
如果您在将数据写入spi闪存后不调用spi闪存块,您是否能够启动?我正在试图了解您的问题可能是由哪些原因造成的。
谢谢,下午好
嗨Utkarash,
能否请你拉上和以检查它们连接两个二进制图像的?
如果您在将数据写入spi闪存后不调用spi闪存块,您是否能够启动?我正在试图了解您的问题可能是由哪些原因造成的。
谢谢,下午好
大家好,,
谢谢你的回复。
能否请你拉上和以检查它们连接两个二进制图像的?很抱歉,我已随此邮件附上.zip文件。
如果您在将数据写入spi闪存后不调用spi闪存块,您是否能够启动?我正在试图了解您的问题可能是由哪些原因造成的。你的理解是正确的,如果我不打电话”spi_flash_block_earse”我能够启动,但如果flash不是擦除我的数据也不是写在flash。
请帮助在最早的设备即将进入生产阶段,只有这个问题是我急需解决。
我请求你请帮助,如果可能与任何其他api,我只能擦除的flash页
感谢和regrads
乌特卡什
大家好,,
关于这个问题有什么最新进展吗?
我请求你尽快帮助,因为设备即将进入生产阶段,只剩下这个问题,我需要紧急解决它。
谢谢和问候
Utkarash
嗨Utkarash,
根据数据写入到SPI闪存之前二进制,执行代码存储从0x0000(Sector_0)到0x7BD7(Sector_7)。每个扇区是0×1000字节。在你的固件,数据将被写入/擦除从USER_FLASH_RW_ADDRESS(0x07E00),位于进Sector_7好开始。当执行spi_flash_block_erase(USER_FLASH_RW_ADDRESS,SECTOR_ERASE),孔Sector_7将被删除,同时包含固件和你的存储数据。这意味着二值图像被损坏,因此,您将无法启动。请检查二进制数据被写入到SPI闪存后,你会看到毛边从0x7000地址删除。如果您想将数据写入到闪存前擦除扇区,你应该这样做,在未来的行业之一。例如,在Sector_8,所以你应该做如下修改:
#定义x08000 USER_FLASH_RW_ADDRESS 0
spi闪存块擦除(用户闪存RW地址、扇区擦除);
所以,在执行spi_flash_block_erase()的情况下,Sector_8将被擦除,其不包含执行代码。
谢谢,下午好
你好先生,
谢谢您的答复
我已经用假数据检查过了,广告问题解决了。但是现在我会写正确的数据来测试,让你知道
还有一个问题,正如您所说,我使用的是扇区7(0x07000),要在闪存中读取/写入数据,我应该使用扇区8,即地址0x08000,
所以考虑到这一点,直到有多少扇区可供用户保存数据。这会对固件产生任何影响。
再次感谢你
感谢和问候
Utkarash
嗨Utkarash,
该DA14583具有对应于1024×1024 = 1048576位或131072个字节嵌入式1Mbit的SPI闪存。你可以检查在该SPI闪存,以便存储在接合数据中使用的SDK5.0.4的ble_app_secutity例子。在user_periph_setup.h头文件,下USER_CFG_APP_BOND_DB_USE_SPI_FLASH宏,你会发现下面的定义:
#定义SPI闪存默认大小131072//SPI闪存大小(字节)
#定义SPI_FLASH_DEFAULT_PAGE 256
#定义SPI_SECTOR_SIZE 4096
每个扇区是4096(= 0×1000)个字节对齐,所以有131072个字节/每扇区= 32(= 0×20)可用扇区对应于0x00000 4096字节 - 0x1FFFF地址空间。你可以用SmartSnippets工具箱的闪存编程澄清它。
根据在将数据存储到闪存之前的二进制文件,固件位于0x0000 (Sector_0)到0x7BD7(Sector_7)之间。为此,如果要执行扇区擦除,可以使用0x08000 (Sector_8) - 0x1FFFF(Sector_32)。
请检查所附的图片,你将看到我在上一篇文章中提到的关于损坏固件的内容。
谢谢,下午好