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 的 SCI 不工作、使用为 TMS570LC43xx 系列提供的 HALCOGEN 示例代码

Guru**** 2538955 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/771422/tms570lc4357-sci-over-dma-not-working-uisng-the-halcogen-sample-code-provided-for-tms570lc43xx-series

器件型号:TMS570LC4357
主题中讨论的其他器件: HALCOGEN

控制器:TMS570LC4357

工具使用:CCS、HALCOGEN  

问题:在 HALCOGEN SCI 与 DMA 之间为 TMS570LC43xx 提供的示例不起作用  

按照示例文件中给出的所有配置操作、只是我使用的是共享 RAM 区域、我在.cmd 文件中正确配置了该区域。

 

 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 使用的代码//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/*用户代码开始(0)*/
/*用户代码结束*/
/*包含文件*/
#include "hL_sys_common.h"
#include "hL_system.h"
/*用户代码开始(1)*/
#include "HL_SYS_DMA.h"
#include "hL_sci.h"
#include "stdio.h"
/*用户代码结束*/
/**@fn void main (void)
*  @应用程序主函数简介
*  @请注意、默认情况下、此函数为空。
*
*  此函数在启动后调用。
*  用户可以使用此函数来实现应用程序。
*
/*用户代码开始(2)*/
#define size 100
/*如果 LOOPBACKMODE 定义为0、则需要外部连接(SCI3 TX -> SCI4 RX)*/
#define LOOPBACKMODE 1.
/* Tx 和 Rx 数据缓冲器*/
#pragma SET_DATA_SECTION (".sharedRAM")
uint8 TX_DATA[SIZE];
uint8 RX_DATA[SIZE]={0xff};
#pragma SET_DATA_SECTION ()
/* SCI 8位 TX/Rx 数据的地址*/
#if ((__little_endian__= 1)||(__little_ENDIAN__= 1)
#define SCI3_TX_ADDR ((uint32_t)(&(sciREG3->TD))
#define SCI3_RX_ADDR ((uint32_t)(&(sciREG3->RD))
#define SCI4_TX_ADDR ((uint32_t)(&(sciREG4->TD))
#define SCI4_RX_ADDR ((uint32_t)(&(sciREG4->RD))
其他
#define SCI3_TX_ADDR ((uint32_t)(&(sciREG3->TD))+ 3)
#define SCI3_RX_ADDR ((uint32_t)(&(sciREG3->RD))+ 3)
#define SCI4_TX_ADDR ((uint32_t)(&(sciREG4->TD))+ 3)
#define SCI4_RX_ADDR ((uint32_t)(&(sciREG4->RD))+ 3)
#endif
#define DMA_SCI3_TX DMA_REQ31
#define DMA_SCI3_RX DMA_REQ30
#define DMA_SCI4_TX DMA_REQ43
#define DMA_SCI4_RX DMA_REQ42
#define SCI_SET_TX_DMA     (1<<16)
#define SCI_SET_RX_DMA     (1<<17)
#define SCI_SET_RX_DMA_ALL (1<<18)

/*用户代码结束*/
uint8 emacAddress[6U]= {0xFFU、0xFFU、0xFFU、0xFFU、0xFFU、0xFFU、 0xFFU};
uint32 emacPhyAddress = 0U;
void main (void)

/*用户代码开始(3)*/
 uint32 sciTxData、sciRxData;
 int i;
 g_dmaCTRL g_dmaCTRLPPKT1、g_dmaCTRLPPKT2;
 /*加载源数据*/
 (i=0;<size; i++)
 {
  TX_DATA[i]= i;
 }
 /*初始化 SCI*/
 sciInit();
#if LOOPBACKMODE = 1
 /*启用 SCI 回送*/
 sciEnableLoopback (sciREG3、Digital_LBK);
 while (((sciREG3->FLR & SCI_TX_INT)== 0U)||((sciREG3->FLR & 0x4)== 0x4))
   {
 }/*等待*/
 /*将 DMA 请求 SCI3发送到通道0*/
 dmaReqAssign (DMA_CH0、DMA_SCI3_TX);
 /*将 DMA 请求 SCI3接收分配给通道1*/
 dmaReqAssign (DMA_CH1、DMA_SCI3_RX);
 sciTxData = SCI3_TX_ADDR;
 sciRxData = SCI3_RX_ADDR;
其他
 while (((sciREG3->FLR & SCI_TX_INT)== 0U)||((sciREG3->FLR & 0x4)== 0x4))
   {
 }/*等待*/
 /*将 DMA 请求 SCI3发送到通道0*/
 dmaReqAssign (DMA_CH0、DMA_SCI3_TX);
 /*将 DMA 请求 SCI4接收分配给通道1*/
 dmaReqAssign (DMA_CH1、DMA_SCI4_RX);
 sciTxData = SCI3_TX_ADDR;
 sciRxData = SCI4_RX_ADDR;
#endif
 /*为通道0*/配置控制包
 G_dmaCTRLPKT1.Sadd     =(uint32_t) TX_DATA; /*源地址            *
 G_dmaCTRLPKT1.DADD     = sciTxData;     /*目标 地址      *
 G_dmaCTRLPKT1.CHCTTRL   = 0;                /*通道控制           *
 G_dmaCTRLPKT1.FRCNT   =大小;                 /*帧计数               */
 G_dmaCTRLPKT1.ELCNT    = 1;                /*元素计数             */
 G_dmaCTRLPKT1.ELDOFFSET = 0;                /*元素目标偏移量*
 G_dmaCTRLPKT1.ELSOFFSET = 0;            /*元素目标偏移量*
 G_dmaCTRLPKT1.FRDOFFSET = 0;            /*帧目标偏移  *
 G_dmaCTRLPKT1.FRSOFFSET = 0;                /*帧目标偏移  *
 G_dmaCTRLPKT1.PORTASGN = PORTA_READ_PORTB_WRITE;
 G_dmaCTRLPKT1.RDSIZE   = ACCESS_8_BIT;     /*读取大小                 *
 G_dmaCTRLPKT1.WRSIZE   = ACCESS_8_BIT;     /*写入大小                *
 G_dmaCTRLPKT1.tType    = FRAME_TRANSFSION;     /* TRANSFSION TYPE             *
 G_dmaCTRLPKT1.ADDMODERD = ADDR_INC1;        /*地址模式读取         *
 G_dmaCTRLPKT1.ADDMODEWR = ADDR_FIXED;         /*地址模式写入        *
 G_dmaCTRLPKT1.AUTOINIT = AUTOINIT_OFF;      /*自动初始                  化*/
 /*为通道1*/配置控制包
 G_dmaCTRLPKT2.Sadd     = sciRxData;        /*源地址            */
 G_dmaCTRLPKT2.DADD     =(uint32_t) RX_DATA; //目标 地址 ss      *
 G_dmaCTRLPKT2.CHCTTRL   = 0;                /*通道控制           *
 G_dmaCTRLPKT2.FRCNT   =大小;                 /*帧计数               */
 G_dmaCTRLPKT2.ELCNT    = 1;                 /*元素计数             */
 G_dmaCTRLPKT2.ELDOFFSET = 0;                /*元素目标偏移量*
 G_dmaCTRLPKT2.ELSOFFSET = 0;            /*元素目标偏移量*
 G_dmaCTRLPKT2.FRDOFFSET = 0;            /*帧目标偏移  *
 G_dmaCTRLPKT2.FRSOFFSET = 0;                /*帧目标偏移  *
 G_dmaCTRLPKT2.PORTASGN = PORTB_READ_PORTA_WRITE;
 G_dmaCTRLPKT2.RDSIZE   = ACCESS_8_BIT;     /*读取大小                 *
 G_dmaCTRLPKT2.WRSIZE   = ACCESS_8_BIT;     /*写入大小                *
 G_dmaCTRLPKT2.tType    = FRAME_TRANSFSION;     /* TRANSFSION TYPE             *
 G_dmaCTRLPKT2.ADDMODERD = ADDR_FIXED;        /*地址模式读取         */
 G_dmaCTRLPKT2.ADDMODEWR = ADDR_INC1;         /*地址模式写入        *
 G_dmaCTRLPKT2.AUTOINIT = AUTOINIT_OFF;      /*自动初始                  化*
 /*为通道0和1设置控制数据包*/
 dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT1);
 dmaSetCtrlPacket (DMA_CH1、g_dmaCTRLPKT2);
 /*将 DMA 通道0和1设置为在硬件请求时触发*/
 dmaSetChEnable (DMA_CH0、DMA_HW);
 dmaSetChEnable (DMA_CH1、DMA_HW);
 /*启用 DMA*/
 dmaEnable();
#if LOOPBACKMODE = 1
 /*启用 SCI3发送和接收 DMA 请求*/
 sciREG3->SETINT |= SCI_SET_TX_DMA | SCI_SET_RX_DMA | SCI_SET_RX_DMA_ALL;
其他
 /*启用 SCI3发送和 SCI4接收 DMA 请求*/
 sciREG3->SETINT |= SCI_SET_TX_DMA;
 sciREF4->SETINT |= SCI_SET_RX_DMA | SCI_SET_RX_DMA_ALL;
#endif
 while (dmaGetInterruptStatus (dma_CH1、BTC)!= true);
 for (i=0;<size; i++)
 {
  if (RX_DATA[i]!= TX_DATA[i])
  {
   中断;
  }
 }
 if (<size)
 {
  printf ("fail\n");
 }
 其他
 {
  printf ("Pass\n");
 }
 while (1);
/*用户代码结束*/
/*用户代码开始(4)*/
/*用户代码结束*/

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////