Other Parts Discussed in Thread: HALCOGEN
Tool/software:
Hello TI Support,
I am using a TMS570LC4357 board (recently purchased from DigiKey) and am unable to get DMA working at all—not even for a simple memory-to-memory transfer. I have followed all TI documentation and E2E advice, and have verified the following:
What I have done:
.dmaRAM
is mapped to0xFFF80000
in my linker file:
-
DMARAM (RW) : origin=0xFFF80000 length=0x00000800 ... .dmaRAM : {} > DMARAM
- I call
systemInit()
at the start ofmain()
, soperiphInit()
is called and all peripherals are powered up. - I use the standard TI DMA driver (
HL_sys_dma.c
from HALCoGen). - My test code is a minimal memory-to-memory DMA transfer (see below).
- Both
src_data
anddst_data
are in RAM (addresses like0x08001540
). - DMA registers are accessible in the debugger.
dmaREG->GCTRL
is0x00010300
afterdmaEnable()
.- No errors are reported in
dmaREG->DMASTAT
ordmaREG->BERFLAG
. - Polling UART works perfectly—so the board is not dead.
- I have tried both
DMA_CH0
andDMA_CH1
, and both software and hardware triggers. - I have tried a full power cycle, different CCS versions, and a clean project.
What I observe:
- After calling
dmaSetChEnable(DMA_CHx, DMA_SW);
, theSWChnEnaSet
register does not “stick” (always reads as 0, which I understand is normal for a trigger register). - DMA transfer never starts—
dmaGetInterruptStatus(DMA_CHx, BTC)
is always false, anddst_data
remains all zeros. - No errors are reported in any DMA error register.
- Manually writing to
SWChnEnaSet
in the debugger has no effect. - The same issue occurs for all DMA-based operations (UART, memory-to-memory, etc.).
Minimal test code:
#include "HL_sys_common.h"
#include "HL_sys_dma.h"
#include "HL_system.h"
#define SIZE 4
uint8_t src_data[SIZE] = {1, 2, 3, 4};
uint8_t dst_data[SIZE] = {0};
g_dmaCTRL g_dmaCTRLPKT;
int main(void)
{
systemInit();
dmaEnable();
g_dmaCTRLPKT.SADD = (uint32_t)src_data;
g_dmaCTRLPKT.DADD = (uint32_t)dst_data;
g_dmaCTRLPKT.CHCTRL = 0;
g_dmaCTRLPKT.FRCNT = SIZE;
g_dmaCTRLPKT.ELCNT = 1;
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_8_BIT;
g_dmaCTRLPKT.WRSIZE = ACCESS_8_BIT;
g_dmaCTRLPKT.TTYPE = FRAME_TRANSFER;
g_dmaCTRLPKT.ADDMODERD = ADDR_INC1;
g_dmaCTRLPKT.ADDMODEWR = ADDR_INC1;
g_dmaCTRLPKT.AUTOINIT = AUTOINIT_OFF;
dmaSetCtrlPacket(DMA_CH1, g_dmaCTRLPKT);
dmaSetChEnable(DMA_CH1, DMA_SW); // Software trigger
while (dmaGetInterruptStatus(DMA_CH1, BTC) != TRUE);
while (1);
}
What I need help with:
- Is there any known silicon, board, or toolchain issue that would prevent DMA from working on a new TMS570LC4357 board?
- Is there any additional step required to enable DMA on this device?
- Is there a way to further diagnose why the DMA controller is not accepting triggers or starting transfers?
Thank you for your help!
I am happy to provide any additional information, screenshots, or project files as needed.
Best regards,
Nirmal Thyvalappil Muraleedharan