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.

Compiler/TMS320F28386D: CM Flash API program fail

Part Number: TMS320F28386D
Other Parts Discussed in Thread: C2000WARE

Tool/software: TI C/C++ Compiler

Hi,

I used armhex.exe to convert cm.out to b0 with below command. (from C:\ti\ccs930\ccs\tools\compiler\ti-cgt-arm_18.12.6.LTS\bin)

..\%TOOLDIR%\armhex.exe  cm.out -boot -gpio8 -b

� � ���pG@ ���� � ى ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ ɉ 	� �8��q�L�L� ������@�pN�Q���P��`- !��. !��/ !��0 !��5 !��6 !��7 !��8 !��@ !��H�)@ �� ������D�O��a�����@ ���H�q �� F��H�y !�� �
�H�� !�� ��H�� !�� ���H�� !�� ���H�� �� F���H�� !�� ���H�� !�� ���D����H�p!�� @� 	h��O�tO��r��F�`O��FAhI
��`iI
��!���O��@@�(��@�/����0�@�(�O��F����(�`�(R�(D�(6�((�(�(^�A�C�����s"��h�O���@�@��C!C`�O�N�R���ha�_p�`�O��FN�R���h �`@�AP�`��FN�R��Pha�_pP`�O��FN�R��h �`@�AP`��FN�R��h �`@@�A0`��FN�R��h ��@�A`�-��AFFF�	Ѐ��"�"�"�"��L����i���R����D)�!�O�.4�L� ���i���R����D)�F��8AF��8<ʁ�<�U����O�Ȩ�Ȉ�H�p!< �� ��X�`�FAhB��`iB�ѽ�� pGB�B�C����`B�BC`B�C�����a@��`��@�C��a@�B��Ca@�C���`F��a��
`F�B��J`F�B���aF�B���`D���
aD�B��JaD�B���`D�B���aCh"��i�Hh��i�pG*J�_��у"�*�p�:x�x�:��p�28�*,�*�*$��������*В"�xpI@R"Ћ���у�����C���
��p
Cp
�p
�p���xpI@R��`FpG(�<�(.�( �(�(<�8A�q"�C	���q����`�O�N���h@�`�O��FN�$Q��h@� `�O��FN�$Q��h@�0`�O��FN�$Q��h@�0`�"F
FFq���*��������*�q���A�!*�A�A*�F*�F
F���r�;����B���@��� ���pq����� ��O�`�|�O�`�x�O�@`�t� �q�@� �m�@�@�i�@�P�e�@��a� �^�O�p�Z�@� �V�@�@�R�@�`�N�@��J��-��CN�S��h@����B#����F'����F���D�����N��������F��E�����@���`B� �������F@��t�;"�H@�[�[�����R[*��X����[����/E���k0
$��`����B����!����@���@�h�@�@H������ ��l�J�J�a"�����
���5�H�@N�Q�� ��`����A	 0�L�$��$
��(FiF"��(��(�hF��d��L� $��(FiF"��(�����	�0���FBi�i�����E
�O��F/� �Bi��E��i�Lx�x�<ʁ�<�i�� �������HM�B�HL�B�<�T�xU�! ah@�G�������F� � �� P� �d"F��``!���h ��` �@� � �@�  � F�m� �@�@ ��D�O��0��A� �h �`1�@�!�1�@� !�pGL�����
h#�� ��#��4cCC`pG�<#H�p$�� �D� iF���� i�����H�����������r� ��y� ��@������
��� U!�����!���O��2@C�pG�� �FF��L��� F!��� !���� !���� !���� !��|� F��x� !��t� !��p� !��l����� pGpG��pG����� ��e� �� W� @@������ � �  � $ � d �    � ` (� $ 0� d 8� $ @� d H� & x �p�@0�@ �@@�@-./01234   ��@��@��@��@56789:;<` @ � ��O�3���2�glC�d�lC��d��3#���3��3#���3h#�pcC�#`��#B���#��#B���#h��
 �@�
` ��(���@��(���pG

Then interpret the .b0 file and program data by cm flash api.

Some address can program as expected, but some fail.

for example, 

Success address:

Fail address: 0x208AE8

When it was fail, I have checked below:

1. Arguments of address, buffer data in Fapi_issueProgrammingCommand() are all correct.

2. After Fapi_checkFsmForReady() was ready, Fapi_getFsmStatus() returned zero. Its mean there was no error.

3. Fapi_doVerify() return Fapi_Error_Fail, the compared date is correct but value in memory all 0xFFFF

Is the address 0x208AE8 not match 128-bits alignment?

However I have added align(8) in my .cmd file.

MEMORY
{
   /* Flash sectors */
   CMBANK0_RESETISR : origin = 0x00208000, length = 0x00000008 /* Boot to Flash Entry Point */
/* CMBANK0_SECTOR0  : origin = 0x00200008, length = 0x00003FF8 */
/* CMBANK0_SECTOR1  : origin = 0x00204000, length = 0x00004000 */
/* CMBANK0_SECTOR2  : origin = 0x00208000, length = 0x00004000 */
/* CMBANK0_SECTOR3  : origin = 0x0020C000, length = 0x00004000 */
/* CMBANK0_SECTOR4  : origin = 0x00210000, length = 0x00010000 */
/* CMBANK0_SECTOR5  : origin = 0x00220000, length = 0x00010000 */
/* CMBANK0_SECTOR6  : origin = 0x00230000, length = 0x00010000 */
/* CMBANK0_SECTOR7  : origin = 0x00240000, length = 0x00010000 */
/* CMBANK0_SECTOR8  : origin = 0x00250000, length = 0x00010000 */
/* CMBANK0_SECTOR9  : origin = 0x00260000, length = 0x00010000 */
/* CMBANK0_SECTOR10 : origin = 0x00270000, length = 0x00004000 */
/* CMBANK0_SECTOR11 : origin = 0x00274000, length = 0x00004000 */
/* CMBANK0_SECTOR12 : origin = 0x00278000, length = 0x00004000 */
/* CMBANK0_SECTOR13 : origin = 0x0027C000, length = 0x00003FA0 */
/* CMBANK0_SECTOR0213 : origin = 0x00208008, length = 0x00077F98 */
   CMBANK0_SECTOR0213 : origin = 0x00208010, length = 0x0003FF0
   CMBANK0_APPINFO    : origin = 0x0027FFA0, length = 0x00000060

   C1RAM            : origin = 0x1FFFC000, length = 0x00002000
   C0RAM            : origin = 0x1FFFE000, length = 0x00002000

   BOOT_RSVD        : origin = 0x20000000, length = 0x00000800 /* Part of S0, BOOT rom will use this for stack */
   S0RAM            : origin = 0x20000800, length = 0x00003800
   S1RAM            : origin = 0x20004000, length = 0x00004000
   S2RAM            : origin = 0x20008000, length = 0x00004000
   S3RAM            : origin = 0x2000C000, length = 0x00004000
   E0RAM            : origin = 0x20010000, length = 0x00004000

   CPU1TOCMMSGRAM1  : origin = 0x20080000, length = 0x00000600
   CPU1TOCMMSGRAM2  : origin = 0x20080600, length = 0x00000A00
   CMTOCPU1MSGRAM1  : origin = 0x20082000, length = 0x00000600
   CMTOCPU1MSGRAM2  : origin = 0x20082600, length = 0x00000A00
   CPU2TOCMMSGRAM1  : origin = 0x20084000, length = 0x00000600
   CPU2TOCMMSGRAM2  : origin = 0x20084600, length = 0x00000A00
   CMTOCPU2MSGRAM1  : origin = 0x20086000, length = 0x00000600
   CMTOCPU2MSGRAM2  : origin = 0x20086600, length = 0x00000A00
}

SECTIONS
{
   .resetisr        : > CMBANK0_RESETISR, ALIGN(8)
   .vftable         : > CMBANK0_SECTOR0213, ALIGN(8)  /* Application placed vector table in Flash*/
   .vtable          : > S0RAM             /* Application placed vector table in RAM*/
   .text            : > CMBANK0_SECTOR0213, ALIGN(8)
   .cinit           : > CMBANK0_SECTOR0213, ALIGN(8)
   .pinit           : > CMBANK0_SECTOR0213, ALIGN(8)
   .switch          : > CMBANK0_SECTOR0213, ALIGN(8)
   .sysmem          : > S2RAM

   .stack           : > C1RAM
   .ebss            : > C1RAM
   .econst          : > CMBANK0_SECTOR0213, ALIGN(8)
   .esysmem         : > C1RAM
   .data            : > S3RAM
   .bss             : > S3RAM
   .const           : > CMBANK0_SECTOR0213, ALIGN(8)

    .TI.ramfunc : {} LOAD = CMBANK0_SECTOR0213,
                     RUN = S0RAM | S1RAM | S2RAM,
                     LOAD_START(RamfuncsLoadStart),
                     LOAD_SIZE(RamfuncsLoadSize),
                     LOAD_END(RamfuncsLoadEnd),
                     RUN_START(RamfuncsRunStart),
                     RUN_SIZE(RamfuncsRunSize),
                     RUN_END(RamfuncsRunEnd),
                     ALIGN(8)

	GROUP : > CMTOCPU1MSGRAM1
	{
		PUSHBUFFER_CPU1
		PUSHWRITEIDX_CPU1
		POPREADIDX_CPU1
		SENDDATA_CPU1
		PUTBUFFER_CPU1
		PUTWRITEIDX_CPU1
		GETREADIDX_CPU1
	}

	GROUP : > CPU1TOCMMSGRAM1
	{
		POPBUFFER_CPU1		: TYPE = DSECT
		POPWRITEIDX_CPU1	: TYPE = DSECT
		PUSHREADIDX_CPU1	: TYPE = DSECT
		RCVDATA_CPU1		: TYPE = DSECT
		GETBUFFER_CPU1		: TYPE = DSECT
		GETWRITEIDX_CPU1	: TYPE = DSECT
		PUTREADIDX_CPU1		: TYPE = DSECT
	}

	GROUP : > CMTOCPU2MSGRAM1
	{
		PUSHBUFFER_CPU2
		PUSHWRITEIDX_CPU2
		POPREADIDX_CPU2
		SENDDATA_CPU2
		PUTBUFFER_CPU2
		PUTWRITEIDX_CPU2
		GETREADIDX_CPU2
	}

	GROUP : > CPU2TOCMMSGRAM1
	{
		POPBUFFER_CPU2		: TYPE = DSECT
		POPWRITEIDX_CPU2	: TYPE = DSECT
		PUSHREADIDX_CPU2	: TYPE = DSECT
		RCVDATA_CPU2		: TYPE = DSECT
		GETBUFFER_CPU2		: TYPE = DSECT
		GETWRITEIDX_CPU2	: TYPE = DSECT
		PUTREADIDX_CPU2		: TYPE = DSECT
	}

	GROUP : > CMTOCPU1MSGRAM2
	{
		CMRefVariableFiles
	}
}

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

Please give me some suggestions.

Thank you.

  • Frederick,

    Please align the sections in linker cmd for align(16).  For arm core, 128-bit alignment is achieved by using align(16).  This is mentioned in FAQ here e2e.ti.com/.../951658.

    0x208AE8 is not 128-bit aligned.  It is 64-bit aligned.  Hence, when calling program function for this address, you can program a max of 64-bits (8 bytes).  Maybe you are trying to program more than that (128 bits)?  Please check.  

    When it failed, program function would have returned an error - did you check the return value from the program function? If not, please check.

    If above does not help to resolve the issue, please provide the snapshot of the code where you call the program function, Fapi_checkFsmForReady(), Fapi_getFsmStatus() and  Fapi_doVerify().

    Thanks and regards,
    Vamsi

  • Hi Vamsi,

    After I modify cm.cmd to align(16), I can burn in my codes successfully with no error.

    I call Api functions just like C2000Ware example flashapi_cm_ex1_programming.c in version 3.2.0.

    I see  "TMS320F2838x Flash API Version 1.60.00.00 Reference Guide", it means that all 3.x.x C2000Ware FlashApi examples should match 128-bits alignment.

    Is the key point buffer size 16? 

    Fapi_issueProgrammingCommand((uint32 *)u32Index, Buffer+i,16, 0, 0, Fapi_AutoEccGeneration);

    Does it mean that If modified to buffer size 8, can program the address align 64-bits? 

    Fapi_issueProgrammingCommand((uint32 *)u32Index, Buffer+i,8, 0, 0, Fapi_AutoEccGeneration);

    Thanks and regards,

    Frederick

  • Frederick,

    Glad it helped.

    Yes, if the address that you pass for program function is 128-bit aligned, then you can program 16bytes.

    You can program 8 bytes by providing a 64-bit aligned address.

    Thanks and regards,
    Vamsi

  • Vamsi,

    I have understood and solved my problem.

    Thank you for your help.

    Thanks and regards,

    Frederick