Part Number: MSP430FR6007
Tool/software:
Hi,
I tried to calculate a crc32 with dma support but Unfortunately I get a timeout on this routine, any clue why?
static uint32_t calculateCrcWithDMA(const uint8_t *data, uint16_t length)
{
// Initialize CRC32 hardware - based on TI example
const uint32_t CRC_Init = 0xFFFFFFFF;
CRC32INIRESW0 = CRC_Init & 0x0000FFFF; // Init CRC32 HW module low word
CRC32INIRESW1 = CRC_Init >> 16; // Init CRC32 HW module high word
// DMA setup
DMA_initParam cfg = {0};
cfg.channelSelect = DMA_CHANNEL_0;
cfg.transferModeSelect = DMA_TRANSFER_BLOCK;
cfg.transferSize = length;
cfg.transferUnitSelect = DMA_SIZE_SRCBYTE_DSTBYTE;
cfg.triggerSourceSelect = DMA_TRIGGERSOURCE_23; // software
cfg.triggerTypeSelect = DMA_TRIGGER_HIGH; // level
DMA_init(&cfg);
DMA_setSrcAddress(DMA_CHANNEL_0, (uintptr_t)data, DMA_DIRECTION_INCREMENT);
// For bit-reversed CRC32 (ISO3309), use CRC32DIRBW0_L as per datasheet
DMA_setDstAddress(DMA_CHANNEL_0, (uint32_t)(uintptr_t)(&CRC32DIRBW0_L), DMA_DIRECTION_UNCHANGED);
// Clear DMA interrupt flag before starting
DMA0CTL &= ~DMAIFG;
// start transfer
DMA_enableTransfers(DMA_CHANNEL_0);
DMA_startTransfer(DMA_CHANNEL_0);
// Poll for completion for testing
while (!(DMA0CTL & DMAIFG))
{
__no_operation();
}
// cleanup
DMA_disableTransfers(DMA_CHANNEL_0);
// Read CRC32 result from CRC32INIRESW0/W1 as per datasheet - these serve as both init AND result registers
uint32_t result = ((uint32_t)CRC32INIRESW1 << 16) | CRC32INIRESW0;
return result;
}
#pragma vector = DMA_VECTOR
__interrupt void DMA_ISR(void)
{
switch(__even_in_range(DMAIV, 16))
{
case 2: // DMA0IFG
__bic_SR_register_on_exit(LPM0_bits);
break;
default: break;
}
}