Hi,
I am trying to transfer data from a buffer located in shared RAM to an EMIF address using DMA. Based on the example from (https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1046746/tms570lc4357-how-to-read-and-write-data-from-nvsram-using-the-emif-interface-via-dma) I tried to create my own class that initializes the DMA with the following function:
constexpr uint16_t Minor_frame_length {2048}; constexpr uint8_t Major_frame_length {1}; // /********************** // * Buffer Instantiation // ***********************/ #pragma SET_DATA_SECTION(".sharedRAM") uint32_t major_frame_buffer[Minor_frame_length*Major_frame_length]; #pragma SET_DATA_SECTION() void init(){ // Set EMIF Addr this->EMIF_addr = (uint32_t*) (EMIF_Registers::EMIF_1_ADDR + EMIF_Registers::START_ADDR); // Set DMA Contro packet this->dma_control_packet.SADD = ((uintptr_t) &this->buffer[16]); /* source address, reading from shared RAM */ this->dma_control_packet.DADD = (uintptr_t)this->EMIF_addr; /* dst address, writing to EMIF addr of BRAM */ this->dma_control_packet.ELCNT = 1; /* element count */ this->dma_control_packet.FRCNT = 1; /* frame count */ this->dma_control_packet.CHCTRL = 0; /* Next channel to be triggered */ this->dma_control_packet.ELDOFFSET = 0; /* element destination offset */ this->dma_control_packet.ELSOFFSET = 0; this->dma_control_packet.FRDOFFSET = 0; /* frame destination offset */ this->dma_control_packet.FRSOFFSET = 0; /* frame source offset */ this->dma_control_packet.PORTASGN = PORTA_READ_PORTA_WRITE; /* Read from shared RAM and write to EMIF */ this->dma_control_packet.RDSIZE = ACCESS_16_BIT; this->dma_control_packet.WRSIZE = ACCESS_16_BIT; this->dma_control_packet.TTYPE = FRAME_TRANSFER; /* transfer type */ this->dma_control_packet.ADDMODEWR = ADDR_INC1; /* address mode write */ this->dma_control_packet.ADDMODERD = ADDR_FIXED; /* address mode read */ this->dma_control_packet.AUTOINIT = AUTOINIT_ON; /* autoinit */ dmaSetCtrlPacket(this->dmaChannel, this->dma_control_packet); // Set interrupt handlers dmaInterrupt_t dma_interrupt = BTC; dmaIrqHandler.setIrqHandler((void*) &dma_interrupt, this->dmaChannel, this); dmaEnableInterrupt(this->dmaChannel, dma_interrupt, DMA_INTA); dmaSetChEnable(this->dmaChannel, DMA_SW); }
I tried just transferring a 16bits from one address to another one (Element count = 1, Frame Count = 1), but it didn't work. The data in the EMIF address remains the same (0). Also, when I increase the number of Frame Count, let's say to 2, I stop receiving the BTC interrupt from the DMA. When I debug, I can see that the DMA is getting the BTC interrupt and the destination address of the FIFO A (register 190) keeps moving as well as the ChnTrCnt. However, the change is not reflected in memory. I have tried changing several parameters like the read and write size, element count, frame count and transfer type but I have not managed to succeed on getting some data into the EMIF register.
I would appreciate any help or clue on how to fix this.
Thanks for your help.