我已经实现了DA14681在一个自定义板与宏宏MX25R3235F。
我可以毫无问题地在flash中编写应用程序。
我可以擦除或重写flash数据使用编程脚本(program_nvparam, program_qspi, erase_qspi)没有任何问题。
然而,我正在使用nvms参数和通用部分为我的应用程序。
当我写数据与我的应用程序,使用ad_nvms_write一切都是好的,如果flash是空白的地址,我想写。
然而,当使用ad_nvms_erase_region或ad_flash_erase_region擦除数据或写入新数据时,或简单地写入'FF'来擦除数据,
然后,闪存数据被随机数据破坏。
我怀疑在flash级别上有一些配置问题,因为我在DA14680上用winbond flash尝试了相同的应用程序代码,一切都很好。
你会发现附加我的flash配置文件。
谢谢你的帮助。
马修
设备:
嗨matthieuW,
测试附带. h文件,在发布一个MX25R3235F pro开发工具包,我已经写在通用部分分区(使用直接的方案而不是类型,因为实际上你不能擦除数据类型在使用)一个10个字节数组,然后擦除speciifc和额外的数据地址,然后重写,没有注意到任何腐败,程序也按照规定完成了。
由于MT_dialog
亲爱的对话框,
因此问题的根本原因不应该是flash配置文件。
我做了多个测试:
-我没有问题写数据到param或通用分区时,闪存是空白。
-当数据已经写入,我得到随机数据时,第二次写入相同的地址,
下面是我使用的命令:
nvms_t nvms = ad_nvms_open (NVMS_GENERIC_PART);
Ad_nvms_write (nvms, addr, data, len);
下面是我使用的分区表:
分区2(0x000000, 0x025000, NVMS_FIRMWARE_PART, 0)
分区2(0x025000, 0x001000, NVMS_PRODUCT_HEADER_PART, 0)
分区2(0x026000, 0x001000, NVMS_IMAGE_HEADER_PART, 0)
分区2(0x027000, 0x050000, NVMS_FW_EXEC_PART, 0)
分区2(0x077000, 0x006000, NVMS_LOG_PART, 0)
PARTITION2(0x07D000, 0x002000, NVMS_PLATFORM_PARAMS_PART, PARTITION_FLAG_READ_ONLY)
PARTITION2(0x07F000, 0x001000, NVMS_PARTITION_TABLE, PARTITION_FLAG_READ_ONLY)
PARTITION2(0x080000, 0x010000, NVMS_PARAM_PART, 0)
分区2(0x090000, 0x050000, NVMS_FW_UPDATE_PART, 0)
分区2(0x0E0000, 0x320000, NVMS_GENERIC_PART, 0)
-当我将通用部分改为VES并将其大小减少到0x100000以下时,一切都很好,问题是我的应用程序需要flash的所有空间。
使用ves分区时是否有分区大小限制?
我可以在参数分区中使用ves吗?
有什么配置我遗漏了吗?
问候
马修
嗨matthieuW,
在您执行erase命令并尝试在该特定地址上写入任何其他内容之前,您能检查数据是否被正确地删除了吗?你也可以提到你使用的SDK版本(在SDK 1.0.10上有一个bug, flash的删除会因为任何类型的中断而取消,这个在SDK 1.0.12上被修复)。
关于你的问题:
由于MT_Dialog
我正在使用SDk1.0.12,
我检查过了,闪电已经在swd上完全消失了。
下面是通过jlink擦除后发生的简单日志。
rdmem 0 64
0 xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
wrmem 0 0 x0001020304050607
rdmem 0 64
0 x0001020304050607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
wrmem 0 0 xffffffffffffffff
rdmem 0 64
0 x0001020304050607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
第二次写入是无效的。
否则,我就理解了分割原理
然而,如果我声明我的分区为ves,我就不会有这个困扰我的问题。
马修
嗨matthieW,
对不起,但我不能复制你所说的,使用相同的闪存,使用你提到的驱动程序和下面的代码片段,uint8_t data_buf_1和2只是包含40字节数据的数组:
generic_part_hndl = ad_nvms_open (NVMS_GENERIC_PART);
Ad_nvms_write (generic_part_hndl, 0x00, data_buf_1, sizeof(data_buf_1));
Ad_nvms_write (generic_part_hndl, 0x00, data_buf_2, sizeof(data_buf_2));
我能够更新数据flash,并验证它从QSPI分区表工具,数据被正确地写,我唯一可以假设是,要么你不使用适配器来与分区,所以出现,或在上面的例子中你正在读数据不是来自相同的任务,但是从另一个任务中读取数据,因此您是在flash被擦除并使用前一个任务中的新数据更新之前读取数据的。对于ve,如上所述,每次执行新的写操作时,都会使用一个已经为空的闪存物理地址。
由于MT_dialog
我在flash配置文件中禁用了MACRONIX_PERFORMANCE_MODE,一切工作正常。
谢谢你的帮助。
马修
嗨matthieuW,
谢谢你这么说。
MT_dialog问好