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.

TMS320F28386S: Fapi_issueAsyncCommandWithAddress() illegal operation

Part Number: TMS320F28386S

When my program calls Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, (uint32_t *)sectorAddress); it crashes with an illegal operation error. The sector address is 0x88600. The symptom seems to be it may be erasing the calling program. However, hovering indicates the address of CopyData() is 0x17000.

Here is the cmd file of the program that is calling the Fapi function.

MEMORY
{

   BOOT_RSVD        : origin = 0x000002, length = 0x0001AE     /* Part of M0, BOOT rom will use this for stack */
   RAMM0_1          : origin = 0x0001B0, length = 0x000648
   // RAMM1_RSVD       : origin = 0x0007F8, length = 0x000008         /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
   CLA_MSGRAMLOW    : origin = 0x001480, length = 0x000080
   CLA_MSGRAMHIGH   : origin = 0x001500, length = 0x000080
   RAMD0_1          : origin = 0x00C000, length = 0x001000
   RAMLS0           : origin = 0x008000, length = 0x000800
   RAMLS1_5         : origin = 0x008800, length = 0x002800
   RAMLS6           : origin = 0x00B000, length = 0x000800
   RAMLS7           : origin = 0x00B800, length = 0x000800
   RAMGS0_1         : origin = 0x00D000, length = 0x002000
   RAMGS2_4         : origin = 0x00F000, length = 0x003000
   RAMGS5_6         : origin = 0x012000, length = 0x002000
   RAMGS7           : origin = 0x014000, length = 0x001000
   RAMGS8_9         : origin = 0x015000, length = 0x002000
   RAMGS10_15       : origin = 0x017000, length = 0x005FF8
   // RAMGS15_RSVD     : origin = 0x01CFF8, length = 0x000008         /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */

#ifdef __TI_COMPILER_VERSION__
   #if __TI_COMPILER_VERSION__ >= 20012000
GROUP {      /* GROUP memory ranges for crc/checksum of entire flash */
   #endif
#endif
   /* BEGIN is used for the "boot to Flash" bootloader mode   */
   BEGIN            : origin = 0x080000, length = 0x000002
   /* Flash sectors */
   FLASH0           : origin = 0x080002, length = 0x001FFE  /* on-chip Flash */
   FLASH1           : origin = 0x082000, length = 0x002000  /* on-chip Flash */
   FLASH2_5         : origin = 0x084000, length = 0x014000  /* on-chip Flash */
   FLASH6           : origin = 0x098000, length = 0x008000  /* on-chip Flash */
   FLASH7           : origin = 0x0A0000, length = 0x008000  /* on-chip Flash */
   FLASH8           : origin = 0x0A8000, length = 0x008000  /* on-chip Flash */
   FLASH9           : origin = 0x0B0000, length = 0x008000  /* on-chip Flash */
   FLASH10_11       : origin = 0x0B8000, length = 0x004000  /* on-chip Flash */
   FLASH12_13       : origin = 0x0BC000, length = 0x003FF0  /* on-chip Flash */
   // FLASH13_RSVD     : origin = 0x0BFFF0, length = 0x000010    /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
#ifdef __TI_COMPILER_VERSION__
  #if __TI_COMPILER_VERSION__ >= 20012000
}  crc(_table_name, algorithm=C28_CHECKSUM_16)
  #endif
#endif

   CPUTOCMRAM      : origin = 0x039000, length = 0x000800
   CMTOCPURAM      : origin = 0x038000, length = 0x000800
   CPU1TOCPU2RAM   : origin = 0x03A000, length = 0x000800
   CPU2TOCPU1RAM   : origin = 0x03B000, length = 0x000800

   RESET            : origin = 0x3FFFC0, length = 0x000002

   EMIF1_CS0n      : origin = 0x80000000, length = 0x01000000
}

SECTIONS
{
   codestart           : > BEGIN, ALIGN(4)
   .text               : > FLASH2_5, ALIGN(4)
   .cinit              : > FLASH1, ALIGN(4)
   .switch             : > FLASH1, ALIGN(4)
   .reset              : > RESET, TYPE = DSECT /* not used, */
   .stack              : > RAMM0_1

      lfuFuncsCpu1Cpu1 :  LOAD = FLASH6 | FLASH7 | FLASH8
	                       //RUN = RAMLS1_5 | RAMLS6 | RAMLS7,
	                       RUN = RAMGS10_15,
		                   LOAD_START(lfuFuncsCpu1Cpu1LoadStart),
		                   LOAD_SIZE (lfuFuncsCpu1Cpu1LoadSize),
		                   LOAD_END  (lfuFuncsCpu1Cpu1LoadEnd),
		                   RUN_START (lfuFuncsCpu1Cpu1RunStart),
		                   RUN_SIZE  (lfuFuncsCpu1Cpu1RunSize),
		                   RUN_END   (lfuFuncsCpu1Cpu1RunEnd),
		                   ALIGN(8)

		flash_api : LOAD = FLASH6 | FLASH7 | FLASH8,
	                       RUN = RAMGS10_15,
	                       LOAD_START(flash_apiLoadStart),
		                   LOAD_SIZE (flash_apiLoadSize),
		                   LOAD_END  (flash_apiLoadEnd),
		                   RUN_START (flash_apiRunStart),
		                   RUN_SIZE  (flash_apiRunSize),
		                   RUN_END   (flash_apiRunEnd),
		                   ALIGN(8)
					{
						--library = F2838x_C28x_FlashAPI.lib(.text)
						//F2838x_C28x_FlashAPI.lib<FlashStateMachine.obj>(.text)
					}


#if defined(__TI_EABI__)
   .init_array      : > FLASH1, ALIGN(4)
   .bss             : > RAMGS2_4
   .bss:output      : > RAMGS2_4
   .bss:cio         : > RAMGS2_4
   .data            : > RAMGS5_6
   .sysmem          : > RAMGS2_4
   /* Initalized sections go in Flash */
   .const           : > FLASH12_13, ALIGN(4)
#else
   .pinit           : > FLASH1, ALIGN(4)
   .ebss            : > RAMGS2_4
   .esysmem         : > RAMGS2_4
   .cio             : > RAMGS2_4
   /* Initalized sections go in Flash */
   .econst          : >> FLASH12_13, ALIGN(4)
#endif

   .farbss          : > EMIF1_CS0n
   .farconst        : > EMIF1_CS0n
   .em1_cs0         : > EMIF1_CS0n

/*** CLA Compiler Required Sections ***/
   .scratchpad         : > RAMLS7                /* Scratchpad memory for the CLA C Compiler */
   .const_cla          : > RAMLS7

   ramgs0 : > RAMGS0_1, type=NOINIT
   
   MSGRAM_CPU1_TO_CPU2 : > CPU1TOCPU2RAM, type=NOINIT
   MSGRAM_CPU2_TO_CPU1 : > CPU2TOCPU1RAM, type=NOINIT
   MSGRAM_CPU_TO_CM    : > CPUTOCMRAM, type=NOINIT
   MSGRAM_CM_TO_CPU    : > CMTOCPURAM, type=NOINIT

   #if defined(__TI_EABI__)
       .TI.ramfunc : {} LOAD = FLASH0,
                        RUN = RAMLS0,
                        LOAD_START(RamfuncsLoadStart),
                        LOAD_SIZE(RamfuncsLoadSize),
                        LOAD_END(RamfuncsLoadEnd),
                        RUN_START(RamfuncsRunStart),
                        RUN_SIZE(RamfuncsRunSize),
                        RUN_END(RamfuncsRunEnd),
                        ALIGN(4)
    #else
       .TI.ramfunc : {} LOAD = FLASH0,
                        RUN = RAMLS0,
                        LOAD_START(_RamfuncsLoadStart),
                        LOAD_SIZE(_RamfuncsLoadSize),
                        LOAD_END(_RamfuncsLoadEnd),
                        RUN_START(_RamfuncsRunStart),
                        RUN_SIZE(_RamfuncsRunSize),
                        RUN_END(_RamfuncsRunEnd),
                        ALIGN(4)
    #endif

   DataBufferSection   : > RAMGS7, ALIGN(4)
   LogSection          : > RAMD0_1, ALIGN(4)
   ParamSection        : > RAMGS8_9, ALIGN(4)
   ClaToCpuMsgRAM      : > CLA_MSGRAMLOW              /* Link to CLA Message RAM */
   CpuToClaMsgRAM      : > CLA_MSGRAMHIGH             /* Link to CLA Message RAM */
   ClaData             : > RAMLS6                     /* Link to CLA Data RAM */
   .bss_cla            : > RAMLS6                     /* Link to CLA Data RAM */

   /* Link to CLA Program RAM */
   Cla1Prog            : LOAD = FLASH10_11,
                         RUN = RAMLS1_5,
                         LOAD_START(ClaProgLoadStart),
                         RUN_START(ClaProgRunStart),
                         LOAD_SIZE(ClaProgLoadSize) ,
                         ALIGN(4)

   /* crc/checksum section configured as COPY section to avoid including in executable */
   .TI.memcrc          : type = COPY

}

/*
//===========================================================================
// End of file.
//===========================================================================
*/

Any suggestions or ideas?

Thanks,

John

  • Hi John,

    You have listed a sector address of 0x88600. This resides within your FLASH2_5 sector, which starts at 0x84000. Could you possibly check the status of the FSM by use of the oFlashStatus variable? For example, in the TRM:

    oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, Sector Address);

    is used to erase a sector, as this command is issued to the FSM but doesn't wait to see if the erase operation is over. 

    Where does the application begin at?

    Also, could you try to erase the sector containing at 0x88600 separately? The address size at 0x84000 and 0x88000 are different, 8Kx16 vs 32Kx16 respectively (this is mentioned in the datasheet).

    Thanks,

    Charles