This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320F28379D:在 EEPROM 仿真实现中、复位/断电周期代码不起作用。

Guru**** 2539500 points
Other Parts Discussed in Thread: C2000WARE, UNIFLASH

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/955891/ccs-tms320f28379d-reset-power-off-cycle-code-is-not-works-in-eeprom-emulation-implementation

器件型号:TMS320F28379D
主题中讨论的其他器件:C2000WAREUNIFLASH

工具/软件:Code Composer Studio

您好!

   我已经完成了闪存扇区 B 的 EEPROM 仿真。我现在可以写入/读取,但代码在调试模式下运行。 当我复位/关闭 LaunchPad 时、它不起作用。

已执行闪烁代码以确认存储器上的数据保留... 在调试模式下工作正常... 重置,关闭/on 电源,运行->加载方法不起作用...

run-->加载 不起作用。

Debug->Debug As Works

我的调试配置设置

闪存设置


 


 


代码:


//######################################################################################################################
//
//包含的文件
//

#include "F28x_Project.h"
#include
#include "flash_programming_c28.h"//闪存 API 示例头文件
#include "F021_F2837xD_C28x.h"
#include"EEPROM.h"
#include"Memcopy.h"
#include"stdio.h"

//
//定义
//
#define words _in_flash_buffer   0xFF //编程数据缓冲区、字

#ifdef __TI_Compiler_version__
   #if __TI_Compiler_version__>=15009000
       #define ramFunc 部分".TI.ramfunc"
   其他
       #define ramFunc 段"ramfuncs "
   #endif
#endif
//
// Pragma
//
 #pragma CODE_SECTION (EEPROM_Erase、"ramfuncs");
 #pragma CODE_SECTION (EEPROM_Write、"ramfuncs");
 #pragma CODE_SECTION (EEPROM_UpdateBankStatus、"ramfuncs");
 #pragma CODE_SECTION (EEPROM_UpdatePageStatus、"ramfuncs");
 #pragma CODE_SECTION (EEPROM_ProgramSingleByte、"ramfuncs");
 #pragma DATA_SECTION (READ_Buffer、"BufferDataSection");

//
// LED
//
 #define Blinky_LED_GPIO   31.

//
//全局
//

uint16_t 数据;
bool 标志;
int read_Buffer[64]={0};


//
//函数原型
//
void Example_Error (Fapi_StatusType 状态);
void example_done (void);
//
//主函
//
void main (void)
  {

   InitSysCtrl();
   InitGpio(); //针对此示例跳过
   GPIO_SetupPinMux (Blinky_LED_GPIO、GPIO_MUX_CPU1、0);
   GPIO_SetupPinOptions (Blinky_LED_GPIO、GPIO_output、GPIO_PushPull);

   InitPieCtrl();
   IER = 0x0000;
   IFR = 0x0000;
   InitPieVectTable();
  //memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
   Memcopy (&RamfuncsLoadStart、&RamfuncsLoadEnd、&RamfuncsRunStart);
   initeeprom();
   // 步骤5. 用户特定代码:

   //将闪存 API 函数复制到 SARAM

   Memcopy (&Flash28_API_LoadStart、&Flash28_API_LoadEnd、&Flash28_API_RunStart);
   SeizeFlashPump();


//
//跳转到 RAM 并调用闪存 API 函数
//
     int j=0;
  // EEPROM_GetSinglePointer (1);
      数据= 1;
      RESET_BANK_POINTER;    //重置组指针以启用搜索当前组
      RESET_PAGE_POINTER;    //重置页指针以启用搜索当前页
         //  EEPROM_ProgramSingleByte (data);
      flag=1;

   while (1)
   {




       if (flag=1&&(* Bank_Pointer)=0xFFFF)//加电后 设置 flag=1
       {
       EEPROM_Write (7);
       for (j=0;j<10;j++);
       }
       if (flag==1)
       {
       Read_Buffer[0]= EEPROM_Read ();  //读取闪存
      flag=0;
      ReleaseFlashPump();
       }
          if (Read_Buffer[0]=7)
      {


              GPIO_WritePin (Blinky_LED_GPIO、0);
              DELAY_US (1000*500);
              GPIO_WritePin (Blinky_LED_GPIO、1);
              DELAY_US (1000*500);
      }


   }








//
// example_done -对于此示例,完成后,只需在此处停止即可
//
#pragma CODE_SECTION (example_done、ramFuncSection);
void example_done (void)(空)

   _asm ("   ESTOP0");


//
//文件结束
//

命令文件 将 闪存作为引导模式:


存储器

第0页:   /*程序内存*/
          /*内存(RAM/FLASH/OTP)块可移动到第1页进行数据分配*/
    /*本地共享内存--可由本地 CPU 及其 CLA 使用*/
      /* begin 用于"引导至 SARAM"引导加载程序模式  */

  开始             :origin = 0x080000,length = 0x000002
  RAMM0             :origin = 0x000080,length = 0x000380
  RAMD0             :origin = 0x00B000、length = 0x000800
  RAMLS03         :origin = 0x008000、length = 0x002000
/*   RAMLS1         :origin = 0x008800,length = 0x000800
   RAMLS2         :origin = 0x009000,length = 0x000800
   RAMLS3         :origin = 0x009800、length = 0x000800 *
  RAMLS4           :origin = 0x00A000,length = 0x000800
  RAMGS14         :origin = 0x01A000,length = 0x001000    //*仅在 F28379D/_、F28377D/F28377S、F28375D/F28375S 器件上可用。 移除其他设备上的线路。 *
  RAMGS15         :origin = 0x01B000,length = 0x000FF8    //*仅在 F28379D/_、F28377D/F28377S、F28375D/F28375S 器件上可用。 移除其他设备上的线路。 *

//  RAMGS15_RSVD    :origin = 0x01BFF8,length = 0x000008   //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:超出有效内存的预取)来保留代码且不用于代码*/

  复位            :origin = 0x3FFFC0,length = 0x000002

   /*闪存扇区*/
  FLASHA          :origin = 0x080002,length = 0x001FFE   /*片上闪存*/
  FLASHB          :origin = 0x082000、length = 0x002000   //片上闪存*
  FLASHC          :origin = 0x084000,length = 0x002000   //片上闪存*/
  FLASHD          :origin = 0x086000、length = 0x002000   //片上闪存*/
  FLASHE          :origin = 0x088000、length = 0x008000   //片上闪存*/
  FLASHF          :origin = 0x090000,length = 0x008000   //片上闪存*
  FLASHG          :origin = 0x098000、length = 0x008000   //片上闪存*/
  FLASHH          :origin = 0x0A0000,length = 0x008000   //片上闪存*/
  FLASHI          :origin = 0x0A8000、length = 0x008000   //片上闪存*/
  FLASHJ          :origin = 0x0B0000,length = 0x008000   //片上闪存*/
  FLASHK          :origin = 0x0B8000、length = 0x002000   //片上闪存*/
  FLASHL          :origin = 0x0BA000、length = 0x002000   //片上闪存*/
  FLASHM          :origin = 0x0BC000、length = 0x002000   //片上闪存*/
  FLASHN          :origin = 0x0BE000、length = 0x001FF0   /*片上闪存*/

//  FLASHN_RSVD    :origin = 0x0BFFF0,length = 0x000010   //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:有效内存之外的预取)来保留代码,不要将其用于代码*/


第1页:

  BOOT_RSVD      :origin = 0x000002,length = 0x00007E    // M0的一部分,引导 ROM 将此用于栈*/
  RAMM1          :origin = 0x000400,length = 0x0003F8    //片上 RAM 块 M1 */
//  RAMM1_RSVD     :origin = 0x0007F8,length = 0x000008    //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:超出有效内存的预取),保留并不用于代码*/
  RAMD1          :origin = 0x00B800,length = 0x000800


  RAMLS5         :origin = 0x00A800,length = 0x000800

  RAMGS0         :origin = 0x00C000、length = 0x001000
  RAMGS1         :origin = 0x00D000、length = 0x001000
  CPU2TOCPU1RAM  :origin = 0x03F800,length = 0x000400
  CPU1TOCPU2RAM  :origin = 0x03FC00,length = 0x000400




部分


  /*分配计划领域:*/
  .cinit             :> FLASHD     PAGE = 0
  .pinit             :> FLASHD,    page = 0
  .text              :>> FLASHD | FLASHE     PAGE = 0
  codestart          :> begin   page = 0

#ifdef __TI_Compiler_version__
   #if __TI_Compiler_version__>=15009000
       组
       {



           .TI.ramfunc
           {
           l F021_API_F2837xD_FPU32.lib}

            }
       负载= FLASHD、
         运行 = RAMLS03、
         load_start (_RamfuncsLoadStart)、
         load_size (_RamfuncsLoadSize)、
         load_end (_RamfuncsLoadEnd)、
         run_start (_RamfuncsRunStart)、
         run_size (_RamfuncsRunSize)、
         run_end (_RamfuncsRunEnd)、
         PAGE = 0


          Flash28_API:
                     负载= FLASHD、
                      运行= RAMLS03、
                      Load_start (_Flash28_API_LoadStart)、
                      Load_End (_Flash28_API_LoadEnd)、
                      RUN_START (_Flash28_API_RunStart)、
                      PAGE = 0
   其他
       组
       {
           ramfuncs
           {-l F021_API_F2837xD_FPU32.lib}

       }负载= FLASHD,
         运行 = RAMLS03、
         load_start (_RamfuncsLoadStart)、
         load_size (_RamfuncsLoadSize)、
         load_end (_RamfuncsLoadEnd)、
         run_start (_RamfuncsRunStart)、
         run_size (_RamfuncsRunSize)、
         run_end (_RamfuncsRunEnd)、
         PAGE = 0


         Flash28_API:
                     负载= FLASHD、
                      运行= RAMLS03、
                      Load_start (_Flash28_API_LoadStart)、
                      Load_End (_Flash28_API_LoadEnd)、
                      RUN_START (_Flash28_API_RunStart)、
                      PAGE = 0
   #endif
#endif



  /*分配未初始化的数据段:*/
  .stack             :>RAMM1      page = 1.
  .ebss              :> RAMLS5      PAGE = 1.
  .esysmem           :> RAMLS5      PAGE = 1.

  /*初始化段进入闪存*/
  econst            :>> FLASHF | FLASHG      PAGE = 0
  .switch            :> FLASHD     PAGE = 0

  .reset          :> reset,    page = 0,type = DSECT //未使用,*/

  SHARERAMGS0      :> RAMGS0,      PAGE = 1
  SHARERAMGS1      :>RAMGS1,      PAGE = 1.

  /*闪存编程缓冲器*/
  BufferDataSection:>RAMD1,PAGE = 1,ALIG(8)
  
  /*使用 IPC API 驱动程序时需要以下部分定义*/
   组:> CPU2TOCPU1RAM,PAGE = 1
   {
       PUTBUFFER
       PUTWRITEIDX
       GETREADIDX
   }

   组:> CPU1TOCPU2RAM,PAGE = 1
   {
       GETBUFFER:   TYPE = DSECT
       GETWRITEIDX: TYPE = DSECT
       PUTREADIDX:  TYPE = DSECT
   }  



/*
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//文件结束。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
*

完成了独立工作的步骤:

已禁用.asm 文件中的看门狗计时器

符号管理中添加了 CODE_START 作为入口点

帮助我找到解决方案,为什么代码在复位/断电/运行模式时不起作用,以及所有...

在重置/重启/运行后->加载 Launchpad 上的蓝色 LED 指示灯始终亮起。



此致、(&H)

Rani

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rani、

    您包含了如下所示的 F2837xD API 库(这很好):  

        .TI.ramfunc
               {
               l F021_API_F2837xD_FPU32.lib}

          }

    为什么在下面再次显示?  这是不需要的。

          Flash28_API:
                         负载= FLASHD、
                          运行= RAMLS03、
                          Load_start (_Flash28_API_LoadStart)、
                          Load_End (_Flash28_API_LoadEnd)、
                          RUN_START (_Flash28_API_RunStart)、
                          PAGE = 0

     

    此外、请按如下方式更换内存范围(取自 C2000Ware_3_03_00_00\device_support\f2837xd\con\cmd):  

      RAMM0       :origin = 0x000123,length = 0x0002DD

      BOOT_RSVD    :origin = 0x000002,length = 0x000121   // M0的一部分,引导 ROM 将此用于栈*/

     

    谢谢、此致、

    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rani、

    InitSysCtrl()已调用 memcpy()。  您为什么再次致电?  您是否在预定义符号中定义了_FLASH?

    在 InitSysCtrl()中的代码片段下:

    #ifdef _flash
    //
    //将时间关键代码和闪存设置代码复制到 RAM。 这包括
    //以下函数:InitFlash()
    //
    // RamfuncsLoadStart、RamfuncsLoadSize 和 RamfuncsRunStart
    //符号由链接器创建。 请参阅器件.cmd 文件。
    //
    memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);

    //
    //调用闪存初始化以设置闪存等待状态。 此函数必须执行的操作
    //驻留在 RAM 中。
    //
    InitFlash();
    #endif

     

    谢谢、此致、
    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Vamsi、

      非常感谢。 在遵循您的指导后,我的一个故障现已得到纠正,假设运行-->负载条件正常... 对于复位和下电上电、其不起作用。

    新的.cmd 文件:

    存储器

    第0页:   /*程序内存*/
              /*内存(RAM/FLASH/OTP)块可移动到第1页进行数据分配*/
        /*本地共享内存--可由本地 CPU 及其 CLA 使用*/
          /* begin 用于"引导至 SARAM"引导加载程序模式  */

      开始             :origin = 0x080000,length = 0x000002
      RAMM0           :origin = 0x000123,length = 0x0002DD
     // RAMM0             :origin = 0x000080,length = 0x000380
      RAMD0             :origin = 0x00B000、length = 0x000800
      RAMLS03         :origin = 0x008000、length = 0x002000
    /*   RAMLS1         :origin = 0x008800,length = 0x000800
       RAMLS2         :origin = 0x009000,length = 0x000800
       RAMLS3         :origin = 0x009800、length = 0x000800 *
      RAMLS4           :origin = 0x00A000,length = 0x000800
      RAMGS14         :origin = 0x01A000,length = 0x001000    //*仅在 F28379D/_、F28377D/F28377S、F28375D/F28375S 器件上可用。 移除其他设备上的线路。 *
      RAMGS15         :origin = 0x01B000,length = 0x000FF8    //*仅在 F28379D/_、F28377D/F28377S、F28375D/F28375S 器件上可用。 移除其他设备上的线路。 *

    //  RAMGS15_RSVD    :origin = 0x01BFF8,length = 0x000008   //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:超出有效内存的预取)来保留代码且不用于代码*/

      复位            :origin = 0x3FFFC0,length = 0x000002

       /*闪存扇区*/
      FLASHA          :origin = 0x080002,length = 0x001FFE   /*片上闪存*/
      FLASHB          :origin = 0x082000、length = 0x002000   //片上闪存*
      FLASHC          :origin = 0x084000,length = 0x002000   //片上闪存*/
      FLASHD          :origin = 0x086000、length = 0x002000   //片上闪存*/
      FLASHE          :origin = 0x088000、length = 0x008000   //片上闪存*/
      FLASHF          :origin = 0x090000,length = 0x008000   //片上闪存*
      FLASHG          :origin = 0x098000、length = 0x008000   //片上闪存*/
      FLASHH          :origin = 0x0A0000,length = 0x008000   //片上闪存*/
      FLASHI          :origin = 0x0A8000、length = 0x008000   //片上闪存*/
      FLASHJ          :origin = 0x0B0000,length = 0x008000   //片上闪存*/
      FLASHK          :origin = 0x0B8000、length = 0x002000   //片上闪存*/
      FLASHL          :origin = 0x0BA000、length = 0x002000   //片上闪存*/
      FLASHM          :origin = 0x0BC000、length = 0x002000   //片上闪存*/
      FLASHN          :origin = 0x0BE000、length = 0x001FF0   /*片上闪存*/

    //  FLASHN_RSVD    :origin = 0x0BFFF0,length = 0x000010   //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:有效内存之外的预取)来保留代码,不要将其用于代码*/


    第1页:

     // boot_RSVD      :origin = 0x000002,length = 0x00007E    // M0的一部分,引导 ROM 将使用此栈*/
      BOOT_RSVD      :origin = 0x000002,length = 0x000121
      RAMM1          :origin = 0x000400,length = 0x0003F8    //片上 RAM 块 M1 */
    //  RAMM1_RSVD     :origin = 0x0007F8,length = 0x000008    //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:超出有效内存的预取),保留并不用于代码*/
      RAMD1          :origin = 0x00B800,length = 0x000800


      RAMLS5         :origin = 0x00A800,length = 0x000800

      RAMGS0         :origin = 0x00C000、length = 0x001000
      RAMGS1         :origin = 0x00D000、length = 0x001000
      CPU2TOCPU1RAM  :origin = 0x03F800,length = 0x000400
      CPU1TOCPU2RAM  :origin = 0x03FC00,length = 0x000400




    部分


      /*分配计划领域:*/
      .cinit             :> FLASHD     PAGE = 0
      .pinit             :> FLASHD,    page = 0
      .text              :>> FLASHD | FLASHE     PAGE = 0
      codestart          :> begin   page = 0

    #ifdef __TI_Compiler_version__
       #if __TI_Compiler_version__>=15009000
           组
           {



               .TI.ramfunc
               {
               l F021_API_F2837xD_FPU32.lib}

                }
           负载= FLASHD、
             运行 = RAMLS03、
             load_start (_RamfuncsLoadStart)、
             load_size (_RamfuncsLoadSize)、
             load_end (_RamfuncsLoadEnd)、
             run_start (_RamfuncsRunStart)、
             run_size (_RamfuncsRunSize)、
             run_end (_RamfuncsRunEnd)、
             PAGE = 0

       其他
           组
           {
               ramfuncs
               {-l F021_API_F2837xD_FPU32.lib}

           }负载= FLASHD,
             运行 = RAMLS03、
             load_start (_RamfuncsLoadStart)、
             load_size (_RamfuncsLoadSize)、
             load_end (_RamfuncsLoadEnd)、
             run_start (_RamfuncsRunStart)、
             run_size (_RamfuncsRunSize)、
             run_end (_RamfuncsRunEnd)、
             PAGE = 0


            
       #endif
    #endif



      /*分配未初始化的数据段:*/
      .stack             :>RAMM1      page = 1.
      .ebss              :> RAMLS5      PAGE = 1.
      .esysmem           :> RAMLS5      PAGE = 1.

      /*初始化段进入闪存*/
      econst            :>> FLASHF | FLASHG      PAGE = 0
      .switch            :> FLASHD     PAGE = 0

      .reset          :> reset,    page = 0,type = DSECT //未使用,*/

      SHARERAMGS0      :> RAMGS0,      PAGE = 1
      SHARERAMGS1      :>RAMGS1,      PAGE = 1.

      /*闪存编程缓冲器*/
      BufferDataSection:>RAMD1,PAGE = 1,ALIG(8)
      
      /*使用 IPC API 驱动程序时需要以下部分定义*/
       组:> CPU2TOCPU1RAM,PAGE = 1
       {
           PUTBUFFER
           PUTWRITEIDX
           GETREADIDX
       }

       组:> CPU1TOCPU2RAM,PAGE = 1
       {
           GETBUFFER:   TYPE = DSECT
           GETWRITEIDX: TYPE = DSECT
           PUTREADIDX:  TYPE = DSECT
       }  



    /*
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    //文件结束。
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    *




    复位/重启检查后,仿真器是否已连接...

    现在出现按重置开关并拔出 USB 电缆的问题,它无法正常工作。

    谢谢、此致、

    Rani

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rani、

    很高兴它帮助解决了调试器运行时出现的问题。

    在独立情况下、您是否看到 XRSn 上的切换?

    谢谢、此致、
    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Vamsi、

     在独立情况下、您是否看到 XRSn 上的切换?

        XRSn 引脚不会切换、它始终保持高电平(3.19V)。

      当我不调用闪存读取/写入(EEPROM_Write()、EEPROM_Read())函数时,它将以独立模式(复位、powercycle、run->load)工作

    看门狗定时器已检查

     已禁用看门狗计时器并已选中 、Reset (重置)和 Power cycle (关机后再开机)。

     S1引导:

         TRST 引脚为高电平(3.19V)

        GPIO64和 GPIO72在每个引脚上都有2.36V 电压。

    我的问题:

      当 TRST 引脚为高电平(3.14v )-我们可以将系统置于仿真模式是否正确(扫描系统对设备操作的控制)    ,这意味着什么? 。

      当 TRST 引脚为低电平时-功能模式(这意味着什么)? 我们可以将系统置于其他引导模式吗(SCI、CAN 等)?

    谢谢、此致、

    Rani

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rani、

    是的、TRSTn 引脚高电平用于仿真模式(JTAG 连接的情况)。

    TRSTn 低电平-独立情况(未连接 JTAG)。  如果要与器件通信、可以使用其他引导模式。        

    在 EEPROM 写入函数中、是否使用 AutoEcc 对 ECC 进行编程? 还是仅对数据进行编程?

    谢谢、此致、

    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rani、

    您提到过您查看了引脚"GPIO64和 GPIO72"、您是指 GPIO84和 GPIO72吗? 84和72是默认引导模式选择引脚。

    为了更轻松地进行调试、我建议使用仿真独立引导模式、这样您就可以在不删除 JTAG 的情况下遵循独立引导流程。 您可以在引导 TRM 一章中看到此引导流程图。

    本质上、您需要做的是通过 CCS 加载应用、通过 CCS 复位(您现在处于启动状态)、打开 CCS 存储器窗口并将存储器地址0xD00编辑为"0xFF5A"、然后运行。

    此致

    Chris

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     

    Vamsi、

      使用"仅限 FapiData"。

    当我使用“Fapi_AutoEccGeneration”时,无法连续写入… 它只在第一个字节上写入...

    已参阅开机自检并执行相同的配置:

    https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/697843?CCS-TMS320F28379D-Fapi-issueProgrammingCommand-function-useing-Fapi-AutoEccGeneration-mode-can-t-generate-ecc-code-in-flash

    链接2:

    e2e.ti.com/.../566655

    重新建立链路并完成 fapi_calculateecc();

    获得的 Eccvalue 为16,但内存中没有写入任何内容。

    代码:

    //######################################################################################################################

    //
    //包含的文件
    //

    #include "F28x_Project.h"
    #include
    #include "flash_programming_c28.h"//闪存 API 示例头文件
    #include "F021_F2837xD_C28x.h"
    #include"EEPROM.h"
    #include"Memcopy.h"
    #include"stdio.h"

    //
    //定义
    //
    #define words _in_flash_buffer   0xFF //编程数据缓冲区、字

    #ifdef __TI_Compiler_version__
       #if __TI_Compiler_version__>=15009000
           #define ramFunc 部分".TI.ramfunc"
       其他
           #define ramFunc 段"ramfuncs "
       #endif
    #endif


     #pragma CODE_SECTION (EEPROM_Erase、"ramfuncs");
     #pragma CODE_SECTION (EEPROM_Write、"ramfuncs");
     #pragma CODE_SECTION (EEPROM_UpdateBankStatus、"ramfuncs");
     #pragma CODE_SECTION (EEPROM_UpdatePageStatus、"ramfuncs");
     #pragma CODE_SECTION (EEPROM_ProgramSingleByte、"ramfuncs");


    //
    //全局
    //


    uint32 mainAddress=0x00082000;
    uint64 mainData=7;
    uint16 eccValue;



    uint16_t 数据;
    bool 标志;
    int c=0;
    #define Blinky_LED_GPIO   31.
    //
    //函数原型
    //

    uint16 test=0;
    void Example_Error (Fapi_StatusType 状态);
    void example_done (void);
    void Compare_ECC (void);
    //
    //主函
    //
    void main (void)
       {
       InitSysCtrl();
       InitGpio(); //针对此示例跳过
       GPIO_SetupPinMux (Blinky_LED_GPIO、GPIO_MUX_CPU1、0);
       GPIO_SetupPinOptions (Blinky_LED_GPIO、GPIO_output、GPIO_PushPull);

       InitPieCtrl();
       IER = 0x0000;
       IFR = 0x0000;
       InitPieVectTable();
       initeeprom();
       // 步骤5. 用户特定代码:

       //将闪存 API 函数复制到 SARAM
      SeizeFlashPump();


    //
    //跳转到 RAM 并调用闪存 API 函数
    //
         
        

       while (1)
       {

           Compar_ECC();


       }



    // Example_CallFlashAPI -此函数将连接到闪存 API。
    //                        此函数中使用的闪存 API 函数是
    //                        从 RAM 中执行
    //



    //
    // example_done -对于此示例,完成后,只需在此处停止即可
    //




    void Compare_ECC (void)


    EALLOW;



       eccValue = fapi_calculateEcc ((mainAddress<1)、mainData);


     EDIS;

      //返回 Fapi_Status_Success;




    #pragma CODE_SECTION (example_done、ramFuncSection);
    void example_done (void)(空)

       _asm ("   ESTOP0");


    //
    //文件结束
    //

    如何通过计算 ECC 值在闪存上写入数据?

    谢谢、此致、

    Rani

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你克里斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rani、

    您使用的编译器版本是什么?  如果大于15.9、则代码中应使用.TI.ramfunc 段而不是 ramfuncs:

     #pragma CODE_SECTION (EEPROM_Erase、"ramfuncs");
     #pragma CODE_SECTION (EEPROM_Write、"ramfuncs");
     #pragma CODE_SECTION (EEPROM_UpdateBankStatus、"ramfuncs");
     #pragma CODE_SECTION (EEPROM_UpdatePageStatus、"ramfuncs");
     #pragma CODE_SECTION (EEPROM_ProgramSingleByte、"ramfuncs");

    关于 ECC:如果您没有正确地对 ECC 进行编程、您将获得 ECC 错误、而双位错误会导致 NMI。  如果您不打算插入任何有意的 ECC 错误,则不必使用 Fapi_CalculateEcc()。  您可以在编程期间简单地使用 Fapi_AutoEccGeneration 模式。  使用 Fapi_AutoEccGeneration 模式时、可能无法正确传递参数。  请注意、一次可在任何编程模式下编程的16位字的最大数量为8。  但在代码中、我看到您将数据缓冲区长度传递为"A"?  它应该是8或更少。  

    请通读以下常见问题解答:

    谢谢、此致、
    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Vamsi、

     

    [引用 user="Vamsi Gudivada">您使用的编译器版本是什么?  如果大于15.9、则应在代码中使用.TI.ramfunc 段而不是 ramfuncs:

    使用18.9版本、因此现在更改了一个。

    [引用 user="Vamsi Gudivada">但在您的代码中,我看到您将数据缓冲区长度传递为'A'?  不应超过8个[/报价]

     小于8,作为“7”传递


    我已经按照 SPRAB69来实现 EEPROM 仿真方法、因此考虑我的第一个位置为组状态、第二个位置为页状态、然后使用 "Fapi_AutoEccGeneration"模式在存储器上连续写入数据...  

     前两个位置正在正确写入,但我的数据没有写入....

    要写入组状态代码:

    写入页状态

    在存储器上写入数据

    传输数据缓冲区长度

    写入后、函数执行返回状态为 "Fapi_Status_SUCCESS"、但数据不会写入存储器。

    Go with Single byte write method used "Fapi_DataOnly" data are written on memory (使用单字节写入方法时,使用的“Fapi_DataOnly”数据将正确写入内存) 但是重置模式不起作用...

     当我使用"Fapi_AutoEccGeneration"模式时...数据未正确写入..

    帮助我解决这个问题。 如果 我想将100个数据写入 内存,如何传递 Databuffer 长度 意味着...

    谢谢、此致、

    Rani

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rani、

    在 EEPROM.c 文件的第222行中、您要传递的数据缓冲区长度为"A"、在第448行中、对于 Fapi_AutoEccGeneration 模式、您要传递的长度为1。  Fapi_AutoEccGeneration 模式需要4或8作为数据缓冲区长度。   

    正如我在前面的其他文章中提到的:此器件上的闪存已关联 ECC。  因此、您必须对 ECC 进行编程、并且可以对 ECC 使用 Fapi_AutoEccGeneration -如果您跳过 ECC 编程、您将得到 ECC 错误(这会导致 NMI/复位)。  由于针对每64位主数组数据计算8位 ECC (在64位边界上对齐)、因此即使变量的大小为16位、也需要为其分配至少64位的值。  EEPROM 指南没有这样说、因为指南中讨论的器件没有用于闪存的 ECC、并且也允许对16位进行编程。  请勿按原样使用本指南;相反、请修改您的 EEPROM 驱动程序设计以考虑 ECC 要求。

    请  在 https://www.ti.com/lit/ug/spnu629/spnu629.pdf 上阅读闪存 API 指南中的第3.2.3节 Fapi_issueProgrammingCommand()。

    我建议您阅读整个闪存 API 指南、我在之前的答复中提到的常见问题解答、并逐步浏览 C2000Ware 中提供的闪存 API 示例、网址 为 C2000Ware_3_03_00_00\device_support\f2837xd\examples\dual\flash_programming。

    关于您的问题"如果 我想将100个数据 写入内存 、如何传递数据收集器长度":  在闪存 API 指南的第3.2.3节中、我们提到"此函数一次最多只能对128位进行编程(给定提供的地址为128位对齐)。 如果用户希望进行的编程多于该值、则应循环调用此函数、以便一次对128位(或应用程序所需的64位)进行编程。"

    关于您的问题“写入函数后执行返回的状态为 “Fapi_Status_Success”,但数据未写入内存中。”:  请搜索“完成程序操作后 Fapi_issueProgrammingCommand()函数调用返回吗?” 闪存 API 常见问题解答中的内容  

    谢谢、此致、

    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rani、

    一个快速问题: 您是否计划为整个应用禁用 ECC? 如果是、您可以在应用程序读取任何不带 ECC 编程的闪存位置之前执行此操作(默认情况下启用 ECC 检查、如 TRM 中所述)。  如果是这种情况、您可以使用 Fapi_DataOnly 模式跳过 EEPROM 数据和程序的 ECC 编程-这样您就可以按照 EEPROM 指南中的说明设计 EEPROM 驱动程序。

    这是您计划做的事情吗?   

    我提到 ECC 的原因是: 您说过在调试器连接的情况下、一切都正常工作、但在独立模式下却不工作。  因此、我提出了 ECC 问题、因为这是应用程序在独立模式下失败的原因之一。  在 GEL 文件中禁用 ECC、因此在调试器连接的情况下可能不会显示 ECC 错误(除非您在应用中启用 ECC)。

    谢谢、此致、
    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    瓦姆西

     我想实现 EEPROM 驱动程序,这是启用 ECC 或禁用 ECC 的好方法。 如果我禁用它、会导致应用程序代码中出现任何问题?。 它不影响正常运行 意味着我将禁用它.... 请建议 您更好地禁用或启用...

    假设我禁用它....。 我必须修改哪个文件?

    谢谢、此致、

    Rani

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rani、

    ECC 是一项安全功能(单错校正、双错检测)、可检测存储器中的位翻转-您可以在 TRM 中阅读相关信息。

    如果您认为您的应用程序不需要此类功能,则可以禁用它(InitFlash()-在此函数中,您将注意到 ECC 已启用。  您可以对其进行编辑以禁用)。   

    但是、请注意、默认情况下启用 ECC 检查-因此、您需要为应用程序编写 ECC (在 CCS 闪存插件程序中启用 AutoEccGeneration 功能为应用程序编写 ECC)、以避免出现 ECC 错误、直到您的应用程序在其初始化例程中禁用 ECC。  

    您可以在闪存初始化例程中禁用 ECC、以便 EEPROM 数据读取不会发生 ECC 错误(如果您决定不对 EEPROM 数据的 ECC 进行编程)。   

    谢谢、此致、
    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Vamsi、

    [引用 user="Vamsi Gudivada">如果您认为您的应用程序不需要此功能,则可以禁用它(InitFlash()-在此函数中,您将注意到 ECC 已启用。  您可以对其进行编辑以禁用)。   [/报价]

    已在 uniflash 文件中禁用.... 同样、它在复位条件下不起作用。

    以上全部完成、但现在可用于重置条件...

    谢谢、此致、

    Rani

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rani、

    您可以在 InitFlash()函数中禁用它。  但不应在 CCS 闪存设置 GUI 中禁用它(应启用 AutoEccGeneration)。

    如果在启用了 AutoEccGeneration 的情况下仍然失败,则需要查看以下内容:

    1.在应用程序流中,在 InitFlash()中禁用 ECC 之前,是否有任何读取使用 API 编程的闪存位置的操作?  如果是、由于您使用 Fapi_DataOnly (而不是 ECC)对它们进行了编程、因此会出现 ECC 错误。  如果是这种情况,则需要移动这些读取以发布 InitFlash()执行。

    2.不确定我们是否已经讨论过(因为我们到目前为止讨论过多个帖子):  

    (a)您是在应用程序中为看门狗提供服务还是禁用了看门狗?

    (b)应用程序是否正确引导至闪存?  您是否有任何指示(如 GPIO 切换等)表明应用程序已引导至闪存?  

    谢谢、此致、
    Vamsi

      

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Vamsi、

    [引用 user="Vamsi Gudivada]1. 在您的应用程序流中,在 InitFlash()中禁用 ECC 之前,是否有任何对使用 API 进行编程的闪存位置的读取?  如果是、由于您使用 Fapi_DataOnly (而不是 ECC)对它们进行了编程、因此会出现 ECC 错误。  如果是这种情况,您需要将这些读取移动到 InitFlash()执行后。

    我正在从内存位置读取数据。

    (a)您是在应用程序中为看门狗提供服务还是禁用了看门狗?

        我已经尝试启用和禁用这两种情况。 这不奏效。

    (b)应用程序是否正确引导至闪存?  您是否有任何指示(如 GPIO 切换等)表明应用程序已引导至闪存?

      是的,启动后,应用程序中的蓝色 LED 闪烁。 它不适用于复位条件。 调试,加载过程有效。

    如果是这种情况,您需要将这些读取移动到 InitFlash()执行后。

    您是不是说在调用 InitFlash()之前,它会调用 EEPROM read()…… 不正确?

    谢谢、此致、

    Rani



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rani、

    是的,在禁用 ECC 的情况下执行 InitFlash()之前,不应调用 EEPROM read()函数。 这可能是您的应用程序无法正常工作的原因。  请检查。

    谢谢、此致、
    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Vamsi、

       在 EEPROM read()函数之前,我已经初始化 InitFlash()。  InitFlash()从 InitSysCtrl()函数本身调用。

    谢谢、此致、

    Rani

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Vamsi、

      感谢您全程支持我。 现在也在复位/电源循环条件下运行我的应用程序。

        在 CCS 菜单的 CPU 复位中加载确实复位之后。

    非常感谢 Vamsi。

    谢谢、此致、

    Rani

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Vamsi、

       非常感谢您全程为我提供的大力支持。 现在,我也可以在下电上电/复位条件后运行代码。  

    在 CPU 复位的情况下加载代码后。现在它的工作正常。

    谢谢、此致、

    Rani

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rani、

    很高兴我能提供帮助。  我要关闭此帖子。   

    谢谢、此致、
    Vamsi