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:寄存器:使用 EP 和 DMA 进行批量传输

Guru**** 2763585 points

Other Parts Discussed in Thread: LAUNCHXL2-570LC43, TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1603277/tms570lc4357-ep-reg-using-sci-with-dma-for-bulk-transfer

器件型号: TMS570LC4357-TMS570LC4357 EP
主题中讨论的其他器件: LAUNCHXL2-570LC43HALCOGEN、TMS570LC4357

Hai Team、

我将 TMS570LC4357-SCI2 控制器与 LAUNCHXL2-570LC43 (B) 开发套件一起使用、在此过程中、我已经以 9600bps 波特率、2 个停止位且无奇偶校验来初始化了卤代中的 EP 和 SCI2。 已启用 Rx 中断、我尝试在信号帧中发送大约 32 字节的数据、并使用 docklight 在终端端进行监测。 但问题是未发生传输且未发生 DMA 中断。 我已经分享了 refernee 的测试代码。 请做必要的事情。

#include “HL_sys_common.h"</s>“
#include “HL_sci.h"</s>“
#include “HL_sys_dma.h"</s>“
#include “HL_sys_vim.h"</s>“
#include “HL_system.h"</s>“

//* TMS570LC4357 的 DMA 请求分配*/

/* SCI DMA 使能位*/
#define SCI_SET_TX_DMA   (1<<16)
#define SCI_SET_RX_DMA   (1<<17)
#define SCI_SET_RX_DMA_ALL (1<18)

/*缓冲区大小*/
#define BUFFER_SIZE 32

/*缓冲区 — 必须在共享 RAM 中*/
pragma DATA_SECTION (TX_DATA、“.sharedRAM")“)
pragma DATA_SECTION (RX_DATA、“.sharedRAM")“)
uint8 tx_data[buffer_size];
uint8 RX_DATA[BUFFER_SIZE];

g_dmaCTRL g_dmaCTRLPKT1、g_dmaCTRLPKT2;

/* SCI 寄存器地址 — 处理字节序*/
#if ((__little_endian _= 1)||(__little_ENDIAN__= 1))
  #define SCI2_TX_ADDR ((Uint32)(&(sciREG2->td))
  #define SCI2_RX_ADDR ((Uint32)(&(sciREG2->RD))
#else
  #define SCI1_TX_ADDR ((Uint32)(&(sciREG1->td))+ 3)
  #define SCI1_RX_ADDR ((Uint32)(&(sciREG1->RD)+ 3)

  #define SCI2_TX_ADDR ((Uint32)(&(sciREG2->td))+3)
  #define SCI2_RX_ADDR ((Uint32)(&(sciREG2->RD))+3)
#endif

内部 main (void)

  Uint32 sciTxData、sciRxData;
  int i;

  /*加载测试数据*/
  对于 (I = 0;I < BUFFER_SIZE;I++)
  {
    TX_DATA[i]= i;
  }

  /*初始化 SCI */
  sciInit();

  /*启用 DMA */
  dmaEnable();
#if 0
  /*将 DMA 请求 SCI1 TX 分配给通道 0 */
  dmaReqAssign (DMA_CH0、DMA_REQ29);

  /*将 DMA 请求 SCI1 RX 分配到通道 1 */
  dmaReqAssign (DMA_CH1、DMA_REQ28);

  sciTxData = SCI1_TX_ADDR;
  sciRxData = SCI1_RX_ADDR;

#else
  /*将 DMA 请求 SCI2 TX 分配给通道 0 */
  dmaReqAssign (DMA_CH0、DMA_REQ41);

  /*将 DMA 请求 SCI2 RX 分配给通道 1 */
  dmaReqAssign (DMA_CH1、DMA_REQ40);

  sciTxData = SCI2_TX_ADDR;
  sciRxData = SCI2_RX_ADDR;
#endif
  /*为 TX(通道 0)配置 DMA 控制数据包*/
  G_dmaCTRLPKT1.Sadd   =(Uint32) TX_DATA;
  G_dmaCTRLPKT1.DADD   = sciTxData;
  G_dmaCTRLPKT1.CHCTRL  = 0;
  G_dmaCTRLPKT1.FRCNT  = 1;
  G_dmaCTRLPKT1.ELCNT  = BUFFER_SIZE;
  G_dmaCTRLPKT1.ELDOFFSET = 0;
  G_dmaCTRLPKT1.ELSOFFSET = 1;
  G_dmaCTRLPKT1.FRDOFFSET = 0;
  G_dmaCTRLPKT1.FRSOFFSET = 0;
  G_dmaCTRLPKT1.PORTASGn = PORTB_READ_PORTB_WRITE;
  G_dmaCTRLPKT1.RDSIZE  = ACCESS_8_BIT;
  G_dmaCTRLPKT1.WRSIZE  = ACCESS_8_BIT;
  g_dmaCTRLPKT1.tType  = FRAME_TRANSFER;
  G_dmaCTRLPKT1.ADDMODERD = ADDR_INC1;
  G_dmaCTRLPKT1.ADDMODEWR = ADDR_FIXED;
  G_dmaCTRLPKT1.AUTOINIT = AUTOINIT_OFF;

  /*为 RX(通道 1)配置 DMA 控制数据包*/
  G_dmaCTRLPKT2.Sadd   = sciRxData;
  G_dmaCTRLPKT2.DADD   =(Uint32) RX_DATA;
  G_dmaCTRLPKT2.CHCTRL  = 0;
  G_dmaCTRLPKT2.FRCNT  = 1;
  G_dmaCTRLPKT2.ELCNT  = BUFFER_SIZE;
  G_dmaCTRLPKT2.ELDOFFSET = 1;
  G_dmaCTRLPKT2.ELSOFFSET = 0;
  G_dmaCTRLPKT2.FRDOFFSET = 0;
  G_dmaCTRLPKT2.FRSOFFSET = 0;
  G_dmaCTRLPKT2.PORTASGn = PORTB_READ_PORTB_WRITE;
  G_dmaCTRLPKT2.RDSIZE  = ACCESS_8_BIT;
  G_dmaCTRLPKT2.WRSIZE  = ACCESS_8_BIT;
  g_dmaCTRLPKT2.tType  = FRAME_TRANSFER;
  G_dmaCTRLPKT2.ADDMODERD = ADDR_FIXED;
  G_dmaCTRLPKT2.ADDMODEWR = ADDR_INC1;
  G_dmaCTRLPKT2.AUTOINIT = AUTOINIT_OFF;

  /*设置控制数据包*/
  dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT1);
  dmaSetCtrlPacket (DMA_CH1、g_dmaCTRLPKT2);

  /*启用 DMA 通道*/
  dmaSetChEnable (DMA_CH0、DMA_HW);
  dmaSetChEnable (DMA_CH1、DMA_HW);
#if 0
  /*启用 SCI DMA 请求*/
//  sciREG1->SETINT |= SCI_SET_TX_DMA | SCI_SET_RX_DMA | SCI_SET_RX_DMA_ALL;
  sciREG1->SETINT |= SCI_SET_TX_DMA;
#else
  /*启用 SCI DMA 请求*/
  SCIREG2->SETINT |= SCI_SET_TX_DMA | SCI_SET_RX_DMA | SCI_SET_RX_DMA_ALL;
#endif
  /*等待 DMA 传输完成*/
  while(!dmaGetInterruptStatus (DMA_CH1、BTC));

  /*禁用 DMA 通道*/
  dmaSetChEnable (DMA_CH0、DMA_SW);
  dmaSetChEnable (DMA_CH1、DMA_SW);

  /*验证接收的数据*/
  对于 (I = 0;I < BUFFER_SIZE;I++)
  {
    IF (RX_DATA[i]!= TX_DATA[i])
    {
      /*数据不匹配 — 处理错误*/
      while (1);//停止此处进行调试
    }
  }

  /*如果我们到达此处、则 DMA 传输成功*/
  while (1)
  {
    /*应用程序代码*/
  }

  返回 0;
}

 


移动数据

  矢量 (X) :origin=0x00000000 length=0x00000020
  FLASH0 (RX):origin=0x00000020 length=0x001FFFE0
  FLASH1 (RX):origin=0x00200000 length=0x00200000

  栈  (RW):origin=0x08000000 length=0x00001500 /* 5.25 KB */
  SHAREDRAM (RW):origin=0x08001500 length=0x00000400 /*对于 DMA 为 1KB */
  RAM   (RW):origin=0x08001900 length=0x0007E700 /* remaining ~506 KB */
}

很重要

  .intvecs  :{}>向量
  .text   :{}> FLASH0
  .const   :{}> FLASH0
  .cinit   :{}> FLASH0
  .pinit   :{}> FLASH0

  .bss    :{}> RAM
  .data   :{}> RAM
  .sysmem  :{}> RAM

  .sharedRAM :{}> SHAREDRAM /* DMA 缓冲区*/
}