查看: 3783|回复: 5

[求助] C90TFS FLASH操作问题

[复制链接]

该用户从未签到

16

主题

52

帖子

0

中级会员

Rank: 3Rank: 3

积分
240
最后登录
2017-6-28
发表于 2015-11-14 15:18:08 | 显示全部楼层 |阅读模式
KDS下使用KSDK库操作FLASH,芯片型号MK22FN1M0A,把数据写入FLASH后,读出来都是0x00,
但是读flashSSDConfig.PFlashBase + PFLASH_IFR中的数据是0xFF
参考的是KSDK1.3中的DEMO
#define LAUNCH_CMD_SIZE         0x100
#define CALLBACK_SIZE           0x80
#define TesetBufferSize        4
/* array to copy __Launch_Command func to RAM */
uint16_t __ram_func[LAUNCH_CMD_SIZE/2];
uint16_t __ram_for_callback[CALLBACK_SIZE/2]; /* length of this array depends on total size of the functions need to be copied to RAM*/
uint8 UserFlashWriteBuffer[TesetBufferSize] = {0};
uint8 UserFlashReadBuffer[TesetBufferSize] = {0};
FLASH_SSD_CONFIG flashSSDConfig =
{
        .ftfxRegBase = 1073872896U,
        .PFlashBase  = 0U,
        .PFlashSize  = 1048576U,
        .DFlashBase  = 268435456U,
        .DFlashSize  = 0x00U,
        .EERAMBase   = 335544320U,
        .EEESize     = 0x00U,
        .DebugEnable        = false,
        .CallBack = NULL_CALLBACK,
};
pFLASHCOMMANDSEQUENCE g_FlashLaunchCommand = (pFLASHCOMMANDSEQUENCE)0xFFFFFFFF;

void UserFlash_Callback(void)
{
}
void UserFlash_Init(void)
{
           uint32_t ret;
           uint32_t destination;          /* Address of the target location */
         uint32_t size;
         uint32_t end;
         uint8_t  securityStatus;
         uint16_t number;
         uint32_t margin_read_level;
         uint32_t i, FailAddr;
          
         FlashInit(&flashSSDConfig);
        /**************************************************************************
          * Set CallBack to callback function
        ***************************************************************************/
        flashSSDConfig.CallBack = (PCALLBACK)RelocateFunction((uint32_t)__ram_for_callback , CALLBACK_SIZE , (uint32_t)UserFlash_Callback);
        g_FlashLaunchCommand = (pFLASHCOMMANDSEQUENCE)RelocateFunction((uint32_t)__ram_func , LAUNCH_CMD_SIZE ,(uint32_t)FlashCommandSequence);

        destination = flashSSDConfig.PFlashBase + (flashSSDConfig.PFlashSize - FTFx_PSECTOR_SIZE);
    //ERASE
        size = FTFx_PSECTOR_SIZE;
        ret = FlashEraseSector(&flashSSDConfig, destination, size, g_FlashLaunchCommand);
        if (FTFx_OK != ret)
        {
                printf("Erase Error\n");
        }
        else
        {
                printf("Erase OK\n");
        }
        /* Verify section for several sector of PFLASH */
        number = FTFx_PSECTOR_SIZE/FSL_FEATURE_FLASH_PFLASH_SECTION_CMD_ADDRESS_ALIGMENT;
        for(margin_read_level = 0; margin_read_level < 0x2; margin_read_level++)
        {
                ret = FlashVerifySection(&flashSSDConfig, destination, number, margin_read_level, g_FlashLaunchCommand);
                if (FTFx_OK != ret)
                {
                        printf("Check Error\n");
                }
        }
        //Get secuity state
        securityStatus = 0x0;
        ret = FlashGetSecurityState(&flashSSDConfig, &securityStatus);       
        switch(securityStatus)
    {
      case FLASH_NOT_SECURE:
      default:
          printf("\r\n\r\n---->Flash is UNSECURE!");
          break;
      case FLASH_SECURE_BACKDOOR_ENABLED:
          printf("\r\n\r\n---->Flash is SECURE, BACKDOOR is ENABLED!");
          break;
      case FLASH_SECURE_BACKDOOR_DISABLED:
            printf("\r\n\r\n---->Flash is SECURE, BACKDOOR is DISABLED!");
            break;
    }
       
        /* Read on P-Flash */
        destination = flashSSDConfig.PFlashBase + 0xC0;//PFLASH_IFR; /* Start address of Program Once Field */
        ret = FlashReadResource(&flashSSDConfig, destination, UserFlashReadBuffer, 0x0, g_FlashLaunchCommand);

        //write
        destination = flashSSDConfig.PFlashBase + (flashSSDConfig.PFlashSize - FTFx_PSECTOR_SIZE);
        ret = FlashReadResource(&flashSSDConfig, destination, UserFlashReadBuffer, 0x0, g_FlashLaunchCommand);//结果是是0XFF
         
        for(i=0; i<TesetBufferSize; i++)
        {
                UserFlashWriteBuffer[i] = i;       
        }
        size = TesetBufferSize;
        ret = FlashProgram(&flashSSDConfig, destination, size, UserFlashWriteBuffer, g_FlashLaunchCommand);
        if (FTFx_OK != ret)
        {
                printf("Program Error\n");
        }
        //read
        FlashReadResource(&flashSSDConfig, destination, UserFlashReadBuffer, 0, g_FlashLaunchCommand);//结果全是0X00,应该是0,1,2,3
        printf("End");
        while(1);
}


我知道答案 目前已有5人回答
回复

使用道具 举报

该用户从未签到

16

主题

52

帖子

0

中级会员

Rank: 3Rank: 3

积分
240
最后登录
2017-6-28
 楼主| 发表于 2015-11-16 09:31:29 | 显示全部楼层
没人回答,如何是好
回复 支持 反对

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2015-11-16 14:02:34 | 显示全部楼层
KSDK1.2中是有Flash driver的对应例程的。
~\KSDK_1.2.0\examples\frdmk22f\driver_examples\flash
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

52

帖子

0

中级会员

Rank: 3Rank: 3

积分
240
最后登录
2017-6-28
 楼主| 发表于 2015-11-16 14:55:56 | 显示全部楼层
FSL_TICS_ZP 发表于 2015-11-16 14:02
KSDK1.2中是有Flash driver的对应例程的。
~\KSDK_1.2.0\examples\frdmk22f\driver_examples\flash ...

我就是根据KSDK1.3中的这个例程写的,例程里面只是把数据写进去了,没有读出来。
我调用这个函数去读ret = FlashReadResource(&flashSSDConfig, destination, UserFlashReadBuffer, 0, g_FlashLaunchCommand);
操作失败,返回FTFx_ERR_ACCERR
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

32

帖子

0

注册会员

Rank: 2

积分
85
最后登录
2015-11-29
发表于 2015-11-16 16:14:05 | 显示全部楼层
这个,还是看你的啦
回复 支持 反对

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2015-11-16 17:12:26 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-26 19:13 , Processed in 0.095428 second(s), 25 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表