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:CRC 控制器用于计算加电 CRC、用于通过 CAN 进行数据传输和接收的 CRC。

Guru**** 2524550 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/757772/tms570lc4357-crc-controller-usage-for-calculation-of-power-on-crc-crc-for-data-transmission-and-reception-with-can

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

下面简要介绍一下使用 CRC 控制器的方法  

1、上电 CRC 计算。(自动模式下的闪存和 RAM 区域 CRC 计算)

使用 CAN 进行数据传输和接收的 CRC 计算。

我使用以下工具、

Code Composer Studio 版本:8.1.0.00011和 Halcogen 版本4.06.00

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

    HALCoGen 有一个 CRC 示例。 它逐步显示了 CRC 配置。 TRM 包含一章有关 CRC 的内容、其中包含多个示例。

    LC4357器件中的 CRC 模块采用64位多项式实现、如 f (x)= x^64 + x ^4 + x^3 + x + 1中所示。

    RAM 上的 CRC 不是一个好的解决方案、因为 RAM 的内容将动态变化。 因此、您不知道要与之进行比较的黄金签名。

    如果您希望定期执行、闪存上的 CRC 是一个很好的解决方案。 我将在启动时建议在 RAM 上使用 PBIST。 请记住、在运行期间、每次访问时、闪存和 RAM 都受到 ECC 保护。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、QJ Wang、

    感谢您的回答。

    我已经检查了"18.3.2不使用基于时间的触发的自动模式示例"部分中给出的示例。

    如果我需要计算闪存的 CRC、如何在自动模式下确定4MB 闪存大小的"预先确定 CRC"。

    我是否需要使用以下代码来计算“预先确定的 CRC”?

    输入电压范围
      NEW_CRC_VAL (0):= CRC_VAL (63) XOR 数据(I);
       对于 j in 1到63 loop
         情况 j 为
          当1|3|4=>时
            NEW_CRC_VAL (j):=
             CRC_VAL (j - 1) XOR CRC_VAL (63) XOR 数据(I);
          当他人=>时
            NEW_CRC_VAL (j):= CRC_VAL (j - 1);
         结束病例;
       结束循环;
      CRC_VAL:= NEW_CRC_VAL;
    结束环路

    只有一个 CRC 值足以进行计算或需要计算每个扇区的 CRC 值?   

    请确认。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可能会发现有关此帖子的信息很有用: e2e.ti.com/.../2805284
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的更新。

    我已将该线程称为"e2e.ti.com/.../2805284 、并使用 halcogen 更新了自动化代码、并附加了完整代码。


    更新后的代码类似于 TRM 的"18.3.1示例:使用基于时间的事件触发的自动模式"、不同之处在于我使用了 SW 触发器、而不是较大的内存区域、而是使用了"CRC_TEST_VALUE = 0x8DF8A32C74B91F3E"的 CRC 计算。

    在代码中 、CH0和 CH1用于设置 DMA。

    以下是代码、

    /*包含文件*/

    #include "hL_sys_common.h"

    /*用户代码开始(1)*/
    #include "HL_CRC.h"
    #include "HL_SYS_DMA.h"

    /*用户代码结束*/

    /**@fn void main (void)
    *@应用程序主函数简介
    *@请注意、默认情况下、此函数为空。
    *
    *此函数在启动后调用。
    *用户可以使用此函数来实现应用程序。
    *

    /*用户代码开始(2)*/
    #define FRAME_COUNT 0x1
    #define Element_count 0x2

    G_dmaCTRL g_dmaCTRLPKT0、g_dmaCTRLPKT1;// DMA 控制数据包配置堆栈

    int main (空)

    /*用户代码开始(3)*/

    uint64 Result_CRC = 0U;
    _enable_IRQ ();
    uint64 CRC_TEST_VALUE = 0x8DF8A32C74B91F3E;
    crcInit();
    Result _CRC = CRC_UPDATE_WORD (0U、CRC_TEST_VALUE);


    crcREG1->PCOUNT_REG1= frame_count * element_count;
    crcREG1->SCOUNT_REG1 = 1;

    crcEnableNotification (crcREG1,1);

    G_dmaCTRLPKT0.Sadd =(uint32_t)(&(Result_CRC));
    g_dmaCTRLPKT0.DADD =(uint32_t)(&(crcREG1->REGL1));
    G_dmaCTRLPKT0.CHCTRL = 0;
    G_dmaCTRLPKT0.FRCNT = FRAME_COUNT;
    G_dmaCTRLPKT0.ELCNT = Element_count;

    G_dmaCTRLPKT0.ELDOFFSET = 0;
    G_dmaCTRLPKT0.ELSOFFSET = 0;
    G_dmaCTRLPKT0.FRDOFFSET = 0;
    G_dmaCTRLPKT0.FRSOFFSET = 0;
    G_dmaCTRLPKT0.PORTASGN = PORTA_READ_PORTB_WRITE;
    G_dmaCTRLPKT0.RDSIZE = ACCESS_64_BIT;
    G_dmaCTRLPKT0.WRSIZE = ACCESS_64_BIT;
    G_dmaCTRLPKT0.tType = BLOCK_TRANSFSION;
    G_dmaCTRLPKT0.ADDMODERD = ADDR_INC1;
    G_dmaCTRLPKT0.ADDMODEWR = ADDR_FIXED;
    G_dmaCTRLPKT0.AUTOINIT = AUTOINIT_ON;

    //为接收设置 DMA 控制数据包
    dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT0);
    dmaSetChEnable (DMA_CH0、DMA_SW);

    G_dmaCTRLPKT1.Sadd =(uint32_t)(&(CRC_TEST_VALUE));
    G_dmaCTRLPKT1.DADD =(uint32_t)(&(crcREG1->PSA_SIGREGL1));
    G_dmaCTRLPKT1.CHCTTRL = 0;
    G_dmaCTRLPKT1.FRCNT = FRAME_COUNT;
    G_dmaCTRLPKT1.ELCNT = Element_count;

    G_dmaCTRLPKT1.ELDOFFSET = 0;
    G_dmaCTRLPKT1.ELSOFFSET = 0;
    G_dmaCTRLPKT1.FRDOFFSET = 0;
    G_dmaCTRLPKT1.FRSOFFSET = 0;
    G_dmaCTRLPKT1.PORTASGN = PORTA_READ_PORTB_WRITE;
    G_dmaCTRLPKT1.RDSIZE = ACCESS_64_BIT;
    G_dmaCTRLPKT1.WRSIZE = ACCESS_64_BIT;
    G_dmaCTRLPKT1.tType = BLOCK_TRANSFSION;
    G_dmaCTRLPKT1.ADDMODERD = ADDR_FIXED;
    G_dmaCTRLPKT1.ADDMODEWR = ADDR_FIXED;
    G_dmaCTRLPKT1.AUTOINIT = AUTOINIT_ON;

    //为接收设置 DMA 控制数据包
    dmaSetCtrlPacket (dma_ch1、g_dmaCTRLPKT1);
    dmaSetChEnable (DMA_CH1、DMA_SW);

    dmaEnable();

    while (1);
    /*用户代码结束*/

    返回0;

    /*用户代码开始(4)*/

    /*用户代码结束*/

    ------------------------------------------------------

    我使用了以下代码来计算预先确定的 CRC 值、

    uint64 crc_update_word (uint64 CRC、uint64数据)

    int i、j;
    uint64 nextCrc = 0;
    //对于63到0环路中的 I
    for (i = 63;i >=0;i---)

    // next _CRC_VAL (0):= CRC_VAL (63) XOR data (I);
    nextCrc =(nextCrc &(uint64) 0xfffffffffffffffffffffffffe)|((CRC >> 63)^(data >> I));
    //对于 j in 1到63循环
    对于(j = 1;j < 64;j++)

    //case j 为
    //当1|3|4 =>时
    if (j = 1 || j = 3 || j = 4)

    // NEW_CRC_VAL (j):= CRC_VAL (j - 1) XOR CRC_VAL (63) XOR DATA (i);
    nextCrc =(nextCrc &~((uint64) 1 << j))|((((CRC >>(j-1)))^(CRC >> 63)^(data >> I))& 1)<< j);

    其他
    {//当其他人=>时
    // next _CRC_VAL (j):= CRC_VAL (j - 1);
    nextCrc =(nextCrc &~((uint64) 1 << j))|((((CRC >>(j-1))& 1)<< j);

    //结束大小写;
    }//结束循环;
    CRC = nextCrc;
    }//结束循环

    返回 CRC;

    在项目执行后、出现在 CRC 值寄存器和 PSA 扇区签名寄存器中的值如下所示、

    Crc1_CRC_ValL1 000000FB
    Crc1_CRC_ValH1 0000008C
    Crc1_PsaSecSigL1 0000CFB2
    Crc1_PsaSecSigH1 0000A088

    问题:预先确定的 CRC 值未正确地从源地址传输到目标地址(CRC 值寄存器)。

    PSA 签名寄存器的类似情况。 DMA 设置可能有问题。

    请您检查代码并提供响应。

    我使用的是 Code Composer Studio 版本:8.1.0.00011和 Halcogen 版本4.06.00

    e2e.ti.com/.../4452.halcogen_5F00_example.zip

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

    是否有人可以查看问题并作出回应?

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

    CRC1使用 DMA 通道26
    dmaReqAssign (DMA_CH0、DMA_REQ26);
    2.测试用例中的 PCOUNT 应为1 (64位数据)
    3.帧数和元素数都应为1
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、QJ Wang、

    感谢您的回答。 我根据建议修改了代码。

    我还修改  了 MPU 默认设置。 在 HalCoGen 区域3中、默认设置为"MPU_PRIV_RW_USER_RW_NOexec"。 我将该区域设置为 MPU_PRIV_RW_USER_RW_EXEC。 然后、我可以看到 CRC 值寄存器中的值。

    我观察到 CRC 值寄存器和 PSA 扇区寄存器的值。

    Crc1_CrcValL1的内容= Crc1_PsaSecSig_H1的内容

    Crc1_CrcValH1的内容= Crc1_PsaSecSig_L1的内容。

    在比较之前、我是否需要交换 CRC 值寄存器的内容?  

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

    使用 HW CRC 的 CRC 值与使用 CRC_UPDATE_WORD ()的 CRC 值之间有何区别?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。



    您好、QJ Wang、

    我已经针对各种"CRC_TEST_VALUT"值在自动模式下计算了 CRC 值。

    下表详细说明了"CRC_TEST_Value"及其各自从"CRC_UPDATE_WORD ()"和"HW CRC"获取的 CRC 值(针对4个"CRC_TEST_VALUE ")。

    "CRC_UPDATE_WORD"中为第一个"CRC_TEST_VALUE =0x1234567812345678"获取的 CRC 值 为

    CRC_Value_L1 = 84BB2EC9和  CRC_Value_H1 = 84BB2ED3。

    "HWCRC 模块"获取的第一个"CRC_TEST_VALUE =0x1234567812345678"的 CRC 值 为、

    PsaSecSig_L1 =84BB2ED3和  PsaSecSig_H1 = 84BB2EC9

    据观察、 CRC_value_L1和 CRC_value_H1的内容   分别与 PsaSecSig_H1和 PsaSecSig_L1的内容匹配。

    对于下表中剩余的"CRC_TEST_Value"、 CRC_value_L1和  CRC_value_H1  与  PsaSecSig_H1和 PsaSecSig_L1的内容匹 配、"除了最后8位"。  

    CRC_TEST_VALUE

    使用"crc_update_word_()"的 CRC 值

    使用硬件 CRC 模块 CRC 控制器获得的 CRC 值

     

    CRC_Value_L1

    CRC_Value_H1

    PsaSecSig_L1

    PsaSecSig_H1

    0x1234567812345678

    84BB2EC9.

    84BB2ED3.

    84BB2ED3.

    84BB2EC9.

     

     

     

     

     

    0xAB234538EF2487DE

    164BB500

    BA01CBF0

    BA01CB7C

    164BB5D0

     

     

     

     

     

    0x5600321C36891642

    2A02E706

    8742EC7D

    8742ECF1

    2A02E732

     

     

     

     

     

    0xEA0012B6EAFFFFE

    CE018902

    C700000CA

    C7000001A

    CE0189D2

    是否需要对"crc_update_worth()"进行任何更新、要获得最后8位的正确 CRC 值、请检查并确认。

    谢谢、

    Sudhakar

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

    您好、QJ Wang、

    参考链接e2e.ti.com/.../2805284后、我在为函数提供输入之前交换了高32位和低32位、然后可以获得 CRC 值寄存器和 PSA 扇区寄存器的正确值。 我还使用了"crc_update_word ()"函数"crc_t crc_update (crc_t crc、const void * data、size_t data_len)"、而不是"crc_update_word ()"函数。

    非常感谢您的参与和帮助。


    谢谢、
    Sudhakar