您好!
我正在尝试使用 DMA 将数据从共享 RAM 中的缓冲区传输到 EMIF 地址。 根据(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)的示例、我尝试创建自己的用以下函数初始化 DMA 的类:
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);
}
我尝试只是将一个16位从一个地址传输到另一个地址(元素计数= 1、帧计数= 1)、但未起作用。 EMIF 地址中的数据保持不变(0)。 此外、当我增加帧计数的数量、假设为2时、我停止接收来自 DMA 的 BTC 中断。 当我进行调试时、我可以看到 DMA 正在获得 BTC 中断、FIFO A (寄存器190)的目标地址以及 ChnTrCnt 不断移动。 但是、更改不会反映在存储器中。 我已经尝试更改读写大小、元素数量、帧数量和传输类型等多个参数、但没有成功地将一些数据写入 EMIF 寄存器。
如果有任何关于如何解决此问题的帮助或线索、我会很感激。
感谢你的帮助。
