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.

[参考译文] TMS570LC4357:如何在运行期间改变 DMA 长度和源/目标地址

Guru**** 2894990 points

Other Parts Discussed in Thread: TMS570LC4357, HALCOGEN

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1622757/tms570lc4357-how-to-vary-dma-length-and-source-destination-address-during-runtime

器件型号: 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 传输?