打印
[Kinetis]

MK60FX512VLQ15使用EEPROM直接死机,读取正确,写入就死

[复制链接]
1371|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lanxuedao|  楼主 | 2015-11-2 09:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我按照网上K40的移植的,函数入下,求解答
/* ###################################################################
**     Filename    : flexram_eeprom.c
**     Project     :
**     Processor   : MK60FX512VLQ15
**     Version     : Driver 01.01
**     Compiler    : GNU C Compiler
**     Date/Time   : 2015-2-27, 9:55, # CodeGen: 0
**     Abstract    :
**         
**         This module contains user's application code.
**     Settings    :
**     Contents    :
**         No public methods
**
** ###################################################################*/
  
/* MODULE flexram_eeprom */

/* Including needed modules to compile this module/procedure */
#include "uart.h"
#include <stdint.h>
#include "common.h"
#include "core_cm4.h"
#include "flexram_eeprom.h"
//
//SIM_FCFG1[EEPROM]¶ÁÈ¡µ±Ç°EEPROMµÄ´óС
//SIM_FCFG1[DEPART]¶ÁÈ¡µ±Ç°backupµÄ´óС
//
/* User includes (#include below this line is not maintained by Processor Expert) */


/*
** ###################################################################
**º¯ÊýÃû³Æ£ºPartition_flash
**º¯Êý¹¦ÄÜ£ºÊµÏÖEEPROMµÄ·ÖÇø     
**¾ÙÀý£º  Partition_flash( 0X30, 0X07) £» //0X30:16kEEPROM 0X07:512k BACK, 0k Data flash size
**
** ###################################################################
*/
unsigned char Partition_flash(int eeprom_size, int dflash_size)
{
      /* Test to make sure the device is not already partitioned. If it
       * is already partitioned, then return with no action performed.
       */
            
      if ((SIM->FCFG1 & SIM_FCFG1_DEPART(0xF)) != 0x00000F00)//²é¿´Flex_NVMÊÇ·ñÒѾ­·ÖÇø£¬Èç¹ûûÓзÖÇø£¬ÔòÓèÒÔ·ÖÇø£¬Èç¹ûÒѾ­·ÖÇø£¬Ôò²»ÔÙ·ÖÇø¡£
                                {                                               //07´ú±íÁËDflashÓëEEPROMµÄ·ÖÅä±ÈÀýΪ0:512£¬Óëdflash_size±ØÐëÒ»Ö£¬·ñÔò±¨´í¡£
          printf("\nDevice is already partitioned.\n");
          return 1;
      }
      /* Write the FCCOB registers */
               
      FTFE->FCCOB0 = FTFE_FCCOB0_CCOBn(0x80); // Selects the PGMPART command,0X80±à³ÌeepromÃüÁî
      FTFE->FCCOB1 = 0x00;
      FTFE->FCCOB2 = 0x00;
      FTFE->FCCOB3 = 0x00;
      /* FCCOB4 is written with the code for the subsystem sizes (eeprom_size define) */
      FTFE->FCCOB4 = eeprom_size;
      /* FFCOB5 is written with the code for the Dflash size (dflash_size define) */
      FTFE->FCCOB5 = dflash_size;
      /* All required FCCOBx registers are written, so launch the command */
      FTFE->FSTAT = FTFE_FSTAT_CCIF_MASK;//¸øCCIF±ê־λд1-¼´Çå³ýCCIF±ê־룬´Ó¶øÆô¶¯ÃüÁî
      /* Wait for the command to complete */
      while(!(FTFE->FSTAT & FTFE_FSTAT_CCIF_MASK));//FTFE_FSTATµÄCCIFλÔÚÃüÁîÖ´ÐÐÆÚ¼äʼÖÕ±£³ÖΪ0£¬Ö±µ½ÃüÁîÖ´ÐÐÍê³É²Å±äΪ1£¬µÈ´ýÃüÁî´«ÊäÍê³É
                                FTFE->FCCOB0 = FTFE_FCCOB0_CCOBn(0x81); // Selects the PGMPART command,0X80±à³ÌeepromÃüÁî
      FTFE->FCCOB1 = 0xff;
                        FTFE->FSTAT = FTFE_FSTAT_CCIF_MASK;//¸øCCIF±ê־λд1-¼´Çå³ýCCIF±ê־룬´Ó¶øÆô¶¯ÃüÁî
      /* Wait for the command to complete */
      while(!(FTFE->FSTAT & FTFE_FSTAT_CCIF_MASK));//FTFE_FSTATµÄCCIFλÔÚÃüÁîÖ´ÐÐÆÚ¼äʼÖÕ±£³ÖΪ0£¬Ö±µ½ÃüÁîÖ´ÐÐÍê³É²Å±äΪ1£¬µÈ´ýÃüÁî´«ÊäÍê³É
      return 0;
}

/*
** ###################################################################
**º¯ÊýÃû³Æ£ºEepromRead_16bit
**º¯Êý¹¦ÄÜ£º°´16bit×Ö¶ÁÈ¡EEPROM Êý¾Ý   
**¾ÙÀý£ºEepromRead_16bit(1)£» ¶ÁÈ¡µØַΪ1µÄλÖÃÊý¾Ý×Ö
**×¢Ò⣺ addr<16384,max eeprom = 16K   
** ###################################################################
*/
unsigned int EepromRead_16bit(unsigned int addr)//addr<16384,max eeprom = 16K
{
   
        //while(!(FTFE->FCNFG & FTFE_FCNFG_EEERDY_MASK))//Ö»ÓÐEEERDY=1µÄʱºò²ÅÄܶÁдEEPROM
//  {
        // }
        return *((unsigned int*)(0x14000000+addr));
}
/*
** ###################################################################
**º¯ÊýÃû³Æ£ºEepromWrite_16bit
**º¯Êý¹¦ÄÜ£º°´16bit×ÖдEEPROM Êý¾Ý   
**¾ÙÀý£ºEepromWrite_16bit(1£¬0x8899)£» ÏòµØÖ·1дÈë0x8899
**×¢Ò⣺ addr<16384,max eeprom = 16K   
** ###################################################################
*/
unsigned char EepromWrite_16bit(unsigned int addr, unsigned int data)//addr<16384,max eeprom = 16K
{
    if(addr >= EEPROM_SIZE)
        return 1;               
               
   //while(!(FTFE->FCNFG & FTFE_FCNFG_EEERDY_MASK)){}//Ö»ÓÐEEERDY=1µÄʱºò²ÅÄܶÁдEEPROM  
     *((unsigned int*)(0x14000000+addr)) = data;
                return 0;
}
/*
** ###################################################################
**º¯ÊýÃû³Æ£ºEeprom_Erase
**º¯Êý¹¦ÄÜ£º²Á³ý16KµÄEEPROMËùÓÐÊý¾Ý£¬²Á³ýºóÊý¾Ýλ0  
**¾ÙÀý£ºEeprom_Erase()£»
**×¢Ò⣺
** ###################################################################
*/
unsigned char Eeprom_Erase(void)
{
        unsigned int addr;
        for(addr=0;addr<EEPROM_SIZE;addr++)
  {
                *((unsigned int*)(0x14000000+addr)) = 0x0000;
                 while(!(FTFE->FCNFG & FTFE_FCNFG_EEERDY_MASK))//Ö»ÓÐEEERDY=1µÄʱºò²ÅÄܶÁдEEPROM
                 {
                 }
   
   
        }
        return 0;
}
/*
** ###################################################################
**º¯ÊýÃû³Æ£ºEeprom_init
**º¯Êý¹¦ÄÜ£º³õʼ»¯EEPROM²ÎÊý£¬ÉèÖÃÏà¹Ø²ÎÊý£¬µ±Ç°É趨Ϊ16KµÄEEPROM£¬512K backup Dflash
**¾ÙÀý£ºEeprom_init()£»
**×¢Ò⣺ ³õʼ»¯²ÎÊý¿É¸ù¾ÝÊÖ²áµ÷Õû£¬Ä¿Ç°ÊÇ×î´óÖµ£»
** ###################################################################
*/
unsigned char Eeprom_init(void)
{
//ʹÄÜARMÄÚºËÏà¹Ø¹ÊÕÏ´¦Àí¼Ä´æÆ÷
        SCB->SHCSR|=(SCB_SHCSR_BUSFAULTENA_Msk|SCB_SHCSR_MEMFAULTENA_Msk|SCB_SHCSR_USGFAULTENA_Msk);
  /* Partition the memory to enable FlexMem mode */
if ( Partition_flash( 0x30, 0x06) )//0X30:16kEEPROM 0X07:512k BACK, 0k Data flash size
         {
                return 0;
         }
else
        return 1;         
}

/*
** ###################################################################
**
**     This file was created by keil v5
**     for the Freescale MK60FX512VLQ12 MCU.
**
** ###################################################################
*/







。h
如下


/* ###################################################################
**     Filename    : flexram_eeprom.h
**     Project     :
**     Processor   : MK60FX512VLQ12
**     Version     : Driver 01.01
**     Compiler    : GNU C Compiler
**     Date/Time   : 2015-2-27, 15:40, # CodeGen: 0
**     Abstract    :
**         
**         This module contains user's application code.
**     Settings    :
**     Contents    :
**         No public methods
**
** ###################################################################*/
/*!
** @file flexram_eeprom.h
** @version 01.01
** @brief
**         
**         This module contains user's application code.
*/         
/*!
**  @addtogroup ProcessorExpert_module ProcessorExpert module documentation
**  @{
*/         
/* MODULE flexram_eeprom */


/* Including needed modules to compile this module/procedure */
#include "uart.h"
#include <stdint.h>
#include "common.h"
#include "core_cm4.h"

#define LONGWORD_COUNTER_ADDR 0x14000000
#define WORD_COUNTER_ADDR 0x14000004
#define BYTE_COUNTER_ADDR 0x14000006
#define EEPROM_SIZE  16384   //0X14000000-0X17fffFFF,ALL 16KB
/**********************************************************************/
//EEPROM API
/**********************************************************************/

unsigned char Partition_flash(int eeprom_size, int dflash_size);
unsigned int EepromRead_16bit(unsigned int addr);
unsigned char Eeprom_Erase(void);
unsigned char Eeprom_init(void);
unsigned char EepromWrite_16bit(unsigned int addr, unsigned int data);

相关帖子

沙发
lanxuedao|  楼主 | 2015-11-2 09:50 | 只看该作者
单个写入测试写入地址为0x10,写的数据时0xaaaa,读回来地址却是在第15个字节处开始 AA FF AA AA 00 AA 00 00,很多地址一旦写入mcu就死了,无法操作,必须重新刷程序,感觉是地址非法操作导致的系统错误

使用特权

评论回复
板凳
lanxuedao|  楼主 | 2015-11-2 10:48 | 只看该作者
论坛没人用K60的EEPROM吗,第三次用K60做东西,前面用串口,spi,flexbus,现在除了以太网和eeprom,以及USB外其他都基本搞通了,

使用特权

评论回复
地板
FSL_TICS_ZJJ| | 2015-11-2 13:49 | 只看该作者
楼主你好!
操作flash需要注意几点:
1,执行flash命令之前,关掉总时钟,否则在flash操作的时候,一旦中断产生,就会出问题。
2.flash操作命令的代码需要放到RAM执行。
你查看下,你这两点有没有做到,另外就是参考RM手册,看你的分区指令是否是对的。

使用特权

评论回复
5
lanxuedao|  楼主 | 2015-11-4 09:25 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-11-2 13:49
楼主你好!
操作flash需要注意几点:
1,执行flash命令之前,关掉总时钟,否则在flash操作的时候,一旦中断 ...

感谢回答,这是一个思路,我查看下手册,你说的2.flash操作命令的代码需要放到RAM执行,怎么回事

使用特权

评论回复
6
FSL_TICS_ZJJ| | 2015-11-4 09:39 | 只看该作者
lanxuedao 发表于 2015-11-4 09:25
感谢回答,这是一个思路,我查看下手册,你说的2.flash操作命令的代码需要放到RAM执行,怎么回事 ...

也就是写完FTFE_FCCOBn寄存器之后,需要清除CCIF并且等待flash操作完成的那段代码,一般会直接写成一个函数,然后把这个函数放到RAM运行。

使用特权

评论回复
7
lanxuedao|  楼主 | 2015-11-4 09:47 | 只看该作者
找到问题了,感谢你的提示,我把测试代码写在了串口中断中,一发命令就出错,就是中断影响了flash操作,我串口发送和接收中断都开了,放到循环中,关闭原有GPIO中断,再开中断就没问题,已经困惑好几天了,突然就这么解决了,伤脑子了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

21

帖子

1

粉丝