您好!
我无法确定如何在半 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;
}