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.

[参考译文] RM57L843:具有较大内存区域的 CRC 模块

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/660382/rm57l843-crc-module-with-large-memory-areas

器件型号:RM57L843

您好!

我正在使用 CRC64模块对文件进行集成测试。 对于较小的文件、它可以正常工作、但使用较大的文件不能按预期工作。

我想将存储器区域拆分为 int 32 KB 块(或更小的块)、然后我希望这些块的结果作为下一次计算的初始矢量。

我看不到在哪里设置初始矢量。

我在半模式和 DMA 访问中使用 CRC 模块。

有人有什么想法吗?

谢谢你

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

    我不知道大文件不起作用的原因。 如果使用多个扇区、则需要为每个扇区提供预计算的 CRC 值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Daniel、您好!

    随附的 CCS7项目可用于计算具有半 CPU 和 DMA 的 CRC。 从0x0开始从闪存读取数据、段大小为8160*32。 您可以更改 RM57器件的工程属性。  

    e2e.ti.com/.../5483.TMS570LC4357_5F00_CRC.zip

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

    您好 QJ、

    感谢您的快速响应。

    我的故障曾经是或可能是在 DMA 配置中。

    我已经将模式设置为帧传输模式、现在我更改为块传输模式。

    示例中的闪存大小有固定大小、永远不会更改。 我的文件在大小和对齐方面是动态的。 因此、我还必须动态设置 FRCNT 和 ELCNT。 但文件大小并不总是可以被2、4、8等整除  这里的解决方案是什么? 我是否必须搜索最大的除数? 还是应将 FRCNT 设置为文件大小、并将 ELCNT 设置为1? 是否无法使用具有不同尺寸的扇区? 例如、当我将一个150KB 的文件拆分为两个64 KB 和一个26 KB 的三个扇区时。 下面我附上了我的源代码、感谢您的回答。

    uint64_t crcCalc (crcBASE-t * CRC、uint32_t addr、uint32_t size){
       静态 uint32_t init;
       volatile uint64 u64Signature = 0;
       if (init _EQ_ 0){
           crcInit();
           init++;
       }

       /*启用 DMA 模块:这将使 DMA 退出复位*/
       dmaEnable();

       crcConfig_t sCrcParams;
       G_dmaCTRL g_dmaCTRLPKT;

     /*配置 DMA 控件打包(结构是 dma.c 的一部分)*/
       G_dmaCTRLPKT.Sadd     = addr; //初始源地址*/
       G_dmaCTRLPKT.DADD     =(uint32_t)(&(crcREG->PSA_SIGREGL1));/*初始目标地址*
       G_dmaCTRLPKT.CHCTRL   = 0ul;/*通道控制*
       G_dmaCTRLPKT.RDSIZE   = ACCESS_64_BIT;/*读取大小*
       G_dmaCTRLPKT.WRSIZE   = ACCESS_64_BIT;/*写入大小*
       G_dmaCTRLPKT.FRCNT    =大小;/*帧计数*/
       G_dmaCTRLPKT.ELCNT    = 1;  /*元素计数*/
       G_dmaCTRLPKPT.ELSOFFSET = 0ul << g_dmaCTRLPKT.RDSIZE;//元素源偏移量*/
       G_dmaCTRLPKPT.FRSOFFSET = 0ul << g_dmaCTRLPKT.RDSIZE;/*帧源偏移*
       G_dmaCTRLPKT.ELDOFFSET = 0ul << g_dmaCTRLPKT.WRSIZE;//元素目标偏移量*/
       G_dmaCTRLPKPT.FRDOFFSET = 0ul << g_dmaCTRLPKPT.WRSIZE;//帧目标偏移量*
       G_dmaCTRLPKT.PORTASGN = 1ul;/*端口 A 读取(闪存)-端口 B 写入(CRC)*
       G_dmaCTRLPKT.tType    = block_transfer;/* transfer type *
       G_dmaCTRLPKT.ADDMODERD = ADDR_INC1;    /*地址模式读取*
       G_dmaCTRLPKT.ADDMODEWR = ADDR_FIXED;    /*地址模式写入*/
       G_dmaCTRLPKT.AUTOINIT = AUTOINIT_OFF;    /*自动初始化关闭*/

       sCrcParams.crc_channel  = CRC_CH1;
       sCrcParams.mode         = CRC_Semy_CPU;
       sCrcParams.pcount       = g_dmaCTRLPKT.ELCNT;
       sCrcParams.scount       = 1U;
       sCrcParams.WDG_PRELOAD  = 0U;
       sCrcParams.block_PRELOAD = 0U;

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

       /*将 DMA 控制包分配给通道0 */
       dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT);

       /*触发 DMA 通道0 s/w 请求*/
       dmaSetChEnable (DMA_CH0、DMA_SW);

       while ((dmaREG->SWCHENAS & 1ul)|(crcREG->BUSY & 1ul))
       {
           //等待 DMA 完成,CRC 表示块已压缩*/
       }

       u64Signature = crcGetSectorSig (crcREG、CRC_CH1);

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

    返回 u64签名;

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

    访问大小为64位(8字节)。 您可以将0附加到文件、使文件大小可以被8除。 设置 FRCNT=fileSize/8和 ELCNT=1没有问题。 最好对所有扇区使用相同的大小、但可以使用不同大小的扇区。 对于不同的扇区大小、您需要将不同的值编程到 PCOUNT_REG1中。

    sCrcParams.pcount = g_dmaCTRLPKT.ELCNT;应为.FRCNT