Other Parts Discussed in Thread: TMS570LC4357, HALCOGEN
器件型号: TMS570LC4357
主题中讨论的其他器件: HALCOGEN
我正在 TMS570LC4357 上使用 MibSPI 和硬件触发的 DMA(擦除中断/ISR)。 我有一个专用 DMA 通道固定到一个 Mibspi。 在某些情况下、我必须使用 DMA 发送长度不同的 MibSPI TX 消息。 为了更改 MibSPI 传输的长度、我使用转移组的起始地址和结束地址。 但为了更改 DMA 长度(有时还包括不同缓冲区的源地址)、我不确定需要更改什么内容。
我已尝试更改 dmaRAMREG->PCP[dmaChannel].ITCOUNT 和 dmaRAMREG->PCP[dmaChannel].ISADDR、但更改它们只会在一些周期内有效、之后 DMA 将停止完全工作。 在这种情况下、MibSPI 发送过时的值。
例如、下面是我为 MibSPI1 设置的 MibSPI DMA 配置:
“
/*寄存器 TX DMA */
g_dmaCTRL g_dmaCTRLPKTSPITx ={0};
G_dmaCTRLPKTSPITx.Sadd =(Uint32)(au16_txdpramSPIData1); /*源地址 */
G_dmaCTRLPKTSPITx.DADD =(Uint32)&(mibspiRAM1->TX[0].data); /*目标 地址 */
G_dmaCTRLPKTSPITX.CHCTRL = 0; /*信道控制 */
G_dmaCTRLPKTSPITx.FRCNT = 1; /*帧计数 */
G_dmaCTRLPKTSPITX.ELCNT = MAX_SPI_TX_BUFFER_SIZE; /*元素计数 */
G_dmaCTRLPKTSPITx.ELDOFFSET = 4; /*元素目标偏移量*/
G_dmaCTRLPKTSPITX.ELSOFFSET = 0; /*元素目标偏移量*/
G_dmaCTRLPKTSPITX.FRDOFFSET = 0; /*帧目标偏移 */
G_dmaCTRLPKTSPITX.FRSOFFSET = 0; /*帧目标偏移 */
G_dmaCTRLPKTSPITx.PORTASGN = PORTA_READ_PORTB_WRITE;
G_dmaCTRLPKTSPITX.RDSIZE = ACCESS_16_BIT; /*读取大小 */
G_dmaCTRLPKTSPITx.WRSIZE = ACCESS_16_BIT; /*写入大小 */
g_dmaCTRLPKTSPITx.tType = FRAME_TRANSFER; /*传输类型 */
G_dmaCTRLPKTSPITX.ADDMODERD = ADDR_INC1; /*地址模式读取 */
G_dmaCTRLPKTSPITx.ADDMODEWR = ADDR_OFFSET; /*地址模式写入 */
G_dmaCTRLPKTSPITx.AUTOINIT = AUTOINIT_OFF; /* autoinit */
/*设置 DMA 控制数据包*/
dmaSetCtrlPacket (DMA_CH16、g_dmaCTRLPKTSPITx);
/*-将 DMA 通道设置为根据硬件请求触发*/
dmaSetChEnable (DMA_CH16、DMA_HW);
/*分配申请 ID */
dmaReqAssign (DMA_CH16、DMA_REQ1);
uint32 bufid = MAX_SPI_TX_BUFFER_SIZE - 1;
uint32 icount = 0;
uint32_t txchannel = 0UL;
/*设置传输通道*/
mibspiREG1->DMACTRL[0]|=(txchannel)<< 16);
/*启用传输 DMA */
mibspiREG1->DMACTRL[0]|= 0x80004000;
/*设置 DMA 传输的初始计数和用于 DMA 传输的缓冲区*/
mibspiREG1->DMACTRL[0]|= (bufid<<24);
mibspiREG1->DMACNTLEN = 0x1;
mibspiREG1->DMACOUNT[0]=(MAX_SPI_TX_BUFFER_SIZE - 1)<< 16;
/*通过 HALCoGen 驱动程序启用 DMA 模块。 */
dmaEnable();
“
其中 MAX_SPI_TX_BUFFER_SIZE 为 128。 我使用“dmaSetChEnable (DMA_CH16、DMA_HW);“触发硬件 DMA。
I 仅使用 MibSPI1 的传输组 0、而不打算使用 MibSPI1 扩展缓冲器。
我每隔 10ms 更改一次 dmaRAMREG->PCP 的长度和缓冲区源地址。 我还想将这个变量 DMA 传输用于与硬件触发 DMA(非中断)、SCI 以及其他接口的兼容模式 SPI。
我已经浏览过这个论坛上的例子和其他问题、但没有一个能解决这个问题。
如何实现可变长度 DMA 传输?