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.

MSP430FR6007: 32 bit checksum with dma support

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;
    }
}

  • >  cfg.triggerSourceSelect = DMA_TRIGGERSOURCE_23; // software

    Based on data sheet (SLASEV3A) Table 9-11 and User Guide (SLAU367P) Table 11-2 I think a trigger of 23 can only be used by the EUSCI, i.e. setting DMAREQ won't trigger the transfer. 

    Try instead:

    >  cfg.triggerSourceSelect = DMA_TRIGGERSOURCE_0; // software

**Attention** This is a public forum