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:TMS570LC4357 -如何软件触发 CRC

Guru**** 2393725 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1138190/tms570lc4357-tms570lc4357---how-to-sw-trigger-crc

器件型号:TMS570LC4357

您好!

我无法确定如何在半 CPU 模式下触发 CRC 计算、如 spna235的第3.5节所述。

我可以触发 DMA、传输完成(到 PSA_SECSIGREGL1)、但不会发生 CRC 活动(我看到 CRC1寄存器没有变化)

DMA 操作完成后、我将启用 CRC 中断、我认为这可能是启动计算的方法、但这不会产生影响:

提前感谢、

标记

  

呼叫者:

   crcInit();
  
  dmaREG->GCTRL |= 1;                //重置 DMA 模块
  dmaREG->GCTRL &=~1;

  DmaCrcStart (0);
  
  while (!IsDmaCrcFined()) uDMACtr++;
  
  /*在 DMA 进行传输后、CC 中断调用 CPU 来进行签名验证*/
  crcREG1->INT = 0x1F;
  

  while ((crcREG1->status & 1)=0) uCRCCtr++;  //检查 CCIT 位

 //***从不来这里-不会发生 CRC 寄存器更改

  

/

DmaCrcStart
  启动给定扇区的 CRC 计算操作。  使用 IsDmaCrcFined()确定何时完成。   
(小部分 /   
bool DmaCrcStart (uint32 uSector)


     uint32 u64BitChunksToProcess = uSectorSizeBytes[uSector ]/8;
     
// CRC 设置

     crcChannelReset (crcREG1、0);  //重置 CRC 的通道0 1.
     
      crcREG1->CTRL0 &=1;             //重置 PSA 信号调节器
      crcREG1->CTRL0 &=0xFFFFFFFE;    
     
      crcREG1->PCOUNT_REG1 = u64BitChunksToProcess;  // CRC 评估前要压缩的块数
      crcREG1->SCOUNT_REG1 = 1;                      //要压缩的扇区
      crcREG1->BCTOPLD1= 0xFFFFFF;                    //超时
      crcREG1->CTRL2 =0x00000002U;                   //半 CPU 模式
     
     
  
// DMA 设置   
  G_dmaCTRL g_dmaCTRLPKT;
  
  dmaDisable();                                  //为配置更改禁用 DMA -将暂停
                                                  //如果在当前交易中仲裁的边界

   dmaReqAssign (CRC_DMA_CH、DMA_CRC_REQ_CH);            //为此事务分配 DMA 通道
   
   //为 DMA 通道0配置控制包
   G_dmaCTRLPKT.Sadd     =(uint32) GetSectorAddress (uSector);                  //源地址             
   G_dmaCTRLPKT.DADD     =(uint32)&crcREG1 -> PSA_SECSIGREGL1;           //目标 地址= CRC
   G_dmaCTRLPKT.CHCTRL   = 0;                                            /*通道控制           */
  
  //每个帧将把 FRCNT 字节发送到 CRC 引擎
  //所以传输是 SectorSize/64 * 1帧
    G_dmaCTRLPKT.FRCNT    = 1;                       //传输的帧=消息中的字节
   G_dmaCTRLPKT.ELCNT    = u64BitChunksToProcess;   //对 DMA 进行64位传输
  
   G_dmaCTRLPKT.ELDOFFSET = 0;                       //元素目标偏移量
   G_dmaCTRLPKT.ELSOFFSET = 0;                        //元素目标偏移量
   G_dmaCTRLPKT.FRDOFFSET = 0;                        //帧目的偏移量   
   G_dmaCTRLPKT.FRSOFFSET = 0;                       //帧源偏移   
   G_dmaCTRLPKT.PORTASGN = PORTA_READ_PORTB_WRITE;  //读取存储器-写入外设
   G_dmaCTRLPKT.RDSIZE   = ACCESS_64_BIT;           //读取元素大小                  
   G_dmaCTRLPKT.WRSIZE   = ACCESS_64_BIT;            //写入元素大小                 
   G_dmaCTRLPKT.tType    = BLOCK_TRANSFSION;         //传输类型-帧或块
   G_dmaCTRLPKT.ADDMODERD = ADDR_INC1;               //每次移动后使读取指针递增
   G_dmaCTRLPKT.ADDMODEWR = ADDR_FIXED;             //固定写入指针(PSA_SECSIGREGL1)
   G_dmaCTRLPKT.AUTOINIT = AUTOINIT_OFF;          /*自动初始                  化*/
  
  
   dmaSetCtrlPacket (crc_dma_dma_ch、g_dmaCTRLPKT);
  dmaREG->FTCFLAG |=(1<
   dmaREG->BTFLAG |=(1<
   dmaSetChEnable (CRC_DMA_CH、DMA_SW);                   //启用 DMA 倒角0并启用软件触发
  
  dmaEnable();
  
  
  返回 true;
}      

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

    **没关系**我想知道了-我是在写入 PSA_SECSIGREGL1而不是 PSA_SIGREGL1 (这一点一点一点也不令人困惑...)