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.

[参考译文] TMS570LC4357:获取在项目中构建的 example_ti_fee_Write_Read.c

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1116653/tms570lc4357-getting-example_ti_fee_write_read-c-built-in-a-project

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

我正在尝试构建一个访问(假?)的测试程序 EEPROM。  我看到 example_ti_fee_Write_Read.c 就是这样做的、并将其整合到项目中。  我得到以下错误:

>>编译失败
source/subdir_rules.mk:9:目标'source/example_TI_fee_Write_Read.obj'的配方失败
"C:\Users\plu\Documents\TMS_XL2-570LC43-examples\TMS570LC43_fee\include\fee 接口.h"、第88行:致命错误:无法打开源文件"fee_cfg.h"
1在编译"../sources/example_TI_fee_Write_Read.c"时检测到灾难性错误。
编译已终止。
gmake:***[SOURCE /示例_TI_FEE 写_READ.obj]错误1.

****构建完成****

源自 FEE 接口.h:

#include "ti_fee_cfg.h"

#if (TI_FEE = 0U)/*仅在自动扫描上下文中包含以下宏*/
#include "fee_cfg.h"
#include "NVM.h"

#define FEE 无0x00U //对单个位错误不采取任何操作,(用更正的数据进行响应),*/
/*不可纠正的错误读取返回错误(ECC 或奇偶校验故障的多位错误)。 *
/*对于没有 ECC 的设备(它们可能具有奇偶校验或不具有奇偶校验),唯一有效的选项是无。 *
#define FEE 修复0x01U /*通过重新编程可修复单个位"零"错误、单个位"一"错误*/
/*将通过将当前条目标记为无效并将数据复制到新条目来解决,*/
/*不可纠正的错误读取返回错误(ECC 或奇偶校验故障的多位错误)。 *

TI_FEE 驱动器应该为0还是 none-0?  如果是非零、则它在哪里设置?  如果为0、那么 fee_cfg.h 应该来自哪里?

谢谢。

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

    您好!

    此问题已在以下主题中得到解决  

    LAUNCHXL2-570LC43:absense of Driver 头文件-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    请仔细阅读、并告诉我您是否需要进一步澄清。

    --

    谢谢、
    Jagadish。

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

    您好!

    当 我向 ti_fee_cfg.h 添加以下内容时:


    #define TI_FEE 驱动器1U

    构建报告现在显示缺少以下参数。  请帮助我确定应该为这些定义设置的值、我认为这些值将添加到 ti_fee_cfg.h 中  非常感谢。

    >>编译失败
    source/subdir_rules.mk:9:目标'source/example_TI_fee_Write_Read.obj'的配方失败
    "C:/users/plu/documents/TMS_XL2-570LC43-examples/TMS570LC43_fee/include/ti_fee.h"、第330行:错误:标识符"TI_fee_virtual_sector_hout"未定义
    "C:/users/plu/documents/TMS_XL2-570LC43-examples/TMS570LC43_fee/include/ti_fee.h"、第333行:错误:标识符"TI_fee_number_of _virtual_sectors "未定义
    "C:/users/plu/documents/TMS_XL2-570LC43-examples/TMS570LC43_fee/include/ti_fee.h"、第338行:错误:标识符"TI_fee_total_blocks_datases"未定义
    "C:/users/plu/documents/TMS_XL2-570LC43-examples/TMS570LC43_fee/include/ti_fee.h"、第339行:错误:标识符"TI_fee_block_hout"未定义
    "C:/users/plu/Documents/TMS_XL2-570LC43-examples/TMS570LC43_fee/include/ti_fee.h"、第390行:错误:标识符"TI_fee_number_of _blocks"未定义
    "C:/users/plu/documents/TMS_XL2-570LC43-examples/TMS570LC43_fee/include/ti_fee.h"、第400行:错误:标识符"TI_fee_number_of _EEPS"未定义
    在"../SOURCE / Example_TI_FEE 编写读取.c"的编译中检测到6个错误。
    gmake:***[SOURCE /示例_TI_FEE 写_READ.obj]错误1.

    ****构建完成****

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

    您好!

    很抱歉我的回答有延迟。

    这些错误是由于未从 HALCoGen 生成基本代码、  

    如果您从 HALCoGen 生成代码、则将在以下文件中定义该指令  

    我为您创建了一个示例代码、因此请下载并在您的末尾尝试、它在我的末尾成功构建
    在构建所附工程之前、请不要忘记从以下路径下载并安装 F021闪存库。

    Hercules F021FLASHAPI 驱动程序或库|德州仪器 TI.com

    e2e.ti.com/.../TMS570LC_5F00_FEE.zip

    --

    谢谢、

    Jagadish。

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

    很抱歉、我错过了您的回复、可能是因为我的电子邮件通知在一周前不起作用。  我还被其他子项目绑定在一起。

    一旦我有机会、我会立即查看这个问题。  我确实需要收取费用。

    非常感谢。

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

    尊敬的 Peter Lu:

    好的、如果您遇到任何问题、请尝试并告诉我。

    --

    谢谢、

    Jagadish。

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

    您好!

    我确实尝试过您的项目、出于某些奇怪的原因、如果我在部分代码中设置断点并在段中运行代码、它会"正常"运行、但如果我完整运行(在最后一个 while (1)中具有断点)、则运行永远不会结束  我猜、轮询操作完成的各个部分执行得太紧(尽管存在延迟)、以至于硬件无法设置正确的状态、或者数据缓存可能导致软件无法读取正确(易失性)状态。

    您能否在设置中验证项目是否会运行到完成?  可能是我的硬件损坏/不同。

    我没有检查项目的每个阶段是否都在做"正确"的事情、而是在各个部分运行"正常"的情况下、只是有一个构建和运行的收费项目、这是一个很好的进展。

    非常感谢;

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

    在我的硬件设置中,在“while (Status != idle)"之后添加 delay()可确保以下 TI_fee_xxx()操作正常运行。  我想硬件需要一段时间才能执行下一个操作。

    请告诉我您的硬件是否也是如此。  谢谢你。

    	do
    	{
    		TI_Fee_MainFunction();
    		delay();
    		Status=TI_Fee_GetStatus(0);
    	}
    	while(Status!=IDLE);
    	delay();
    	

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

    我稍微修改了代码、以添加必要的延迟并打印数据。  不幸的是、我看不到(应该)已写入的数据读回。  它似乎没有被读取。  我将.hcg 文件中的块1修改为4096的大小(它是8的大小、它太小而无法容纳100个字节)。  请注意、读取位置15故意设置为0xff 以显示正确的位置。

    您能否仔细检查您的 READ_PTR 区域是否确实读回了应该写的内容?

    非常感谢。

    ===程序输出

    正在启动程序
    正在读取...
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00
    结束程序

    void main(void)
    {
    /* USER CODE BEGIN (3) */
    
        unsigned int BlockNumber;
        unsigned int BlockOffset, Length;
        unsigned char *Read_Ptr=read_data;
        Read_Ptr[15] = 0xff; // just a display marker
    
        unsigned int loop, i;
    
        sciInit();
        printf("Starting program\n");
    
        /* Initialize RAM array.*/
        for(loop=0;loop<sizeof(SpecialRamBlock)/sizeof(SpecialRamBlock[0]);loop++)
            SpecialRamBlock[loop] = loop;
    
        /* Initialize FEE. This will create Virtual sectors, initialize global variables etc.*/
        TI_Fee_Init();
        do {
            TI_Fee_MainFunction();
            delay();
            Status=TI_Fee_GetStatus(0);
        }
        while(Status!= IDLE);
        delay();
    
        /* Write the block into EEP Asynchronously. Block size is configured in ti_fee_cfg.c file. Default Block size is 8 bytes */
        BlockNumber=0x1;
        TI_Fee_WriteAsync(BlockNumber, &SpecialRamBlock[0]);
        do {
            TI_Fee_MainFunction();
            delay();
            Status=TI_Fee_GetStatus(0);
        }
        while(Status!=IDLE);
        delay();
    
        /* Write the block into EEP Synchronously. Write will not happen since data is same. */
        TI_Fee_WriteSync(BlockNumber, &SpecialRamBlock[0]);
    
        /* Read the block with unknown length */
        BlockOffset = 0;
        Length = 0xFFFF;
        oResult=TI_Fee_Read(BlockNumber,BlockOffset,Read_Ptr,Length);
        do {
            TI_Fee_MainFunction();
            delay();
            Status=TI_Fee_GetStatus(0);
        }
        while(Status!=IDLE);
        delay();
    
        printf("Reading...\n");
        for (i = 0; i < DATASZ; i++) {
            printf("%02x ", Read_Ptr[i]);
            if ((i % 16) == 15)
                printf("\n");
        }
        printf("\n");
        
        /* Invalidate a written block  */
        TI_Fee_InvalidateBlock(BlockNumber);
        do {
            TI_Fee_MainFunction();
            delay();
            Status=TI_Fee_GetStatus(0);
        }
        while(Status!=IDLE);
        for (i = 0; i < 3; i++)
            delay();
    
        /* Format bank 7 */
        TI_Fee_Format(0xA5A5A5A5U);
        do {
            TI_Fee_MainFunction();
            delay();
            Status=TI_Fee_GetStatus(0);
        }
        while(Status!=IDLE);
        delay();
    
        printf("Ending program\n");
    
        while(1);
    
    /* USER CODE END */
    }
    

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

    尊敬的 Peter:

    添加延迟是正确的、在之前的数据存储方面、我们将块数量声明为1、大小声明为8字节、因此 EEPROM 中仅存储8字节、因此只需增加块大小并进行检查即可。

    我增加到256、我进行了检查、它对我来说很好。

    --

    谢谢、

    Jagadish。

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

    您好!

    感谢您的确认、这让我希望事情能够/应该起作用。

    我的项目一直在做奇怪的事情、从未可靠或一致地运行。  但是、有时、我确实看到读取数据出现在调试器中。

    在详细了解代码后、我发现了程序中的错误。  线路...

      unsigned char read_data[100]={0};

    需要更改为...

      #define MAXBLKSZ 4096 //需要至少在 Halcogen 中设置块大小

      unsigned char read_data[MAXBLKSZ]={0};

    我不知道为什么您没有看到运行失败、但我的项目在 FEE 读取时过度运行 READ_DATA[]数组、并发生了令人厌恶的情况。

    该项目现在可以在 CCS 11和 CCS12中正常运行。

    非常感谢。

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

    您好!

    我重新排列了代码、以便验证"EE Prom"实际上是作为非易失性存储写入的、并且看不到预期的行为。  我基本上在做:

    fee_init();
    if (downrite) fy_write_async ();
    fee_read();
    fee_show_read();

    用户动态输入定位销变量、以便在项目的任何运行中都可以执行或不执行 FEE 写入。

    如果 FEE 正常工作、如果在运行#1上执行写入操作、而在运行#2上跳过写入操作、FEE _show_read()将显示相同的读取数据。  在运行#1和#2之间没有项目的重新闪存、因此 FEE 内容应该是完整的。

    运行#1中的写入和读取操作正常、但这不足以显示数据实际上写入了一些非易失性存储器。

    我看不到运行#2 (跳过写入)读回在运行#1中写入的数据。  我正在使用 Run->Reset 从调试器重新运行项目、因此在运行之间不会发生项目重新刷写。

    请尝试此实验、并帮助我证明实际操作中确实存在非易失性费用。

    非常感谢。

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

    设置定位销的一种简单方法是:

    sciInit();

    sciSend (sciREG1、15、"Dowrite (y/n):");

    字符 yesno[1];

    sciReceive (sciREG1、1、yesno);

    int fowrite = 0;

    如果(yesno[0]='y')、则 fowrite = 1;

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

    没关系。  FEE 非易失性行为看起来很好、即使程序已被重新刷写(在运行#1和#2之间)。  不知道为什么以前没有这样的行为 、但在某些机器(PC 和 Launchpad)重新启动等之后、FEE 区域就像非易失性存储器一样工作。

    非常感谢。

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

    尊敬的 Peter:

    很高兴听到这个消息、如果一切正常、我们可以关闭这个线程。

    --

    谢谢、

    Jagadish。

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

    谢谢