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:使用 HalCoGen 代码的硬件 CRC

Guru**** 2445440 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/1245862/tms570lc4357-hardware-crc-using-halcogen-code

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

我尝试在半 CPU 轮询模式下使用硬件 CRC。  按照图4中的流程图操作 https://www.ti.com/lit/an/spna235/spna235.pdf

我通过调用以下命令来设置 CRC 模块:

#define data_length 2048
uint8 data[data_length];
g_dmaCTRL crcDmaCtrl ={reinterpret_cast (&(data[0]))、
    重新解释_转换 (&(crcREG1->PSA_SIGREGL1))、
    0、
    1、// FRCNT
    data_length / 8、
    0、
    0、
    0、
    0、
    PORTA_READ_PORTA_WRITE、
    ACCESS_64_BIT、
    ACCESS_64_BIT、
    block_transfer、
    ADDR_INC1、
    地址固定、
    AUTOINIT_OFF};

crcConfig_t crcModuleConfig =
    {CRC_CH1、
    CRC_SEMI CPU、
    crcDmaCtrl. ELCNT,
    crcDmaCtrl. FRCNT、
    0xFFFFFFFF、 //不确定应该放在此处
    0xFFFFFFFF}; //不确定要在此处放置什么内容
crcInit();
dmaEnable();
crcChannelReset (crcREG1、CRC_CH1);
crcSetConfig (crcREG1、&crcModuleConfig);
dmaSetCtrlPacket (DMA_CH8、crcDmaCtrl);
dmaSetChEnable (DMA_CH8、DMA_SW);
while (crcREG1->BUSY);
UINT64 hwCRC =  crcGetSectorSig (crcREG1、CRC_CH1); //始终为零0
如上所述、hwCRC 始终为零。  如何解决此问题?
谢谢。
马特
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Matt、

    我们已开始处理您的问题、并将尽快提供更新。

    --

    谢谢。此致、
    Jagadish。

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

    有任何更新?

    我尝试使用 crcSignGen 和 crcGetPSASig 在完全 CPU 模式下运行 。  我能够使用这些函数获取一个 CRC64。

    但是、我仍然无法使半 CPU 轮询正常工作。  我找到一些 TI 示例代码、但两者都不起作用:

    crcInit()


    dmaEnable()

    /*启用通道0的所有中断*/
    crcEnableNotification (crcREG1、CRC_CH1_CC | CRC_CH1_FAIL | CRC_CH1_OR | CRC_CH1_UR | CRC_CH1_TO);

    crcConfig_t sCrcParams
    g_dmaCTRL g_dmaCTRLPKT

    G_dmaCTRLPKTSADD =(uint32_t)&(myBuffer);/*初始源地址*/
    G_dmaCTRLPKTDADD =(uint32_t)(&(crcREG1->PSA_SIGREGL1));/*初始目标地址*/
    G_dmaCTRLPKTCHCTRL = 0ul/*通道控制*/
    G_dmaCTRLPKTRDSIZE = access_64_bit;/*读取大小*/
    G_dmaCTRLPKTWRSIZE = access_64_bit;/*写大小*/
    G_dmaCTRLPKTFRCNT = 1/*帧计数*/
    G_dmaCTRLPKTELCNT =(buffer_length  + 7ul)/ 8ul/*元素数量*/
    G_dmaCTRLPKTELSOFFSET = 0ul << g_dmaCTRLPKTRDSIZE/*元素源偏移*/
    G_dmaCTRLPKTFRSOFFSET = 0ul << g_dmaCTRLPKTRDSIZE/*帧源偏移*/
    G_dmaCTRLPKTELDOFFSET = 0ul << g_dmaCTRLPKTWRSIZE/*元素目标偏移量*/
    G_dmaCTRLPKTFRDOFFSET = 0ul << g_dmaCTRLPKTWRSIZE/*帧目标偏移量*/
    G_dmaCTRLPKTPORTASGN = 4ul/*仅端口 B */
    G_dmaCTRLPKTTTYPE = FRAME_TRANSMIT;/*传输类型*/
    G_dmaCTRLPKTADDMODERD = ADDR_INC1;/*地址模式读取*/
    G_dmaCTRLPKTADDMODEWR = ADDR_FIXED;/*地址模式 WRITE */
    G_dmaCTRLPKTAUTOINIT = AUTOINIT_OFF;/*自动初始化关闭*/

    sCrcParams.crc_channel = CRC_CH1;
    sCrcParams.mode = CRC_SEMI CPU;
    sCrcParams.pcount = g_dmaCTRLPKTELCNT
    sCrcParams.scount = 1u
    sCrcParams.WDG_PRELOAD = 0U
    sCrcParams.block_PRELOAD = 0u

    crcChannelReset (crcREG1、CRC_CH1);
    crcSetConfig (crcREG1、&sCrcParams);

    dmaSetCtrlPacket (dma_CH0、g_dmaCTRLPKT);
    dmaSetChEnable (DMA_CH0、DMA_SW);

    while ((dmaREG->SWCHENAS & 1ul)|(crcREG1->BUSY & 1ul))
    {
    /*等待直到 DMA 完成匹配并且 CRC 指示块已压缩*/

    Volatile uint64_t u64Signature = 0ULL
    u64Signature = crcGetSectorSig (crcREG1、CRC_CH1);

    /*清除 CH1_CCIT 位*/
    crcREG1->status = CRC_CH1_CC;

    在上述代码之后、u64Signature 始终为0

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

    您好、Matt、

    您可以参考以下主题:

    (+) TMS570LC4357:TMS570LC4357 -如何使用软件触发 CRC -基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    该线程具有一个示例代码。

    --

    谢谢。此致、
    Jagadish。

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

    我有一种可行的实现方案。  随附的文件显示了半导体 CPU、完整 CPU 和仅软件 CRC64的实现。  然后运行 main()代码,如下所示:

    #define DATA_LEN 1280
    uint8_t data[DATA_LEN]

    对于(uint32_t I = 0;I < AVIODD_DATA_LENGTH;I++)
    {
    Data[i]= 0xAA
    while (1)
    {
     uint64_t semi CPU_CRC64 = RunCRC64SemiCPU (reinterpret_cast (DATA)、DATA_LEN  / 8);
     uint64_t FULL_CPU_CRC64 = RunCRC64FullCPU (reinterpret_CRC52 (<uint64_t*> data)、data_LEN  / 8);
     uint64_t swCRC = calc_CRC64 (reinterpret_concrc <uint64_t*>(data)、data_LEN  / 8);
    完整的 CPU 和软件始终产品正确的值: 135059794227838331
    SEMI CPU 会在 循环的每次迭代中生成以下值:
    第一次迭代: 0
    第二次迭代: 2861055741797537
    第三次迭代: 15659176631280312865
    第4次迭代和所有后续迭代生成正确的值: 135059794227838331

    如何在每次使用 Semi CPU 时第一次获得正确的值?

    e2e.ti.com/.../CrcUtils.cpp

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

    您好、Matt、

    请给我一些时间在结束时重现此问题。

    --

    谢谢。此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    每次使用 Semi CPU 时如何第一次获得正确的值?

    您的 HALCoGen 配置是否启用了处理器高速缓存?如果启用了、SRAM 的 MPU 配置是什么?

    查看 TMS570LC43x 16/32 RISC 闪存微控制器技术参考手册(修订版 A)

    • 半 CPU 模式使用 DMA
    • DMA 端口被 分配到 ACP-S 从端口中。

     加速一致性端口(ACP)支持硬件缓存一致性、但  ARM Cortex-R5参考手册中的加速器一致性端口接口会说:

    对于在 CPU 的 MPU 中配置为内部可缓存直通写操作的存储器区域、Cortex-R5 ACP 存储器一致性方案仅提供连接到 ACP 从端口的外部主器件与具有 Cortex-R5组中数据缓存的 CPU 之间的一致性。 它不为配置为可缓存回写的存储器区域提供一致性。

    也就是说、如果包含要进行 CRC 校验的数据的存储器配置为 可高速缓存回写 、这可以解释该问题、因为在失败的迭代中、CRC 的输入可能仅位于处理器 L1数据缓存中、即尚未写回 SRAM。