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.

[参考译文] RM46L852:向 DMA 执行 N2HET REQ

Guru**** 2387830 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/1253835/rm46l852-n2het-req-to-dma

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

我在通过 N2HET 配置 DMA REQ 时遇到问题。
我的 HET 代码会生成一个 PWM、当比较匹配项 DE PWM 上升时、生成 DE 请求。 我试图将数据重定向到 HET1的前8个引脚、似乎无法分辨。
有人能帮忙吗?
这是 带有来自 HalCoGen 的所有驱动程序的主代码。
非常感谢、

尼诺·奥利弗

/** @file sys_main.c 
*   @brief Application main file
*   @date 11-Dec-2018
*   @version 04.07.01
*
*   This file contains an empty main function,
*   which can be used for the application.
*/

/* 
* Copyright (C) 2009-2018 Texas Instruments Incorporated - www.ti.com 
* 
* 
*  Redistribution and use in source and binary forms, with or without 
*  modification, are permitted provided that the following conditions 
*  are met:
*
*    Redistributions of source code must retain the above copyright 
*    notice, this list of conditions and the following disclaimer.
*
*    Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the 
*    documentation and/or other materials provided with the   
*    distribution.
*
*    Neither the name of Texas Instruments Incorporated nor the names of
*    its contributors may be used to endorse or promote products derived
*    from this software without specific prior written permission.
*
*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
*  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
*  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
*  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
*  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
*  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
*  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
*  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
*  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
*  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/


/* USER CODE BEGIN (0) */
#include "het.h"
#include "mibspi.h"
#include "sys_dma.h"
#include "gio.h"
#include "PWM.h"
/* USER CODE END */

/* Include Files */

#include "sys_common.h"

/* USER CODE BEGIN (1) */
/* USER CODE END */

/** @fn void main(void)
*   @brief Application main function
*   @note This function is empty by default.
*
*   This function is called after startup.
*   The user can use this function to implement the application.
*/

/* USER CODE BEGIN (2) */
#define D_SIZE      2

void dmaConfigCtrlPacket(uint32 sadd,uint32 dadd,uint32 dsize);
void mibspiDmaConfig(mibspiBASE_t *mibspi,uint32 channel, uint32 txchannel, uint32 rxchannel);

uint8 TX_DATA[D_SIZE] = {1<<6,0x0} ;         /* transmit buffer in sys ram */

static uint8 *reg_out; //output register

g_dmaCTRL g_dmaCTRLPKT;    /* dma control packet configuration stack */
/* USER CODE END */

uint8	emacAddress[6U] = 	{0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU};
uint32 	emacPhyAddress	=	0U;

int main(void)
{
/* USER CODE BEGIN (3) */

          hetInit();

          reg_out = &((uint8_t *) &(hetREG1->DOUT))[0];
          hetREG1->REQDS = 1<<4;
          /* - assigning dma request: channel-0 with request line - 1 */
          dmaReqAssign(4,20 );

          /* - configuring dma control packets   */
          dmaConfigCtrlPacket((uint32)(&TX_DATA),(uint32)reg_out,D_SIZE);
          /* upto 32 control packets are supported. */

          /* - setting dma control packets */
          dmaSetCtrlPacket(DMA_CH4,g_dmaCTRLPKT);

          /* - setting the dma channel to trigger on h/w request */
          dmaSetChEnable(DMA_CH4, DMA_HW);

          /* - enabling dma module */
          dmaEnable();

          while(1)
          {

          }




/* USER CODE END */
}


/* USER CODE BEGIN (4) */

/** void dmaConfigCtrlPacket(uint32 sadd,uint32 dadd,uint32 dsize)
*
*   configuring dma control packet stack
*
*       sadd  > source address
*       dadd  > destination  address
*       dsize > data size
*
*   @ note : after configuring the stack the control packet needs to be set by calling dmaSetCtrlPacket()
*/
void dmaConfigCtrlPacket(uint32 sadd,uint32 dadd,uint32 dsize)
{
  g_dmaCTRLPKT.SADD      = sadd;              /* source address             */
  g_dmaCTRLPKT.DADD      = dadd;              /* destination  address       */
  g_dmaCTRLPKT.CHCTRL    = 0;                 /* channel control            */
  g_dmaCTRLPKT.FRCNT     = 1;                 /* frame count                */
  g_dmaCTRLPKT.ELCNT     = dsize;             /* element count              */
  g_dmaCTRLPKT.ELDOFFSET = 4;                 /* element destination offset */
  g_dmaCTRLPKT.ELSOFFSET = 0;                 /* element destination offset */
  g_dmaCTRLPKT.FRDOFFSET = 0;                 /* frame destination offset   */
  g_dmaCTRLPKT.FRSOFFSET = 0;                 /* frame destination offset   */
  g_dmaCTRLPKT.PORTASGN  = 4;                 /* port b                     */
  g_dmaCTRLPKT.RDSIZE    = ACCESS_16_BIT;     /* read size                  */
  g_dmaCTRLPKT.WRSIZE    = ACCESS_16_BIT;     /* write size                 */
  g_dmaCTRLPKT.TTYPE     = FRAME_TRANSFER ;   /* transfer type              */
  g_dmaCTRLPKT.ADDMODERD = ADDR_INC1;         /* address mode read          */
  g_dmaCTRLPKT.ADDMODEWR = ADDR_OFFSET;       /* address mode write         */
  g_dmaCTRLPKT.AUTOINIT  = AUTOINIT_ON;       /* autoinit                   */
}

/* USER CODE END */
IRA

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

    尊敬的 Nuno:

    我们已着手解决您的问题、并将很快提供更新。

    --

    谢谢。此致、
    Jagadish。

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

    你好、jagadish、
    自开机自检一开始、我查看了数据表、发现我缺少2个初始化。 HETREQENS 和 HETREQDS。 但是、我已经将这些初始化添加到我的代码中、仍然什么都没有。 最后有什么运气?

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

    尊敬的 Nuno:

    您是否可以发送完整项目以便我轻松重现并查看问题?

    您可以向我发送私人信息,以便没有人可以看到它?

    --

    谢谢。此致、
    Jagadish。

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

    尊敬的 Nuno:

    实际上、我的 RM46硬件不工作、因此我无法测试您的项目。

    给我一些时间来修复和测试它。

    --

    谢谢。此致、
    Jagadish。

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

    尊敬的 Nuno:

    我很抱歉我没有得到您的观点。 您是否要将数据从 N2HET 指令的数据字段移动到 MCU SRAM?

    MCU 支持 N2HET  传输单元(HTU)模块、这与 DMA 模 块类似。 HTU 专门用于与 JESD204B 数据交换、
    微控制器 RAM。

    例如、HTU 请求由 N2HET 指令生成  

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

    大家好。 我正在尝试将数据从 DE MCU RAM 移动到引脚。 假设您有16位用于与另一个板通信。 我正在尝试生成一个请求(或者 IRQ 没问题)以将 MCU RAM 中的数据放置到16个引脚

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

    尊敬的 Nuno:

    数据无法移动到引脚。 它被移动到使用引脚输出数据的外设(例如 SPI_MOSI 或 NHET DOUT)的缓冲器或寄存器。 如果您希望使用 NHET 生成 PWM、N2HET 指令(例如 ECMP、CNT、DJZ、PWCNT 等)应该从 N2HET RAM 中执行。 要将数据从 MCU SRAM 移动到那些 N2HET 指令数据字段、HTU 应该被使用。  

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

    您好、QJ:

    那么、我如何生成 DMA 请求并将缓冲区放在引脚中呢?

    现在我将如何在汇编代码中实现它。 我不完全了解 C 配置、

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

    您使用 NHET 生成 PWM 信号、对吧? HALCoGen 在操作码模式下生成代码,该代码将被复制到 hetInit ()中的 NHET RAM 中:

    https://www.ti.com/lit/an/spna217/spna217.pdf?ts = 1691643144831&ref_url=https%253A%252F%252Fwww.google.com%252F

    这个应用中的示例使用 HTU 来传输数据。

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

    可以、但我想使用我自己的汇编代码。 我使用的放大器。 我无法为我自己的汇编代码配置 C 代码。 用于 HET Lins 的 DMA 配置

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

    如果您使用 DMA 将数据从 MCU SRAM 移动到 N2HET DOUT 寄存器(您的第一条消息中的代码)、NHET 硬件不会生成 DMA 请求、您必须手动触发 DMA 传输(SW 触发)。

    您使用 NHET 生成 PWM、对吧? 通过从 NHET RAM 中运行以下代码可生成一个 PWM:

    ;发生比较匹配事件时具有同步占空比更新的 PWM
    l00 CNT{reg=A、IRQ=off、max= 10}
    L01 ECMP{next=L03、COND_addr=L02、EN_PIN_ACTION=ON、引脚=1、操作=PULSELO、 REG=A、数据= 2、hr_data=80}
    L02 MOV32 {远程=L01,类型=IMTOREG&REM, reg=none, data=1 , hr_data=20}; CPU 写入该数据字段
    L03 BR{next= L00、COND_addr=L00、EVENT= NOCOND}

    您可以使用 DMA 或 HTU 来将数据从 MCU SRAM 移动到 N2HET MOV32指令的数据字段

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

    n´t 我只需使用一条 CNT 指令和一个如下的 ECMP 指令来生成 PWM:

    l00 CNT{next=L01、reg=A、max=8、data=0};

    l01 ecmp{next=L00、reqnum=6、request=GENREQ、hr_lr=高电平、en_pin_action=on、con_addr=L00、pin=6、action=PULSEHI、reg=A、IRQ=off、data=4、hr_data=60};

    这不会触发硬件请求? 我虽然会



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

    尊敬的 Nuno:

    是的、您可以使用 CNT 和 ECMP 生成 PWM。 如果需要不同的 PWM 占空比、主机 CPU 或 HTU 必须修改 ECMP 的数据字段。 您可能知道、直接更改 ECMP 的数据字段会导致丢失脉冲。

    为了避免这种情况、建议使用 MOV32或 MOV64来更新 ECMP 指令的数据字段和/或控制字段。 仅当 ECMP 比较匹配时、才执行 MOV32或 MOV64。  主机 CPU 或 HTU 可以通过异步写入 MOV32 或 MOV64指令的数据字段而不是直接写入 ECMP 指令的数据字段来更新下一个比较值。

    MOV32用于修改其他指令的数据字段、但 MOV64可以修改其他指令的数据字段和控制字段。

    请参阅我提供的链接中的示例:

    https://www.ti.com/lit/an/spna217/spna217.pdf?ts = 1691643144831&ref_url=https%253A%252F%252Fwww.google.com%252F

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

    在本例中、您告诉我、DMA 请求位于 CNT 指令中、而不是 ECMP 指令中。 它不在 ECMPn´t 中?

    PS:IM 未尝试更新占空比、因此无需使用该路由

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

    尊敬的 Nuno:

    是的、你可以启用 DMA 请求并 在 ECMP 中定义请求行。 spna217中的代码是使用 HTU 的一个好示例。

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

    在代码 spna217中、它们使用 HTU。 我正在尝试使用 DMA、但我想缺少一些初始化。 我有 CNT 和 ECMP。 当 ECMP 比较与之匹配时、它会通过通道6生成请求。 这是 main.c。

    /** @file sys_main.c 
    *   @brief Application main file
    *   @date 11-Dec-2018
    *   @version 04.07.01
    *
    *   This file contains an empty main function,
    *   which can be used for the application.
    */
    
    /* 
    * Copyright (C) 2009-2018 Texas Instruments Incorporated - www.ti.com 
    * 
    * 
    *  Redistribution and use in source and binary forms, with or without 
    *  modification, are permitted provided that the following conditions 
    *  are met:
    *
    *    Redistributions of source code must retain the above copyright 
    *    notice, this list of conditions and the following disclaimer.
    *
    *    Redistributions in binary form must reproduce the above copyright
    *    notice, this list of conditions and the following disclaimer in the 
    *    documentation and/or other materials provided with the   
    *    distribution.
    *
    *    Neither the name of Texas Instruments Incorporated nor the names of
    *    its contributors may be used to endorse or promote products derived
    *    from this software without specific prior written permission.
    *
    *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
    *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
    *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
    *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
    *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
    *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
    *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
    *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    *
    */
    
    
    /* USER CODE BEGIN (0) */
    /* USER CODE END */
    
    /* Include Files */
    
    #include "sys_common.h"
    
    /* USER CODE BEGIN (1) */
    #include "rti.h"
    #include "het.h"
    #include "gio.h"
    #include "PWM.h"
    #include "sys_dma.h"
    /* USER CODE END */
    
    /** @fn void main(void)
    *   @brief Application main function
    *   @note This function is empty by default.
    *
    *   This function is called after startup.
    *   The user can use this function to implement the application.
    */
    
    /* USER CODE BEGIN (2) */
    void dmaConfigCtrlPacket(uint32 sadd,uint32 dadd,uint32 dsize);
    
    uint16 TX_DATA[]={0xff,0x0};
    
    g_dmaCTRL g_dmaCTRLPKT;
    
    static uint8_t *phetREG1DOUT8;
    /* USER CODE END */
    
    int main(void)
    {
    /* USER CODE BEGIN (3) */
    
    
        phetREG1DOUT8 = &((uint8_t *) &(hetREG1->DOUT))[3];
    
    
        dmaReqAssign(6,24);
    
        dmaConfigCtrlPacket((uint32)(&TX_DATA),((uint32) phetREG1DOUT8),1);
    
        dmaSetCtrlPacket(DMA_CH6,g_dmaCTRLPKT);
    
        dmaSetChEnable(DMA_CH6, DMA_HW);
    
        dmaEnable();
    
    
        hetInit();
    
    //    hetRAM2->Instruction[pHET_L00_1].Data = 0x1;
    
        hetREG2->INTENAS = pHET_L01_1;
    
        /* Enable IRQ - Clear I flag in CPS register */
        /* Note: This is usually done by the OS or in an svc dispatcher */
        _enable_IRQ();
    
    
        /* Run forever */
        while(1)
        {
        }
    
    /* USER CODE END */
    
    }
    
    
    /* USER CODE BEGIN (4) */
    void dmaConfigCtrlPacket(uint32 sadd,uint32 dadd,uint32 dsize)
    {
      g_dmaCTRLPKT.SADD      = sadd;              /* source address             */
      g_dmaCTRLPKT.DADD      = dadd;              /* destination  address       */
      g_dmaCTRLPKT.CHCTRL    = 0;                 /* channel control            */
      g_dmaCTRLPKT.FRCNT     = 1;                 /* frame count                */
      g_dmaCTRLPKT.ELCNT     = dsize;             /* element count              */
      g_dmaCTRLPKT.ELDOFFSET = 4;                 /* element destination offset */
      g_dmaCTRLPKT.ELSOFFSET = 0;                 /* element destination offset */
      g_dmaCTRLPKT.FRDOFFSET = 0;                 /* frame destination offset   */
      g_dmaCTRLPKT.FRSOFFSET = 0;                 /* frame destination offset   */
      g_dmaCTRLPKT.PORTASGN  = 4;                 /* port b                     */
      g_dmaCTRLPKT.RDSIZE    = ACCESS_8_BIT;     /* read size                  */
      g_dmaCTRLPKT.WRSIZE    = ACCESS_8_BIT;     /* write size                 */
      g_dmaCTRLPKT.TTYPE     = FRAME_TRANSFER ;   /* transfer type              */
      g_dmaCTRLPKT.ADDMODERD = ADDR_INC1;         /* address mode read          */
      g_dmaCTRLPKT.ADDMODEWR = ADDR_OFFSET;       /* address mode write         */
      g_dmaCTRLPKT.AUTOINIT  = AUTOINIT_ON;       /* autoinit                   */
    }
    
    /* USER CODE END */
    

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

    你得到了中断吗? 是否触发了 DMA 传输?

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

    不是的,它不是

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

    您的 NHET 代码被载入到 HET2 RAM 吗? 该器件具有两个 HET 模块:HET1和 HET2。

    您应该至少根据您的配置来获得中断或者 HETFLAG 位的设置。  

    您的代码启用 DMA 请求线路吗? 这可通过将1写入请求使能置位寄存器(HETREQENS)的相应位来完成。

    如果使用 DMA 而不是默认的 HTU、则需要向 请求目标选择寄存器(HETREQDS)的 TDSn 位写入1。 缺省值为0x0、并且选择 HTU。 使用 HTU 可以出于其他目的释放 DMA 通道。

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

    是的。 当您使用高级配置模式选择头文件和源文件时、Hercules 代码生成器会自动执行此操作。 在 het.c 中、他为 het2ram 添加了 memcpy

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

    如果所有这些都已配置好、您应该获得中断和 DMA 请求。 在我看来、你在 HET 配置中遗漏了一些内容。

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

    尊敬的 Nuno:

    您是否解决了该问题?

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

    HET 配置为2个寄存器、指令上会产生生成请求。 我的问题是配置到 HET 的输出引脚的 DMA 数据包。 因此、目标寄存器必须是 HET 引脚(示例:HET1 0到8的引脚)

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

    尊敬的 Nuno:

    无论源和目标位于何处、都没有关系。  通过 在控制数据包中对源和目标的绝对地址进行编程、DMA 控制器可以与4千兆字节物理地址映射内的任意空间相互传输。 控制数据包会存储 传输信息、例如源地址、目标地址、传输计数以及每个通道的控制属性。  

    问题是为什么 N2HET 指令不会生成一个 DMA 请求。 您能与我分享您的 N2HET 代码吗? 我将对您的代码进行快速测试。

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

    尊敬的 Nuno:

    刚刚创建了一个示例、DMA 传输由从 N2HET2 RAM 运行的 N2HET 指令触发。

    1. DMA 将数据从一个缓冲区传输到位于 MCU SRAM 中的另一个缓冲区

    2. DMA 请求线24映射到 DMA 通道0。 请求行24是来自 N2HET 指令的请求编号6

      dmaReqAssign (DMA_CH0、 24 );

      一条 N2HET 指令能够通过编辑"reqnum"来选择8个请求线路中的一个、在这个示例中使用 reqnum=6。

      eCMP{reqnum= 6 ,请求= GENREQ ,en_pin_action=on、pin=8、action=PULSELO、reg=A、IRQ=on、data=5、hr_data=0};

    3。  N2HET 请求目的选择寄存器(HETREQDS)应该被配置成触发 DMA 通道、而不是 HTU 通道:

      hetREG2->REQDS = 0xFF;

      hetREG2->REQENS = 0xFF;

    4. hetRAM2->Instruction [1].Control |=(0x1<<27)|(0x1<<22));

      这是为了启用请求和引脚操作。

    我的测试显示数据通过 DMA 通道0传输到 RX_DATA 缓冲区。 DMA 中断、和 N2HET 中断被生成。

    e2e.ti.com/.../RM46L852_5F00_N2HET_5F00_DMA.zip

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

    是否需要有最后一行代码(hetRAM2 ->指令[1].control =...) ? 是否已在 HET 代码中开启引脚操作和同时开启 Generate 请求?
    我不知道为什么我们需要重复源文件中的 hetcode 配置

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

    尊敬的 Nuno:

    您不必如此。 只展示您如何手动修改 HET RAM 中 HET 指令的使能/禁用控制位  

    1.我手动更改了代码以禁用 DMA 请求  

    2.最后一行用来使能 DMA 请求  

    hetRAM2->Instruction [1].Control |=(0x1<<27)|(0x1<< 22));

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

    这是我的 sys_main。
    L06触发 DMA 请求。 我已经选择目标寄存器来指向 HET1的最后8个引脚并将它们初始化为输出。
    我用逻辑分析仪无法看到任何内容。

    /** @file sys_main.c 
    *   @brief Application main file
    *   @date 11-Dec-2018
    *   @version 04.07.01
    *
    *   This file contains an empty main function,
    *   which can be used for the application.
    */
    
    /* 
    * Copyright (C) 2009-2018 Texas Instruments Incorporated - www.ti.com 
    * 
    * 
    *  Redistribution and use in source and binary forms, with or without 
    *  modification, are permitted provided that the following conditions 
    *  are met:
    *
    *    Redistributions of source code must retain the above copyright 
    *    notice, this list of conditions and the following disclaimer.
    *
    *    Redistributions in binary form must reproduce the above copyright
    *    notice, this list of conditions and the following disclaimer in the 
    *    documentation and/or other materials provided with the   
    *    distribution.
    *
    *    Neither the name of Texas Instruments Incorporated nor the names of
    *    its contributors may be used to endorse or promote products derived
    *    from this software without specific prior written permission.
    *
    *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
    *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
    *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
    *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
    *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
    *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
    *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
    *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    *
    */
    
    
    /* USER CODE BEGIN (0) */
    /* USER CODE END */
    
    /* Include Files */
    
    #include "sys_common.h"
    
    /* USER CODE BEGIN (1) */
    #include "rti.h"
    #include "het.h"
    #include "gio.h"
    #include "PWM.h"
    #include "sys_dma.h"
    /* USER CODE END */
    
    /** @fn void main(void)
    *   @brief Application main function
    *   @note This function is empty by default.
    *
    *   This function is called after startup.
    *   The user can use this function to implement the application.
    */
    
    /* USER CODE BEGIN (2) */
    void dmaConfigCtrlPacket(uint32 sadd,uint32 dadd,uint32 dsize);
    void delay();
    uint8 TX_DATA[]={0xff,0x0};
    
    g_dmaCTRL g_dmaCTRLPKT;
    
    void createTxDummyPacket(uint8_t *packet, uint32_t size);
    
    static uint8_t *phetREG1DOUT8;
    /* USER CODE END */
    
    int main(void)
    {
    /* USER CODE BEGIN (3) */
    
        uint8_t dummyPacket[1024];
    
        createTxDummyPacket(&dummyPacket[0], 1024);
    
        phetREG1DOUT8 = &((uint8_t *) &(hetREG2->DOUT))[3];
    
        dmaReqAssign(DMA_CH0,24);
    
        dmaConfigCtrlPacket((uint32)(&TX_DATA),((uint32) phetREG1DOUT8),2);
    
        dmaSetCtrlPacket(DMA_CH0,g_dmaCTRLPKT);
    
        dmaSetChEnable(DMA_CH0, DMA_HW);
    
        dmaEnable();
    
        /* Enable IRQ - Clear I flag in CPS register */
        /* Note: This is usually done by the OS or in an svc dispatcher */
    
    
        hetInit();
    
        hetREG2->HRSH &= 0xFFFF0000;
        hetREG2->AND &= 0xFFFF0000;
        hetREG2->XOR &= 0xFFFF0000;
    
        hetREG2->REQENS = (hetREG2->REQENS & 0xFFFFFF00) | ((uint32_t) (1 << DMA_CH0));
        hetREG2->REQDS = (hetREG2->REQDS & 0xFF00FF00) | ((uint32_t) (1 << DMA_CH0));
    
    
        /* Run forever */
    
            /* CORTEX request signal pin - HIGH / LOW */
        hetREG2->DIR |= (1 << PIN_HET_0);
        hetREG2->DIR |= (0 << PIN_HET_4);
        hetREG2->DIR |= (1 << PIN_HET_6);
    
        hetREG1->DIR |= (1 << PIN_HET_24);
        hetREG1->DIR |= (1 << PIN_HET_25);
        hetREG1->DIR |= (1 << PIN_HET_26);
        hetREG1->DIR |= (1 << PIN_HET_27);
        hetREG1->DIR |= (1 << PIN_HET_28);
        hetREG1->DIR |= (1 << PIN_HET_29);
        hetREG1->DIR |= (1 << PIN_HET_30);
        hetREG1->DIR |= (1 << PIN_HET_31);
    //    hetRAM2->Instruction[pHET_L00_0].Data = (hetRAM2->Instruction[pHET_L00_0].Data & 0x0000007F) | ((uint32_t) 0 << 7);
    
    
        hetRAM2->Instruction[pHET_L06_0].Program = (hetRAM2->Instruction[pHET_L06_0].Program & 0xFC7FFFFF) | ((uint32_t) DMA_CH0 << 23);
    
        hetRAM2->Instruction[pHET_L06_0].Control = (hetRAM2->Instruction[pHET_L06_0].Control & 0xFC7FFFFF) | ((uint32_t) 0x1 << 27);
    
        hetRAM2->Instruction[pHET_L09_0].Data = (hetRAM2->Instruction[pHET_L09_0].Data & 0x0000007F) | ((uint32_t) 24 << 7);
    
        while(1)
        {
            delay();
            hetRAM2->Instruction[pHET_L00_0].Data = (hetRAM2->Instruction[pHET_L00_0].Data & 0x0000007F) | ((uint32_t) 0 << 7);
        }
    
    /* USER CODE END */
    
        return 0;
    }
    
    
    /* USER CODE BEGIN (4) */
    void dmaConfigCtrlPacket(uint32 sadd,uint32 dadd,uint32 dsize)
    {
      g_dmaCTRLPKT.SADD      = sadd;              /* source address             */
      g_dmaCTRLPKT.DADD      = dadd;              /* destination  address       */
      g_dmaCTRLPKT.CHCTRL    = 0;                 /* channel control            */
      g_dmaCTRLPKT.FRCNT     = dsize;                 /* frame count                */
      g_dmaCTRLPKT.ELCNT     = 1;             /* element count              */
      g_dmaCTRLPKT.ELDOFFSET = 4;                 /* element destination offset */
      g_dmaCTRLPKT.ELSOFFSET = 0;                 /* element destination offset */
      g_dmaCTRLPKT.FRDOFFSET = 0;                 /* frame destination offset   */
      g_dmaCTRLPKT.FRSOFFSET = 0;                 /* frame destination offset   */
      g_dmaCTRLPKT.PORTASGN  = 4;                 /* port b                     */
      g_dmaCTRLPKT.RDSIZE    = ACCESS_8_BIT;     /* read size                  */
      g_dmaCTRLPKT.WRSIZE    = ACCESS_8_BIT;     /* write size                 */
      g_dmaCTRLPKT.TTYPE     = FRAME_TRANSFER ;   /* transfer type              */
      g_dmaCTRLPKT.ADDMODERD = ADDR_INC1;         /* address mode read          */
      g_dmaCTRLPKT.ADDMODEWR = ADDR_OFFSET;       /* address mode write         */
      g_dmaCTRLPKT.AUTOINIT  = AUTOINIT_ON;       /* autoinit                   */
    }
    
    void delay()
    {
        int i=0;
        for(i=0;i<300;i++)
        {
            asm(" nop ");
    
        }
    }
    
    void createTxDummyPacket(uint8_t *packet, uint32_t size)
    {
        uint32_t i = 0;
    
        for(i = 0; i < size; i++)
        {
            packet[i] = (i % 256);
        }
    }
    /* USER CODE END */
    

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

    我的示例告诉您如何从 NHET RAM 代码触发 DMA 传输。 你是否得到了 DMA 的触发?

    您是否可以打开 NHET 寄存器窗口以检查数据是否已传输到 DOUT 寄存器?  

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

    我看到了您的示例、它在我的硬件中能够很好地工作。 我的问题是当目标寄存器是 HET 引脚时。 我不知道该怎么做

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

    您只需更改 DMA 数据包的目标地址。  

    如果您要切换 HET 引脚7、您必须将0x80写入 HET 输出寄存器。 请注意、RM46是一个小端字节序器件。 DOUT 寄存器的位[7:0]位于地址&(hetREG2->DOUT)(0xFFF7B954)、位[31:24]位于 &(hetREG2->DOUT)+3或(0xFFF7B954 + 0x3)。

    请检查 DOUT、以确保将该值写入正确的位字段。

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

    我已经检查了它。 如果你看看我给你的源代码、我有与你完全一样的初始化、并且我有指向 HET1最后8位的目的地址

    hetREG2->DOUT= &((uint8_t *)&(hetREG12>DOUT)[3];

    我的 DMA 仍无法正常工作

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

    不能使用 REQNUM=0来生成 DMA 请求。

    若要生成 DMA 请求、reqnum 必须为4、5、6或7:

    请参阅 TRM:  对 DMA 和 HTU 的 N2HET 请求

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

    I 使用 REQNUM= 6、REQ=24且 CH=0

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

    如您所知、在我的调试器中、DMA 正在工作、但我无法使用逻辑分析仪观察到它发生的情况。 因此、如果你在这里进行检查、我将把0xff 传递给 HET2的最后8个引脚。
    tx_data[]={0xff};




    当我进入 DE 调试模式时、会发生以下情况:




    由于这是小端字节序、因此我知道它在工作。 但当我插入逻辑分析仪时、我看不到位上升。 我将它们编程为输出、默认值为0。
    我缺少什么吗?

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

    很高兴知道 DMA 能够正常工作。

    请检查引脚多路复用配置、确保这些引脚已分配给 N2HET1信号。

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

    我使它完美地运行。 感谢你的帮助。 我还有一个问题。 我的 HET 代码、当我使用 DMA 请求时、代码如下所示:





    出于某种原因、始终存在与 DMA 请求以及我用于检查输出引脚的逻辑分析仪相关的延迟。
    每次通过 hetcode 发出 DMA 请求时、在我看到输出引脚的变化后会出现180-200ns 错误。
    这是真的吗?

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

    DMA 请求和引脚切换之间有一些延迟。 当发出 DMA 请求时、您是如何在逻辑分析仪上捕获这一时刻的?

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

    在 HET 代码中、当 PWM 上升时、我有 DMA 请求。 PWM 位于 HET2引脚6上。 该请求会将信息放置在 HET1的最后8个引脚中。 我刚刚将逻辑分析仪接地、接地2引脚6和1引脚24-31。 我甚至尝试更改 PWM 频率和占空比、在 rr=16和 hr=1时、延迟始终在180-200ns 之间。

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

    尊敬的 Nuno:

    我知道 CPU 访问 GPIO 寄存器大约需要20个周期、但我不知道 DMA 将一个字节的数据传输到 HET 寄存器需要多少个周期。  

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

    好的、非常感谢!