查看: 7045|回复: 10

[MQX] K64+MQX flash擦除的问题

[复制链接]
  • TA的每日心情

    2019-9-17 13:22
  • 签到天数: 238 天

    连续签到: 1 天

    [LV.7]常住居民III

    30

    主题

    905

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    2251
    最后登录
    2024-10-8
    发表于 2015-5-28 09:05:20 | 显示全部楼层 |阅读模式
    运行环境K64+MQX,运行flash 的demo,出现一个问题,第一次运行能读能写,第二次运行只能读了,不能再写,可能原因,代码中没有擦除flash的操作,问一下,是否是这个原因,flash擦除是怎么操作的。
    我知道答案 目前已有10人回答
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    该用户从未签到

    7

    主题

    196

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    380
    最后登录
    1970-1-1
    发表于 2015-5-28 12:38:05 | 显示全部楼层
    mqx中有个例程的, C:\Freescale\Freescale_MQX_4_2\mqx\examples\flashx , 楼主跑的是这个例程吗
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2019-9-17 13:22
  • 签到天数: 238 天

    连续签到: 1 天

    [LV.7]常住居民III

    30

    主题

    905

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    2251
    最后登录
    2024-10-8
     楼主| 发表于 2015-5-28 13:11:20 | 显示全部楼层
    FSL_TICS_DANIEL 发表于 2015-5-28 12:38
    mqx中有个例程的, C:\Freescale\Freescale_MQX_4_2\mqx\examples\flashx , 楼主跑的是这个例程吗 ...

    恩,对的,问一下,对flash的一些操作函数的应用。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2019-9-17 13:22
  • 签到天数: 238 天

    连续签到: 1 天

    [LV.7]常住居民III

    30

    主题

    905

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    2251
    最后登录
    2024-10-8
     楼主| 发表于 2015-5-28 13:17:08 | 显示全部楼层
    FSL_TICS_DANIEL 发表于 2015-5-28 12:38
    mqx中有个例程的, C:\Freescale\Freescale_MQX_4_2\mqx\examples\flashx , 楼主跑的是这个例程吗 ...

    我在代码flash_file = fopen(FLASH_NAME, NULL);之后加入
    _io_flashx_erase_sector(flash_file);//想测试是否能擦除flash
    结果  就运行到
    if (i == STRING_SIZE) {
          printf("\nBytes are blank.");
    并且再也写不进去了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16702
    最后登录
    1970-1-1
    发表于 2015-5-28 13:34:57 | 显示全部楼层
    楼主代码上上来,看会有更多人帮你看的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2019-9-17 13:22
  • 签到天数: 238 天

    连续签到: 1 天

    [LV.7]常住居民III

    30

    主题

    905

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    2251
    最后登录
    2024-10-8
     楼主| 发表于 2015-5-28 13:42:56 | 显示全部楼层
    lkl0305 发表于 2015-5-28 13:34
    楼主代码上上来,看会有更多人帮你看的

    void flash_task
       (
          uint_32 initial_data
       )
    {
       MQX_FILE_PTR   flash_file;
       _mqx_int       i;
       _mqx_int       len = 0;
       uint_32        ioctl_param;

       _int_install_unexpected_isr();
      
       printf("\n\nMQX Flash Example");

       buffer = (char_ptr)_mem_alloc_zero(BUFFER_SIZE);//啥意思?
       //分配缓存区
       if (buffer == NULL) {
          printf("\nCan't allocate buffer");
          _task_block();
       }

       /* Open the flash device */
       //打开flash,扇区在前面已定义
       flash_file = fopen(FLASH_NAME, NULL);
        //_io_flashx_erase_sector(flash_file);
       //测试是否能擦除flash,加了此句后,直接进入Bytes are blank
       if (flash_file == NULL) {
          printf("\nUnable to open file %s", FLASH_NAME);
          _task_block();
       } else {
          printf("\nFlash file %s opened", FLASH_NAME);
       }

       /* Get the size of the flash file */
       //得到缓存区大小
       fseek(flash_file, 0, IO_SEEK_END);
       printf("\nSize of the flash file: 0x%x Bytes", ftell(flash_file));

       /* Disable sector cache */
       //使能缓存扇区
       ioctl(flash_file, FLASH_IOCTL_ENABLE_SECTOR_CACHE, NULL);
       printf("\nFlash sector cache enabled.");
       /* Move STRING_SIZE Bytes back */
       printf("\nReading last %d Bytes.", STRING_SIZE);
       fseek(flash_file, -STRING_SIZE, IO_SEEK_END);

       len = read(flash_file, buffer, STRING_SIZE);
       //查看read原型
       if (STRING_SIZE != len) {
          printf("\nERROR! Could not read from flash. Exiting...");
          goto example_end;
       }
       for (i = 0; i < STRING_SIZE; i++) {
          if (buffer != (char)0xFF)
             break;
       }
       if (i == STRING_SIZE) {
          printf("\nBytes are blank.");
       }
       else {
          while ((buffer != 0) && (i < STRING_SIZE)) {
             i++;
          }

          if (i == STRING_SIZE) {
             printf("\nFound non-blank data, but not zero-ended string.");
          }
          else {
             printf("\nString found: %s", buffer);
          }
       }

       do {
          printf("\nType a string to be written to the end of file (%d chars max.):", STRING_SIZE-1);
          fgets(buffer, BUFFER_SIZE, stdin);
          len = strlen(buffer);
       } while (!len || len > STRING_SIZE-1);

       /* Move STRING_SIZE Bytes back */
       fseek(flash_file, -STRING_SIZE, IO_SEEK_END);

       /* Unprotecting the the FLASH might be required */
       ioctl_param = 0;//本来是0
       ioctl(flash_file, FLASH_IOCTL_WRITE_PROTECT, &ioctl_param);

       len = write(flash_file, buffer, STRING_SIZE);
       if (len != STRING_SIZE) {
          printf("\nError writing to the file. Error code: %d", _io_ferror(flash_file));
       }
       else {
          printf("\nData written to the flash.\nNow you can power down and power up your device");
          printf("\nand then retry the test to see if the string was written correctly.");
       }

    example_end:
       fclose(flash_file);
       printf("\nFlash example finished.");

       _task_block();
    }
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2019-9-17 13:22
  • 签到天数: 238 天

    连续签到: 1 天

    [LV.7]常住居民III

    30

    主题

    905

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    2251
    最后登录
    2024-10-8
     楼主| 发表于 2015-5-29 14:54:56 | 显示全部楼层
    FSL_TICS_DANIEL 发表于 2015-5-28 12:38
    mqx中有个例程的, C:\Freescale\Freescale_MQX_4_2\mqx\examples\flashx , 楼主跑的是这个例程吗 ...

    现在那个demo的问题是:1当flash是空的时候,能进行读写,如图1所示。2.当flash被写入一个数据后,就再也写不进去了。我查看了一下代码,猜想可能是由于flash在写之前未进行擦除操作导致。
    已尝试ioctl(flash_file, FLASH_IOCTL_ERASE_SECTOR, NULL);ioctl(flash_file, FLASH_IOCTL_ERASE_CHIP, NULL);放置于len = write(flash_file, buffer, STRING_SIZE);都不行。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2019-9-17 13:22
  • 签到天数: 238 天

    连续签到: 1 天

    [LV.7]常住居民III

    30

    主题

    905

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    2251
    最后登录
    2024-10-8
     楼主| 发表于 2015-11-9 15:30:14 | 显示全部楼层
    问题得到解决,需要设置bank的地址  如果选用了bank0 然后尽量从后往前读写
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-9-17 17:18
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    26

    主题

    394

    帖子

    0

    高级会员

    Rank: 4

    积分
    967
    最后登录
    2019-10-9
    发表于 2015-11-12 13:23:29 | 显示全部楼层
    very333 发表于 2015-11-9 15:30
    问题得到解决,需要设置bank的地址  如果选用了bank0 然后尽量从后往前读写

    例程中都是从后往前写,这是一个bug,飞思卡尔的人都没有解决
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2019-9-17 13:22
  • 签到天数: 238 天

    连续签到: 1 天

    [LV.7]常住居民III

    30

    主题

    905

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    2251
    最后登录
    2024-10-8
     楼主| 发表于 2015-11-13 10:51:28 | 显示全部楼层
    darren_liu 发表于 2015-11-12 13:23
    例程中都是从后往前写,这是一个bug,飞思卡尔的人都没有解决

    K64得读写FLASH确实有点问题
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-21 10:52 , Processed in 0.103600 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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