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.

[参考译文] RM44L920:CRC 问题

Guru**** 2390735 points
Other Parts Discussed in Thread: RM44L920

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/801742/rm44l920-crc-question

器件型号:RM44L920

你(们)好

   我想问 PSA_SIGREGH1和 PSA_SIGREGL1 是什么意思、以及如何使用它们。

  如果我使用 RM44L920、则说明  CRC 模块使用固定的64位多项式  f (x)=x^64 + x^4 + x^3 +x +1。

  那么 、我如何设置它呢?

  此致

   hk

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您能否检查本文档是否能回答您的问题?
    www.ti.com/.../spna146.pdf

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

    请找到半 CPU 模式下的 CRC 计算:


    int main (空)

    /*用户代码开始(3)*/
    uint32_t i、计数器;
    /*手动清除 ESM 错误*/
    esmREG->SR1[2]= 0x00000008U;
    esmREG->SSR2 = 0x00000008U;
    esmREG->EKR = 0x0000000AU;
    esmREG->EKR = 0x00000005U;

    //使用 CRC 自动模式
    crcInit();
    _enable_IRQ ();

    /**-重置 PSA*/
    crcREG->CTRL0 =(uint32)((uint32) 1U <<0U)
    |(uint32)((uint32) 1U <<8U);

    /**-设置数据捕获模式以清除 PSA 计数器*/
    crcREG->CTRL2 = 0x00000000;

    /**-从重置中拉出 PSA */
    crcREG->CTRL0=0x00000000U;

    /**-设置通道1的数据跟踪*/
    crcREG->CTRL2 |=(uint32) 0U <<4U;

    //更改为 CRC 半 CPU 模式
    crcREG->CTRL2 =(uint32)(crc_semi CPU);//使用的是半 CPU 模式

    crcREG->SCOUNT_REG1= 0x1;
    crcREG->PCOUNT_REG1= 0x20;/*32双字;crc_pattern.c*/中定义的 CRC 模式的长度

    crcDisableNotification (crcREG、0x1F1F);
    crcEnableNotification (crcREG、CRC_CH1_CC);//通道1压缩完成中断

    dma_config.Sadd =(uint32_t)&crc_Pattern[0];
    dma_config.dADD =(UINT32_t)&(crcREG->PSA_SIGREGL1);
    DMA_CONFIG.CHCTRL = 0;
    DMA_CONFIG.FRCNT = 0x20;//0x20、64位、CRC 模式的长度
    DMA_CONFIG.ELCNT = 1;

    DMA_CONFIG.ELDOFFSET = 0;
    DMA_CONFIG.ELSOFFSET = 0;
    DMA_CONFIG.FRDOFFSET = 0;
    DMA_CONFIG.FRSOFFSET = 0;
    DMA_CONFIG.PORTASGN = 4;
    DMA_CONFIG.RDSIZE = ACCESS_64_BIT;
    DMA_CONFIG.WRSIZE = ACCESS_64_BIT;
    dma_config.tType = block_transfer;
    dma_config.ADDMODERD = ADDR_INC1;
    DMA_CONFIG.ADDMODEWR = ADDR_FIXED;
    DMA_CONFIG.AUTOINIT = AUTOINIT_OFF;

    //为接收设置 DMA 控制数据包
    dmaSetCtrlPacket (DMA_CH0、DMA_CONFIG);
    dmaReqAssign (DMA_CH0、26);//DMA 请求线路26、CRC1通道0
    dmaSetChEnable (DMA_CH0、DMA_SW);

    dmaEnable();

    //延迟
    对于(i=0;i<0x100000;i++);

    如果((CRC_Test[0]=CRC_Ref[0])&&(CRC_Test[1]=CRC_Ref[1]))

    CRC_ERROR = 0;
    }否则{
    CRC_ERROR = 1;


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

    返回0;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好
    非常感谢您的回复。 我知道如何使用 CRC。 但我有一个问题:为什么添加延迟时间程序
    //延迟
    对于(i=0;i<0x100000;i++);

    如果要等待 CRC 计算完成的判断,为什么不使用 CRC 寄存器的忙标志来判断?

    谢谢、此致、
    hk