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.

[参考译文] TMDX570LC43HDK:SCI 回送 DMA 数据检索

Guru**** 2538930 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/819101/tmdx570lc43hdk-sci-loopback-dma-data-retrieval

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

尊敬的所有人、我目前正在修改 SCI 回送 DMA 示例、以将数据传输链接到开发板上的物理按钮。 当我按下按钮8次异常触发时、行为如预期的那样、正如 DMA 控制数据包中配置的那样。 当我尝试在 ISR 内部实数 RX_DATA 时、这个问题就会出现、它被设置为全零、但在触发之前、我可以看到数据实际上被写入到那里。 我不是该板/处理器的专家、因此我可能遗漏了一些东西、或者这不是检索数据的正确方法。 我附加了我的主函数代码、该项目由 Halcogen 4.7.1生成、并在 CCS 版本:7.4.0.00015中开发  

/**@文件 hL_sys_main.c
*@简要应用程序主文件
*@日期2018年12月11日
*@版本04.07.01
*
*此文件包含一个空的主函数
*,可用于应用程序。
*/

*
版权所有(C) 2009-2018 Texas Instruments Incorporated - www.ti.com
*

**
只要
满足以下条件*、就允许以源代码和二进制形式重新分发和使用、无论是否进行*修改:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
*二进制形式的再发行必须在

*
发行版随附的*文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
*未经

事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件派生的产品*。
*
*本软件由版权所有者和贡献者
*按原样"提供、

且不承认任何明示或暗示的保证、包括但不限于*特定用途*的适销性和适用性的暗示保证。 在任何情况下、版权
*所有者或贡献者都不对任何直接、间接、偶然、
*特殊、模范、 或相应的损害(包括但不
限于*采购替代产品或服务;丧失使用、
*数据或利润; 或业务中断)、但出于
任何*责任理论、无论是合同、严格责任还是侵权
行为*(包括疏忽或其他原因)、即使
被告知可能会造成此类损坏、也是出于此类责任理论。
*
*/

*用户代码开始(0)*/
/*用户代码结束*

/*包含文件*/

#include "hL_sys_common.h"

/*用户代码开始(1)*/
#include "hL_system.h"
#include "stdio.h"
#include "hL_gio.h"
#include "hL_sci.h"




*#include "n_code.h"*#include "n_main.h"* void @@"n_code.h"*#include "n_main.h"
@请注意、默认情况下、此函数为空。
*
*此函数在启动后调用。
*用户可以使用此函数来实现应用程序。
//

//*用户代码开始(2)*/
#define SIZE 8
//如果 LOOPBACKMODE 被定义为0,则需要外部连接(SCI3 TX -> SCI4 RX)*/
#define LOOPBACKMODE 1/*
Rx 数据缓冲区*/
uint8_t RX_DATA[SIZE]={0};
/* SCI 8位 TX/Rx 数据的地址*/
#if (__little_endian__= 1)||(__little_ENDIAN__= 1)
#define SCI3_TX_ADDR ((UINT32_t)(&sciREG3->TD)(
#SCI3&USTRD





)(#USCI32_TRD)(#USCI32_TRD)(#USCI32_TRD)(#USCI32_TRD)(#USCI32_TRD)(#USCI32_TRD)(#FR3_TRD)(#USCI32_TRD)(#FR3_TRD)(#FR3_AG_TRD)(#FR3_TRD)(#FR3_TRD)(#FR3_TRD)(#FR3_AG_TRD (#FR3_AG_AG_AG_TRD)(#FR3_TRD)(#FR3_TRD)(#FR3_TRD)(#FR3_TRD (#FR3_AG_TRD)

#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)
/*用户代码结束*/

int main (void)
{
/*用户代码开始(3)*/
//uint32 sciTxData、sciRxData;
uint32 sciRxData;
//g_dmaCTRL g_dmaCTRLPPKT1、g_dmaCTRLPPKT2;
g_dmaCTRL g_dmaCTRLPKT2;
gioInit();
sciInit();

#if LOOPBACKMODE = 1.
/*启用 SCI 回送*/
sciEnableLoopback (sciREG3、Digital_LBK);
while (((sciREG3->FLR & SCI_TX_INT)== 0U)||((sciREG3->FLR & 0x4)== 0x4))
{
} /*等待*/

/*将 DMA 请求 SCI3接收分配给通道1*/
dmaReqAssign (DMA_CH1、DMA_SCI3_RX);

sciRxData = SCI3_RX_ADDR;

#else
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
/*为通道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;/*传输类型 *
G_dmaCTRLPKT2.ADDMODERD = ADDR_FIXED;/*地址模式读取 *
G_dmaCTRLPKT2.ADDMODEWR = ADDR_INC1;/*地址模式写入 *
G_dmaCTRLPKT2.AUTOINIT = AUTOINIT_OFF;/*自动初始化 *

/*SET CHANNEL 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();
dmaEnableInterrupt (DMA_CH1、BTC、DMA_INTA);
/*GioA 7*/的启用按钮
gioEnableNotification (gioPORTA、7);

#if LOOPBACKMODE = 1.
/*启用 SCI3接收 DMA 请求*/
sciREG3->SETINT |= SCI_SET_RX_DMA | SCI_SET_RX_DMA_ALL;

#else
/*启用 SCI3发送和 SCI4接收 DMA 请求*/
sciREG3->SETINT |= SCI_SET_TX_DMA;
sciREF4->SETINT |= SCI_SET_RX_DMA | SCI_SET_RX_DMA_ALL;
#endif
_enable_IRQ ();
while (1)
;
/*用户代码结束*/

返回0;
}

/*用户代码开始(4)*/
uint8 buffer[1];
uint8 incumentalT ='A';
int vecesBoton = 0;
int i = 0;
void gioNotification (gioPORT_t *端口、uint32位)
{
Buffer[0]=递增 T;
sciSend (sciREG3、1、buffer);
递增 T++;
vecesBoton ++;
}
int incumentalR = 0;
void dmaGroupANotification (dmaInterrupt_t inttype、uint32通道)
{
递增 R++;
dmaSetChEnable (DMA_CH1、DMA_HW);
}
//用户代码结束*

此致

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

    您好!

    您是否启用了 MCU 缓存? 如果是、您是否将 SRAM 更改为 写入、如下所示:

    由于 DMA_CH1已设置为使用硬件请求、因此您不必在 dmaGroupNotification 中再次进行设置。 此外、以 DMA 传输8个字节的方式设置控制数据包。 有关 DMA 配置的更多详细信息、请参阅器件 TRM 的第20章;有关使用 DMA 的 SCI 的详细信息、请参阅器件 TRM 的第30.4节。

    此致、
    米罗

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

    谢谢、 启用 MCU 缓存解决了我的问题。

    我将该线程标记为已解决。