QSPI通用部分读/写

⚠️
大家好. .谢谢你来参加论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,并包含在主对话网站中。所有的帖子和账号都已迁移。我们现在只接受新论坛的流量-请张贴任何新的线程在//www.xmece.com/support.我们将在未来几天修复bug /优化搜索和标记。
10个帖子/ 0个新
最后发表
matthieuW
离线
最后看到:6个月前2天前
加入:2015-11-20 14:55
QSPI通用部分读/写

我用DA14680在我的定制开发板上工作了很长一段时间,
我正在集成板上迁移到da14681。
然而,我需要验证da14680上的事实,我可以通过qspi接口写入和读取自定义数据到通用部分。

阅读似乎没问题。

nvms_t nvms = ad_nvms_open (NVMS_GENERIC_PART);
Ad_nvms_read (nvms, addr, data, len);

然而,正确的函数并不工作。每次从自定义任务调用它时,写操作不执行,我的任务被挂起。
我尝试启用或禁用dg_config_DISABLE_BACKGROUND_FLASH_OPS参数,结果没有变化。
如何通过QSPI接口执行这样的写入

这是我用flash写的函数

ad_flash_lock ();
nvms_t nvms = ad_nvms_open (NVMS_GENERIC_PART);
Ad_nvms_write (nvms, addr, data, len);
ad_flash_unlock ();

设备:
JK_Dialog
离线
最后看到:4个月前2个星期前
工作人员
加入:2016-08-22 23:07
你好,

你好,

您希望将什么类型的数据写入此分区?如果这是基本的日志数据,你应该使用日志分区:NVMS_LOG_PARTI需要对此进行双重检查,但我不确定使用ad_flash_lock()是否适合写入nvm。

您是否可以尝试打开日志分区并使用ad_nvms_write()来验证这是否正常工作(不使用ad_flash_lock)

/ /乔恩

JK_Dialog
离线
最后看到:4个月前2个星期前
工作人员
加入:2016-08-22 23:07
你好,

你好,

接下来,除了日志分区外,GENERIC分区也可用于用户数据。你能在不用锁的情况下再试一次吗?

/ /乔恩

LT_Dialog(未验证)
嗨matthieuW,

嗨matthieuW,
根据你的描述,应该是死锁。不需要调用ad_flash_lock()和ad_flash_unlock()。当调用ad_nvms_write()时,该保护已经在驱动程序中处理了。

matthieuW
离线
最后看到:6个月前2天前
加入:2015-11-20 14:55
我试着写数据到

我尝试在没有锁定功能的情况下向日志分区写入数据,结果相同。
意思是读取似乎是ok的,我也可以检索分区大小没有问题,
但在进行写操作时,系统会暂停调用write功能的任务,不进行写操作。
我是否应该调用任何其他init或write enable函数?
关于我的数据是位图,它是相当大的,所以我计划使用一个更大的闪存,但现在我只是试图写几个字节。

matthieuW
离线
最后看到:6个月前2天前
加入:2015-11-20 14:55
我查到了密码

我用调试器追踪到程序停止的代码位置:
在qspi auto_autoode文件l 780
If (pm_register_qspi_operation(句柄,addr, buf, &size, &op)) {
/*阻塞直到程序完成*/
OS_TASK_SUSPEND(处理);< = = =
OS_FREE (op);
写=大小;

这有帮助吗?

LT_Dialog(未验证)
嗨matthieuW,

嗨matthieuW,
我可以再和你确认一下你最新的测试代码是吗

nvms_t nvms = ad_nvms_open (NVMS_GENERIC_PART);
Ad_nvms_write (nvms, addr, data, len);

dg_config_DISABLE_BACKGROUND_FLASH_OPS = = 1结果是阴性的?

matthieuW
离线
最后看到:6个月前2天前
加入:2015-11-20 14:55
你好,

你好,
事实上,我启用了禁用后台操作,我设法写入qspi flash。
我刚才一定是弄错了。
谢谢你的支持。

matthieuW
离线
最后看到:6个月前2天前
加入:2015-11-20 14:55
你好,

你好,
我知道能够写应用程序参数的参数部分和一些数据的通用部分。
然而,我有一个问题与通用的部分大小。附件是我的分区描述

然而,当我检索分区大小时,我得到的结果是0x3E00而不是0x1F000。
当我尝试写或读这个分区到0x3e00以上的地址时,我只得到00返回。
我试图删除虚拟分区标签,但没有效果,
我计划在我的最终设计上使用一个更大的闪存,并使用通用部分。
你能帮我吗?
问候
马修

MT_dialog
离线
最后看到:4个月4个星期前
工作人员
加入:2015-06-08 34
嗨matthieW,

嗨matthieW,

当使用VES时,你将不能使用在partition_table.h文件中声明的整个空间,VES驱动程序允许你将闪存的一部分写入任意位置,而不必在同一位置被修改时删除整个扇区。这是通过写入相同用户提供的地址的不同flash位置来实现的。ve驱动提供虚拟寻址,用户指定的地址在读写之前会转换为真实的flash位置地址,因此flash大小分区必须大于用户可见的寻址空间。因此,为了充分利用VES,它保留了8倍的实际地址空间,因此实际地址空间比partition_table.h文件中的地址空间小8倍。

如果您更改分区并删除VES标志,您看到相同的可用空间,这意味着在使用新的分区定义烧制文件之前,您没有擦除闪存,设备也没有创建一个新的分区表,因为已经有一个有效的表。

由于MT_dialog