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.

[参考译文] TMS320F28377D:DMA 目标起始地址错误

Guru**** 2482105 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1449609/tms320f28377d-dma-destination-start-address-wrong

器件型号:TMS320F28377D
Thread 中讨论的其他器件:C2000WARE

工具与软件:

你(们)好  

客户使用 DMA 通道6处理 SPI RX 缓冲区数据、初始化如下、SPI 发送了总共80个字(8个字* 10次):

DMADest  =  (Volatile UINT16 *) spiRecdata;

DMACH6AddrConfig (DMADest、&SpiaRegs.SPIRXBUF);
DMACH6BurstConfig (7、0、1);
DMACH6TransferConfig (9、0、1);
DMACH6ModeConfig (DMA_SPIARX、PERINT_ENABLE、Oneshot_disable、CONT_ENABLE、
SYNC_DISABLE、SYNC_SRC、OVRFLOW_DISABLE、CHEIN_BIT、
CHINT_END、CHINT_ENABLE);

 起始地址与设置不一致问题是:0001 00FC 0001 0001应分配在0x0001A800上、而不是在0x001A821中分配。

调试结果如下:

在 初始化中、DMA 的目标是* spiRecdata、这意味着 spiRecdata[0] 。

该地址在.cmd 文件中分配  

TO_CPU1_INTERNALSPI   : origin = 0x01A800、length = 0x000600  

#pragma DATA_SECTION (spiRecdata、"tOCPU1_SPI");//将 RX 数据映射到存储器
uint16 spiRecdata[80];

它与 DMA ADDR_SHADOW 对齐

但是在调试中、dst_beg_addr_active 随机变化、这会导致 目标起始地址移动到 spiRecdata[75]、但不会发生 spiRecdata[0]  

是否有调试此问题的指南?

谢谢

Joe

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

    你(们)好

    请您更新此问题。  

    谢谢

    Joe

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

    您好、Joe。

    您能否在映射文件或表达式视图中验证  spiRecdata 实际放置在何处 0x01A800 ? DATA_SECTION pragma 仅告诉链接器要将其放置在 TO_CPU1_INTERNALSPI 存储器范围中、但不一定要将其放置在范围的开头。  

    此致、

    Delaney

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

    你好、 Delaney

    我在客户侧调试这个问题、我认为根本原因是 DMA 和 SPI 操作逻辑、我会进行以下更改以使代码正常运行:

    有一个问题需要您的建议。

    在 SPI 从器件中:

    我将 DMA (receive)设置为继续模式、并 在计时器初始化之前启动 DMA (receive)、计时器用于控制 GPIO 切换。 在 SPI 主器件程序中、GPIO 切换将触发 SPI 主器件发送和接收数据。

    在 SPI 主器件中:

    我将 DMA (接收)设置 为单次触发模式、并使用 GPIO 中断触发 SPI 主机发送、并启用 DMA (接收) 来获取从机发送的 SPI 数据。

    使用上述设计、SPI 从设备和主设备将在 SPI 和 DMA 正常工作的同时发送和接收数据。 目标是每个周期发送60个字。

    SPI 和 DMA 配置代码如下所示:

    DMACH6AddrConfig (DMADest、&SpiaRegs.SPIRXBUF);
    DMACH6BurstConfig (1、0、1);
    DMACH6TransferConfig (29、0、1);

    DMACH6WrapConfig (0、0、29、0);

    DMACH6ModeConfig (DMA_SPIARX、PERINT_ENABLE、Oneshot_disable、CONT_disable、
    SYNC_DISABLE、SYNC_SRC、OVEFLOW_ENABLE、CHEIN_BIT、
    CHINT_END、CHINT_ENABLE);

    SpiaRegs.SPIFFRX.ALL=0x2040;// RX FIFO enabled、clear FIFO int
    SpiaRegs.SPIFFRX.bit.RXFFIL = 2;

    但在某些测试中、接收数据将不稳定(顺序错误):

    数据顺序应为0x0001 0x00FC 0x0002 0x0002... 但您可以在这张图片中看到、0x0001 0x00FC... 转至第17个位置。 有时 SPI 溢出寄存器会设置为1。

    对此问题有什么见解吗?

    谢谢

    Joe

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

    您好、Joe。

    [报价 userid="521036" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1449609/tms320f28377d-dma-destination-start-address-wrong/5574185 #5574185"]

    DMACH6AddrConfig (DMADest、&SpiaRegs.SPIRXBUF);
    DMACH6BurstConfig (1、0、1);
    DMACH6TransferConfig (29、0、1);

    DMACH6WrapConfig (0、0、29、0);

    DMACH6ModeConfig (DMA_SPIARX、PERINT_ENABLE、Oneshot_disable、CONT_disable、
    SYNC_DISABLE、SYNC_SRC、OVEFLOW_ENABLE、CHEIN_BIT、
    CHINT_END、CHINT_ENABLE);

    SpiaRegs.SPIFFRX.ALL=0x2040;// RX FIFO enabled、clear FIFO int
    SpiaRegs.SPIFFRX.bit.RXFFIL = 2;

    [报价]

    这些设置指的是哪个器件? 主 SPI 器件还是从 SPI 器件?

    最好使突发大小(2)等于 SPI RX FIFO 触发电平(2/16)、并且正在使用 SPI RX 触发器。 不过、您不希望在这种情况下启用单次触发模式、您希望每个 FIFO 级别的触发器仅传输2个字(单个突发)、否则您将看到数据丢失或类似的奇怪问题。

    了解一下 1. 8.3.8 SPI DMA 传输 部分 、了解有关如何配置 DMA 以与 SPI 配合使用的更多信息。

    此致、

    Delaney

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

    您好、Delaney:

    该代码用于设置 SPI 从器件接收数据。

    感谢您的建议、将让客户更改 SPI 主 DMA 设置和测试。

    一个问题:我看不到 TRM 中提及的适用于 SPI DMA 的 SPI_Ex5。 SDK 版本为5.02和5.04。

    谢谢

    Joe

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

    您好、Joe。

    此示例实际上并不是为 F2837xD 创建的、因此您需要在不同器件的文件夹下查找该示例。 尝试 C2000ware 路径: [C2000ware 安装]/driverlib/f28p65x/examples/cpu1/spi/spi_ex5_loopback_dma. 该示例是针对 F28P65x 创建的、但器件上的 SPI 和 DMA 模块是相同的、因此它们应该仍能够使用该示例。

    此外,我将在假期离开办公室,直到12月30日,所以我不能再提供任何支持,直到那一天之后。 对于给您带来的不便、我们深表歉意。

    此致、

    Delaney

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

    你好、Delaney

    这解决了我的问题。

    谢谢

    Joe