2203597_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2203597_zh-CN

2203597_zh-CN

在 S32K311 中实现写入操作的闪存驱动程序

您好,

我在向pFlash写入数据时遇到了问题,我按照参考手册进行了操作,但我仍然无法写入内存。请帮我解决这个问题。因为时间紧迫。

我还附上了我的代码供你参考。

谢谢!

Re: FLash driver implementation for write operation in S32K311

嗨,丹尼尔


1.我尝试使用参考手册中提到的所有寄存器组合进行解锁,包括:


PFLASH.PFCBLK_SSPELOCK[0].R = 0x00000000U; //闪存块0


PFLASH.PFCBLK_SSPELOCK[1].R = 0x00000000U; //闪存块 1


FLASH.SPELOCK.R = 0x00000000U;


FLASH.SSPELOCK.R = 0x00000000U;


FLASH.XSPELOCK.R = 0x00000000u;


FLASH.XSSPELOCK.R = 0x00000000u;


PFLASH.PFCBLK_SPELOCK[0].R = 0x00000000U;


PFLASH.PFCBLK_SPELOCK[1].R = 0x00000000U;


PFLASH.PFCBLK_SPELOCK[2].R = 0x00000000U;


PFLASH.PFCBLKU_SPELOCK[0].R = 0x00000000U; // UTEST 块锁定


但是,DFlash 始终保持锁定状态,任何擦除/编程尝试都会设置 PES=1。


请您澄清一下:


S32K311 上 D-Flash 块的正确寄存器和寄存器索引。


S32K311 上的 D-Flash 是否需要特殊的解锁机制(UTEST 熔丝、FCCU、生命周期状态等)。


任何显示成功的 D-Flash 解锁 + 写入的参考示例。


2.无法解锁最后 256 KB P-Flash:

即使使用了上述所有寄存器组合,0x004B0000 - 0x004FFFFF位置或以上的任何内容仍会被锁定。

该区域是由不同的锁块(2 号锁块?)控制,还是与 D-Flash 共享?

Re: FLash driver implementation for write operation in S32K311

你好,@emb-enockal

要对从 0x00480008 开始的 8 字节进行编程,你需要在 DATA [2-3] 寄存器中写入数据。

关于锁,我周二之前都不在办公室,现在无法在硬件上进行测试。

我建议你使用 RTD 驱动程序 (C40_Ip) 作为参考。

danielmartynek_0-1763131926248.png


此致,

丹尼尔


Re: FLash driver implementation for write operation in S32K311

嗨,丹尼尔

谢谢你的澄清。

是的,我意识到我试图从我正在编程的同一个 PFlash 块中执行写入功能。将写例程移到另一个块后,它开始工作了。

不过,我有两个后续问题:

  1. pFlash 连续写入
    当我在地址 0x00480000 处写入 8 个字节时,它就会成功。
    但是,如果我尝试在 0x0048000 8 处写入接下来的 8 个字节,操作就会失败。
    写入成功的下一个地址是 128 字节之后

    看起来控制器只允许在 128 字节(四页)边界处进行编程。
    有没有办法在同一个四页中连续编程较小的块(8 字节),或者必须同时写入所有 128 字节?

  2. DFlash 解锁问题
    根据建议,我尝试使用SPELOCK[2]SSPELOCK[2] 解锁 Block_2,但该程序块仍被锁定。
    我还尝试清除模块级和平台级锁定寄存器,但 DFlash 区域仍然无法解锁。

    以下是我尝试的解锁顺序:

    PFLASH.PFCBLK_SSPELOCK[0].R = 0x00000000U; //闪存块0

    PFLASH。pfcblk_sspelock[1].R= 0x00000000U; //闪存块 1

    FLASH.SPELOCK.R = 0x00000000U;

    FLASH.SSPELOCK.R = 0x00000000U;

    FLASH.XSPELOCK.R = 0x00000000u;

    FLASH.XSSPELOCK.R = 0x00000000u;


    能否请您帮助我理解解锁 DFlash Block_2 的正确方法,并确认是否支持在同一四页内连续写入?

    感谢您的帮助。


Re: FLash driver implementation for write operation in S32K311

你好,@emb-enockal

闪存编程代码不得位于正在编程的同一闪存块中。


如果需要对同一闪存块进行编程,请确保将执行代码放在 SRAM 中。


在此示例中,C40_Ip API 位于 SRAM 中:
有关参考,请参阅:https://community.nxp.com/t5/S32K-Knowledge-Base/S32K312-C40-Ip-SRAM-RTD-500-DS35/ta-p/2074245


DFlash 位于 Block_2,由 SPELOCK[2] 和 SSPELOCK[2] 锁定。


此致,

丹尼尔



Re: FLash driver implementation for write operation in S32K311

大家好,

我被 S32K311(48 引脚)的 PFlash/DFlash 编程卡住了。现在,当我在写入函数的末尾设置断点时,我可以对P-Flash 进行编程,但如果我不保留该断点,CPU 就会跳转到反汇编,并且 RWE 标志被设置为 1。

此外,我也无法解锁 D-Flash(所有解锁尝试似乎都被忽略)。请告知。

我观察到的是

  1. 只有当我在写入函数中保留一个断点时,PFlash 写入序列才会完成。如果我移除该断点,CPU 会在写入请求后立即进入反汇编(看起来像是中断/读取故障)。

  2. 尽管写入了以下解锁序列,D-Flash 仍然处于锁定状态:

    PFLASH.PFCBLKU_SPELOCK[0].R = 0x00000000U; /* 清除 UTEST 块锁(已尝试) */

    /* 清除模块锁 */
    FLASH.SPELOCK.R = 0x00000000U;
    FLASH.SSPELOCK.R = 0x00000000U;

    /* 平台级块解锁 */
    PFLASH.PFCBLK_SPELOCK[0].R = 0x00000000U;
    PFLASH.PFCBLK_SSPELOCK[0].R = 0x00000000U;

    还附上了代码供您参考。

Re: FLash driver implementation for write operation in S32K311

你好,@emb-enockal

您能详细介绍一下这些问题吗?

您是否看到任何错误标记?

为了简单起见,我建议从阻断法开始:

danielmartynek_0-1762959571607.png

danielmartynek_1-1762959967169.png


数据寄存器必须与四页面对齐。


您不能从正在编程的程序块中执行代码。


此致,

丹尼尔


Any support, information, and technology (“Materials”) provided by NXP are provided AS IS, without any warranty express or implied, and NXP disclaims all direct and indirect liability and damages in connection with the Material to the maximum extent permitted by the applicable law. 
NXP accepts no liability for any assistance with applications or product design. Materials may only be used in connection with NXP products. Any feedback provided to NXP regarding the Materials may be used by NXP without restriction.

Tags (1)
No ratings
Version history
Last update:
‎11-20-2025 10:03 PM
Updated by: