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.

[参考译文] TMS320F2.8379万D:在后续调用中更改Fapi_issueProgrammingCommand的缓冲区长度参数的问题

Guru**** 2577385 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/642759/tms320f28379d-issue-with-change-of-buffer-length-parameter-of-fapi_issueprogrammingcommand-in-a-susequent-calls

部件号:TMS320F2.8379万D
主题中讨论的其他部件:C2000WARE

尊敬的支持人员:

正如我从F021闪存编程API V. 1.54 文档和API示例中了解到的那样,可以使用 Fapi_issueProgrammingCommand函数对最多8个字进行编程。

我写了一个小程序来评估F2.8379万D微控制器上的闪存API的功能。

该程序基于从C2000Ware 1.00 .01.00 获取的两个CPU的flash_programming示例。

基本上,代码初始化闪存(即闪存API),擦除即将编程的闪存扇区,并对API函数Fapi_issueProgrammingCommand和Fapi_doVerify执行树对调用。

第一次调用Fapi_issueProgrammingCommand时,将为缓冲区长度参数传递值8。 编程和验证工作正常。

在对函数Fapi_issueProgrammingCommand的下一个(第二个)调用时,将为缓冲区长度的参数传递值6。 编程和验证工作正常。

在对函数Fapi_issueProgrammingCommand的第三次和最后一次调用时,将为缓冲区长度的参数传递值8。 编程失败并显示错误Fapi_Error_DatabBufferLength。

我的问题是:是否有任何解决方案可以应用,以便能够在后续调用中对具有不同长度的缓冲区进行编程? 对我来说,似乎只能用8作为缓冲区的长度。

我已随附文件,代码为:


e2e.ti.com/.../7673.flash_5F00_programming_5F00_cpu01.c

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

    igen,

    如Flash API指南中所述,所提供的编程起始地址加上数据缓冲区长度不能跨越128位对齐地址边界。

    检查此线程: https://e2e.ti.com/support/microcontrollers/c2000/f/171/p/373542/1316112</s>37.3542万 131.6112万 

    谢谢,此致,

    Vamsi

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

    我读取了线程,并尝试从闪存地址0x8.8万 (扇区E)开始逐个编程126个16位字。
    我做过两次:一次是启用ECC (也将Fapi_AutoEccGeneration用作Fapi_issueProgrammingCommand的参数),第二次是禁用ECC (并将Fapi_DataOnly用作Fapi_issuemingCommand的参数)

    正如我从线程中的解释中所理解的那样,这样我永远不会违反128位边界。 但是,编程后,我浏览了0x8.8万的闪存,内容与缓冲区中要编程到闪存的内容不同。

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

    感谢您查看我指出的主题。

    1)你提到"我尝试对126个16位字进行编程"时,你是否想说"128"? 如果是126,您是否对8个字进行了15次编程,然后在最后迭代中对6个字进行了编程?

    2)让我们先尝试解出一种编程模式。 是否可以单独尝试Fapi_AutoEccGeneration模式?

    3)你能分享你的代码吗? 如果您可以共享您的代码,则很容易找到问题。

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

    您好,Vamsi:

    了解您的观点:

    1)我的意思是126 x 16位字。 我编程了一个16位字,一个字,一个字,另一个(一个字,126次)。

    2)我在启用ECC和Fapi_AutoEccGeneration作为Fapi_issueProgrammingCommand()参数的情况下进行了测试。 结果:闪存中缺少所提供缓冲区的某些字。

    3)我在文件"flash_programming_cpu01_one_by one.c"中附上了代码

    我还附加了一个名为"flash_programming_cpu01_sequence_of_6_2_sudes.c"的文件。 使用此程序,我将在以下菜单中循环编程64个16位字:在每次迭代中,首先编程6个字,然后编程2个字,以此类推,直到所有64个字都编程。 因此,也不是缓冲区提供的所有字都能在闪存中找到。

    e2e.ti.com/.../flash_5F00_programming_5F00_cpu01_5F00_one_5F00_by_5F00_one.ce2e.ti.com/.../flash_5F00_programming_5F00_cpu01_5F00_sequence_5F00_of_5F00_6_5F00_2_5F00_words.cThanks,此致,

    伊凡

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

    伊万

    感谢您提供代码。  我看了两个文件。

    使用Fapi_AutoEccGeneration模式进行编程时,一次可以编程的16位字(为程序功能提供的第3个参数)的数目仅为4或8。

    当地址是64位或128位对齐时,可以对4个16位字进行编程。

    当地址为128位对齐时,您可以对816位字进行编程。

    当您使用Fapi_AutoEccGeneration模式对第一个16位字进行编程时,将为整个64位对齐内存生成ECC,假设其他3个未提供的字全部为1 (请参阅 http://www.ti.com/lit/spnu629中的3.2 3部分)。  此ECC与前16位字一起编程。  当您对第二个16位字进行编程时,生成的ECC将与已编程的ECC冲突。  因此,数据不会按预期进行编程。  fmstat位将被设置,指示您正在尝试将0编程到1 (这对于程序操作是不可能的)。  请检查Fapi_getFsmStatus()返回的值,如API指南中为程序函数提供的示例所示。  从指南复制以下代码片段。

    //读取fmstat寄存器内容以了解FSM的状态

    // program命令,查看是否存在与程序操作相关的错误

    oFlashStatus = Fapi_getFsmStatus();

    如果(oFlashStatus!= 0)

    //检查fmstat并进行相应的调试

    fmstat_fail ();

    }

    如TRM和API指南中所述,请注意ECC是针对64位内存边界上的每一个64位数据计算的。

    谢谢,此致,

    Vamsi

     

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

    非常感谢Vamsi的详细和清晰解释。

    我认为这个问题已经解决。

    谢谢,此致,

    伊凡