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.

[参考译文] MSP432P401R:SPI 和 DMA

Guru**** 2510075 points
Other Parts Discussed in Thread: DAC161S055

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/765379/msp432p401r-spi-and-dma

器件型号:MSP432P401R
主题中讨论的其他器件:DAC161S055

您好!

我想将一些数据从 RAM 传输到连接到 DAC 的 SPI 接口之一。

DAC 需要24位、但不会将两者之间的 CS 线路置为有效。 目前、我使用 GPIO 引脚手动生成 CS 线路。

为了加快整个过程、我想使用 DMA 传输。 我已经处理了给定的 SPI 和 DMA 模板、但每次我都无法运行该示例。 我希望每个字节的 DMA 都应由 SPI 触发、数据应从一个存储器位置转移到所提到的目标存储位置。

我的问题(在开始深入研究 DMA 文档之前):

-什么原因导致我无法获得任何输出(我认为 SPI 无法触发 DMA) ?

-由于 DAC 没有任何内存电阻器,什么可以是目标内存地址? (由于数据始终存储在 MSP432中、但我不理解如何查找目标存储器地址)

欢迎您提供任何提示和帮助!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    什么是"无"? 无 SPI 活动? DAC 输出不变?

    什么是 DAC? 示例是什么?

    对于一个 Tx、DMA 目标应该是 USCI 发送缓冲器(例如&UCB0TXBUF)和触发中断标志(例如 UCTXIFG)。 请记住、DMA 将在事务完成之前完成。

    未经请求:对于通过快速 SPI 进行的简短(3字节)事务(TI 的大多数 SPI DAC 速度相当快)、DMA 将整体降低速度。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    另请参阅:
    e2e.ti.com/.../2828840
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bruce、

    我在上面的问题中参考了以下示例:('dma_eusci_spi_loopback '')。 我测试此示例只是为了确保任一 DMA 正常工作、以及它如何将数据从一个存储器位置传输到另一个存储器位置。 通过使用断点、我检查了目标寄存器(在示例中被称为缓冲器)、但它的所有条目始终保持为零。 我期望该目标存储器位置应从源存储器位置获取数据(也被称为缓冲区)、这就是我假设可能是 DMA 不是由 SPI 触发的原因。

    在我的任务中、我希望加快 SPI 速度(我认为这有助于我节省一些时间、最高可达10 μ s)。
    传输时、我有三个字节的发送器缓冲区、但我的问题是目标存储器位置。 一位 TI 专家建议我将 SPI 传输缓冲区值存储在一个变量中、并将其用作目标存储器地址、但这将是一个传输缓冲区 (我有 DAC161S055、它需要一个字节命令和2个字节的数据、我已经将它们分为三个字节、并使用 SPI 协议依次以一个字节的形式传输它们。 我还在下面附加了代码)、但我认为 DAC 输出是分段存储器位置、我不知道输出存储在何处。

    注意:为了查看代码行为、我将一个缓冲区'test'定义为目标存储器位置、以查看 DMA 正在传输的内容、但该缓冲区条目也始终保持为零。


    SpiTxBuffer[0]= 0x08;
    SpiTxBuffer[1]=*((uint8_t*)(&DacValueDigits)+ 1);
    SpiTxBuffer[2]=*((uint8_t*)(&DacValueDigits));


    MAP_DMA_setChannelControl (DMA_CH0_EUSCIB0TX0 | UDMA_PRI_SELECT、
    UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1);
    MAP_DMA_setChannelTransfer (DMA_CH0_EUSCIB0TX0 | UDMA_PRI_SELECT、
    UDMA_MODE_BASIC、SpiTxBuffer、
    (void *) map_spi_getTransmitBufferAddressForDMA (EUSCI_B0_BASE)、test
    1);
    MAP_DMA_setChannelControl (DMA_CH1_EUSCIB0RX0 | UDMA_PRI_SELECT、
    UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARB_1);
    MAP_DMA_setChannelTransfer (DMA_CH1_EUSCIB0RX0 | UDMA_PRI_SELECT、
    UDMA_MODE_BASIC、
    测试、
    1);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否按照程序顶部的说明(图形)安装跳线? 它们构成从 USCI B0到 B1的物理回送

    正如 Chris 在另一个线程中所解释的、您无法在 DAC 器件中设置任何寄存器。 您只需发送数据(使用适当的命令)并要求 DAC 存储数据。 DAC 数据表中介绍了如何实现这一目标。

    要发送存储到 SPI 传输缓冲区(MAP)的数据(或 DMA),SPI 会为您发送数据到 DAC。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bruce、

    是的、我完成了跳线连接、今天我又试了一次、这个示例现在工作正常。
    我想为我的项目扩展它、我只有一个 SPI 通道。 是否需要为一个 SPI 使用两个 DMA 通道??

    因为根据驱动程序库、一个完整传输应该有一个通道。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您从未计划从 DAC 接收任何内容、则无需在接收端使用 DMA 通道。 (实际上、您甚至无需连接 SOMI 引脚。) 字节仍将存储在 RXBUF 中、但会被忽略。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想逐步移动。有关连接的另一个问题,我是否需要为项目建立物理连接?  我认为不需要、因为我只需要主器件传输和接收。

    如果我只想使用一个 DMA 通道、您能画一个还是给我一些提示吗?

    非常感谢。 因为我是嵌入式系统的初学者、可能也会提出非常基本的问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您在开始时提到、您在没有 DMA 的情况下使其工作。 DMA 对接线没有影响、因此我认为您不需要更改任何内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bruce、

    我还有一个问题。 以前、我是通过 SPI 手动传输数据的。 我已经了解了 DMA 的工作原理、现在我不需要这个"mullay transfer"。 DMA 将执行所有此传输,是吗??

    那么为什么我需要 SPI 的中断标志(UCTXIFG )? 也请查看我的代码:


    /*设置 TX 传输特性和缓冲器*/
    MAP_DMA_setChannelControl (DMA_CH0_EUSCIB0TX0 | UDMA_PRI_SELECT、
    UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1);
    MAP_DMA_setChannelTransfer (DMA_CH0_EUSCIB0TX0 | UDMA_PRI_SELECT、
    UDMA_MODE_AUTO、SpiTxBuffer (SpiTxBuffer)和
    (空*) MAP_SPI_getTransmitBufferAddressForDMA (EUSCI_B0_BASE)、
    8);

    /*分配/启用中断*/
    MAP_Interrupt_enableInterrupt (INT_DMA_INT1);
    MAP_DMA_enableInterrupt (INT_DMA_INT1);


    SpiTxBuffer[0]= 0x08;
    SpiTxBuffer[1]=*((uint8_t*)(&DacValueDigits)+ 1);
    SpiTxBuffer[2]=*((uint8_t*)(&DacValueDigits));
    //SpiTxBufferSize = sizeof (SpiTxBuffer)/sizeof (SpiTxBuffer[0]);
    //SpiTxBufferPos = 0;

    MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P3、GPIO_PIN7);

    MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P6、GPIO_PIN0);
    //SPI_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_SPI_Transmit 中断);

    MAP_DMA_enableChannel (0);

    空 DMA_INT1_IRQHandler (空)


    isrCounter++;

    MAP_DMA_clearInterruptFlag (0);

    /*禁用中断以允许执行*/
    MAP_Interrupt_disableInterrupt (INT_DMA_INT1);
    MAP_DMA_disableInterrupt (INT_DMA_INT1);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不确定我是否理解这个问题。 您不需要:

    >//SPI_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_SPI_Transmit 中断);

    由于 UCTXIFG 是驱动 DMA 的器件、因此您不想让它变得一团糟。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bruce、

    我只想问您、当 DMA 将使用 SPI 运行时、DMA 将传输指定位置的所有数据、但每次都将由 SPI 触发。 (DMA 的真正概念是否也是??)

    和以前一样、我使用 SPI 中断传输3个字节的数据(MCU 到 DAC)。 我的想法是、然后我不再需要启用 SPI 中断、因为现在 DMA 正在为我执行所有传输。 (请检查为上述中断定义的以下代码)

    空 EUSCIB0_IRQHandler (空)

    if (SPI_getInterruptStatus (EUSCI_B0_BASE、EUSCI_B_SPI_Transmit 中断))

    if (SpiTxBufferSize >0)

    //SPI_clearInterruptFlag (EUSCI_B0_BASE、EUSCI_B_SPI_Transmit 中断);
    SPI_transmitData (eUSCI_B0_BASE、SpiTxBuffer[SpiTxBufferPos]);
    SpiTxBufferPos++;
    SpiTxBufferSize--;

    其他


    SpiTxBufferPos = 0;
    SpiTxBufferSize = 0;
    SPI_DisableInterrupt (EUSCI_B0_BASE、EUSCI_B_SPI_Transmit 中断);



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    DMA 取代了这个 ISR --它从 UCTXIFG 触发,它每次传输一个字节,并且在它耗尽字节(在你的情况下=3)后停止。

    您不应启用此 ISR (如果需要、可以将其删除)、因为它只会干扰 DMA。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、

    我现在正在尝试为我的项目使用 DMA 散聚模式、因为我认为这将对我更有帮助。 阅读文档后、我设置了代码、但我认为在 DMA 中断处理程序中出错了。

    因为我不想从从站侧接收数据,所以我是否需要将数据 传输到任何其他文件夹中&EUSCI_B1_SPI->RXBUF? 因为我想写入3字节数据、在一个任务中、我可以传输最大1字节的数据。 根据我的理解,我定义了源地址加法。为此,请检查以下代码:

    DMA_ControlTable spiDacDmaSeq[TX_Tasks]=
    {
    /*任务1、虚拟读取 RX 缓冲区以清除 IFG
        DMA_TaskStructEntry (1、UDMA_SIZE_8、
                    UDMA_SRC_INC_NONE、&EUSCI_B1_SPI->RXBUF、
                    UDMA_DST_INC_NONE、 &dummyRX、
                    UDMA_ARB_4、(UDMA_MODE_MEM_SP散 射_聚+UDMA_MODE_ALT_SELECT)、*/
    /*任务2、清除芯片选择 P6.2
        DMA_TaskStructEntry (1、UDMA_SIZE_8、
                    UDMA_SRC_INC_NONE、&outputLow、
                    UDMA_DST_INC_NONE、 &P6->OUT、
                    UDMA_ARB_4、(UDMA_MODE_MEM_SP散 射_聚+UDMA_MODE_ALT_SELECT)、*/
    /*任务3、加载 TX 缓冲区以启动 SPI */
    DMA_TaskStructEntry (1、UDMA_SIZE_8、
    UDMA_SRC_INC_NONE、SpiTxBuffer[0]、
    UDMA_DST_INC_NONE、&EUSCI_B1_SPI->TXBUF、
    UDMA_ARB_4、(UDMA_MODE_PER_SP散 射_收集+ UDMA_MODE_ALT_SELECT)、
    /*任务4、虚拟读取 RX 缓冲区以清除 IFG、等待 RXIFG 触发
        器 DMA_TaskStructEntry (1、UDMA_SIZE_8、
                    UDMA_SRC_INC_NONE、&EUSCI_B1_SPI->RXBUF、
                    UDMA_DST_INC_NONE、 &dummyRX、
                    UDMA_ARB_4、(UDMA_MODE_MEM_SP散 射_收集+UDMA_MODE_ALT_SELECT)、
        //任务5、加载 TX 缓冲区以启动 SPI */
    DMA_TaskStructEntry (1、UDMA_SIZE_8、
    UDMA_SRC_INC_NONE、SpiTxBuffer[1]、
    UDMA_DST_INC_8、&EUSCI_B1_SPI->TXBUF、
    UDMA_ARB_4、(UDMA_MODE_PER_SP散 射_收集+ UDMA_MODE_ALT_SELECT)、
    //
         *任务6,虚拟读取 RX 缓冲区以清除 IFG
         *此延迟可确保在传输最后一个字节后发生芯片选择
    
        DMA_TaskStructEntry (1,UDMA_SIZE_8,
                    UDMA_SRC_INC_NONE,&EUSCI_B1_SPI->RXBUF,
                    UDMA_DST_INC_NONE, &dummyRX、
                    UDMA_ARB_4、(UDMA_MODE_MEM_SP散 射_收集+UDMA_MODE_ALT_SELECT)、
         //任务7、加载 TX 缓冲区以启动 SPI */
    DMA_TaskStructEntry (1、UDMA_SIZE、8、
    UDMA_SRC_INC_NONE、SpiTxBuffer[2]、
    UDMA_DST_INC_16、&EUSCI_B1_SPI->TXBUF、
    UDMA_ARB_4、(UDMA_MODE_BASIC)
    //任务8,设置 GPIO,芯片选择
        DMA_TaskStructEntry (1,UDMA_SIZE_8,
                    UDMA_SRC_INC_NONE, &DAC_CS、
                    UDMA_DST_INC_NONE、&P6->OUT、
                    UDMA_ARB_4、UDMA_MODE_BASIC)*/
    };
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我推迟到此向导上的 Driverlib 向导。 我熟悉散射/收集、但不熟悉它的 Driverlib 模型。
    --------------
    如果您不关心 Rx 数据、则无需将其移动到任何位置。 RX 端将溢出、但您可以忽略它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    正如 Bruce 已经提到的、您无需移动 Rx 数据。  如果您在 SDK 中看到了该示例、则会看到 RX 用于标识已传输的最后一个字节、并使用该字节确保在之后不会释放芯片选择。  这就要求接收中断被用作触发器并且 RX 被处理、以便为下一个接收字节清除 DMA 触发器(IFG)。  

    eUSCI SPI 需要记住的一点。  到 DMA (IFG)的发送触发意味着发送缓冲区为空并且内容已经被移动到移位寄存器。  这并不意味着实际发送了数据。  RX IFG 将指示数据已实际发送。  如果您要将 DMA 设置为在发送 IFG 上触发、那么您就会遇到一个问题、即知道何时释放芯片选择

    在您提供的代码中、有一个递增目的寄存器的位置、但目的是传输缓冲区。  这将不起作用、因为您最终会在外设空间中的某个位置出现、甚至可能会覆盖外设配置。 -编辑-这实际上是无关的、因为大小为"1"。

    此致、
    Chris

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

    感谢您的详细解释。 因为我正在控制我在代码中定义的手动芯片选择,所以我不需要注意芯片选择。 我正在使用通道0、其触发源为 eUSCI_B0_TX0 (使用 eUSCI_B0模块)。 在散聚模式下,我只需要考虑以下参数:(如果缺少某些参数,请在此处更正)
    1)任务表(下面提到的代码)
    2) 1)个 DMA 通道(通道0定义)
    3) 1)个 DMA 中断(MAP_DMA_赋 值中断(DMA_INT1、0)

    我有以下问题:

    1)如何分配频道编号? (我喜欢它(MAP_DMA_assignChannel (DMA_CH0_EUSCIB0TX0))))
    2)如何声明散聚模式命令? (我确实喜欢 dma_setChannelScatterGather (dma_CH0_EUSCIB0TX0、TX_tasks、(void*)&spiDacDmaSeq、1)))

    调试此代码时,SCLK 保持为零,表示 SPI 无法触发 DMA,此外,我定义了一个 dummyRX (用于计数器检查 DMA 是否正常工作),但它也没有得到任何值。

    (二
    /* DMA 控制表*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_ALIGN (controlTable、1024)
    #Elif defined (_IAR_systems_icc_)
    #pragma DATA_alignment=1024
    #Elif defined (_GNU_)
    __attribute__((对齐(1024)))
    #Elif defined (_CC_ARM)
    _align (1024)
    #endif
    #define Tx_tasks 6.
    uint8_t controlTable[16];

    **** 任务列表'********

    DMA_ControlTable spiDacDmaSeq[TX_Tasks]=

    /*Task1,虚拟读取 RX 缓冲区以清除 IFG */
    DMA_TaskStructEntry (1、UDMA_SIZE_8、
    UDMA_SRC_INC_NONE、&EUSCI_B1_SPI->RXBUF、
    UDMA_DST_INC_NONE、&dummyRX、
    UDMA_ARB_4、(UDMA_MODE_MEM_散 射_收集)、
    /*任务3、加载 TX 缓冲区以启动 SPI */
    DMA_TaskStructEntry (1、UDMA_SIZE_8、
    UDMA_SRC_INC_NONE、SpiTxBuffer[0]、
    UDMA_DST_INC_NONE、&EUSCI_B1_SPI->TXBUF、
    UDMA_ARB_4、(UDMA_MODE_PER_散 射_收集)、
    /*任务4、虚拟读取 RX 缓冲区以清除 IFG、等待 RXIFG 触发器*/
    DMA_TaskStructEntry (1、UDMA_SIZE_8、
    UDMA_SRC_INC_NONE、&EUSCI_B1_SPI->RXBUF、
    UDMA_DST_INC_NONE、&dummyRX、
    UDMA_ARB_4、(UDMA_MODE_MEM_散 射_收集)、
    /*任务5、加载 TX 缓冲器以启动 SPI */
    DMA_TaskStructEntry (1、UDMA_SIZE_8、
    UDMA_SRC_INC_NONE、SpiTxBuffer[1]、
    UDMA_DST_INC_NONE、&EUSCI_B1_SPI->TXBUF、
    UDMA_ARB_4、(UDMA_MODE_PER_散 射_收集)、
    /*
    *任务6、虚拟读取 RX 缓冲区以清除 IFG
    *此延迟可确保芯片选择在最后一个字节被发送后发生
    *
    DMA_TaskStructEntry (1、UDMA_SIZE_8、
    UDMA_SRC_INC_NONE、&EUSCI_B1_SPI->RXBUF、
    UDMA_DST_INC_NONE、&dummyRX、
    UDMA_ARB_4、(UDMA_MODE_MEM_散 射_收集)、
    /*任务7、加载 TX 缓冲器以启动 SPI */
    DMA_TaskStructEntry (1、UDMA_SIZE_8、
    UDMA_SRC_INC_NONE、SpiTxBuffer[2]、
    UDMA_DST_INC_NONE、&EUSCI_B1_SPI->TXBUF、
    UDMA_ARB_4、(UDMA_MODE_AUTO)、

    };

    (二 主代码******
    MAP_DMA_赋 值通道(DMA_CH0_EUSCIB0TX0);
    MAP_DMA_赋 值中断(DMA_INT1、0);
    MAP_Interrupt_enableInterrupt (INT_DMA_INT1);
    MAP_Interrupt_disableSlepOnIsrExit();
    (二
    MAP_DMA_setChannelScatterGather (DMA_CH0_EUSCIB0TX0、TX_TAGESHOTs,(void*)&spiDacDmaSeq,1);
    MAP_DMA_enableChannel (DMA_CH0_EUSCIB0TX0);

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

    (1)您已正确分配通道、但是、您正在 启用通道 API 上下文中使用通道分配变量 、该变量将不起作用。  请参阅 API 指南以了解正确的值。

    "此函数分配一个到 DMA 通道的外设映射。 它用于选择用于 DMA 通道的外设。 参数 映射 应该是  头文件 dma.h 中名为 udma_chn_ttt 的宏之一例如、要将 DMA 通道0分配给 eUSCI AO RX 通道、该参数应是宏 命令 UDMA_CH1_EUSCIA0RX。"

    (2) 散聚模式的配置是通过突出显示的 API 完成的。  完成此操作后、您将启用通道。  在您的特定情况下、如果您触发来自 eUSCI 的发送、请注意、配置 eUSCI 后、TX IFG 会立即置1。  这是因为初始化后缓冲区为空。  同样、由于使用了错误的参数、您无法启用通道。   

    我强烈建议查看前面提到的示例。  请注意操作顺序和语法。  同样、不要启用 SPI 中断。  根据 DMA 的定义、它将通过适当的信号触发。

    此致、

    Chris

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

    感谢您的取出说明、我非常了解推荐的示例、并尝试在我的案例中实施。 根据我的理解,它应该起作用,但在调试它时,MOSI 和 SIMO 不会移动,并产生与我以前相同的结果。 如果您只看一下我的代码、那会很好、因为我认为我在 SPI_Interrupt 的某个位置遇到了问题(可能是)。 非常感谢您在我的所有论文中提供的支持。
    /******* 配置 DMA 模块 /
    map_dma_enableModule();
    MAP_DMA_setControlBase (controlTable);
    MAP_DMA_赋 值通道(DMA_CH0_EUSCIB0TX0);
    MAP_DMA_赋 值中断(DMA_INT1、0);


    /********* 声明***** /

    MAP_DMA_setChannelScatterGather (DMA_CH0_EUSCIB0TX0、TX_tasks、(void*)&spiDacDmaSeq[0]、0);
    MAP_DMA_clearInterruptFlag (DMA_CH0_EUSCIB0TX0和0x0F);
    MAP_DMA_enableChannel (0);
    EUSCI_B0_SPI->IFG |= EUSCI_B_IFG_RXIFG0;

    SPI_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_SPI_Receive_interrupt);/*主 SPI 中断*
    /*分配/启用中断*/
    MAP_DMA_enableInterrupt (INT_DMA_INT1);
    MAP_Interrupt_enableInterrupt (INT_DMA_INT1);
    MAP_Interrupt_disableSlepOnIsrExit();
    秘书长的报告 任务列表********
    DMA_ControlTable spiDacDmaSeq[TX_Tasks]=

    /*Task1,虚拟读取 RX 缓冲区以清除 IFG */

    DMA_TaskStructEntry (1、UDMA_SIZE_8、
    UDMA_SRC_INC_NONE、&EUSCI_B1_SPI->RXBUF、
    UDMA_DST_INC_NONE、&dummyRX、
    UDMA_ARB_1、(UDMA_MODE_MEM_散 射_收集)、

    /*任务3、加载 TX 缓冲区以启动 SPI */

    DMA_TaskStructEntry (1、UDMA_SIZE_8、
    UDMA_SRC_INC_NONE、SpiTxBuffer[0]、
    UDMA_DST_INC_NONE、&EUSCI_B1_SPI->TXBUF、
    UDMA_ARB_1、(UDMA_MODE_PER_散 射/收集)、

    /*任务4、虚拟读取 RX 缓冲区以清除 IFG、等待 RXIFG 触发器*/

    DMA_TaskStructEntry (1、UDMA_SIZE_8、
    UDMA_SRC_INC_NONE、&EUSCI_B1_SPI->RXBUF、
    UDMA_DST_INC_NONE、&dummyRX、
    UDMA_ARB_1、(UDMA_MODE_MEM_散 射_收集)、

    /*任务5、加载 TX 缓冲器以启动 SPI */

    DMA_TaskStructEntry (1、UDMA_SIZE_8、
    UDMA_SRC_INC_NONE、SpiTxBuffer[1]、
    UDMA_DST_INC_NONE、&EUSCI_B1_SPI->TXBUF、
    UDMA_ARB_1、(UDMA_MODE_PER_散 射/收集)、
    /*
    *任务6、虚拟读取 RX 缓冲区以清除 IFG

    DMA_TaskStructEntry (1、UDMA_SIZE_8、
    UDMA_SRC_INC_NONE、&EUSCI_B1_SPI->RXBUF、
    UDMA_DST_INC_NONE、&dummyRX、
    UDMA_ARB_1、(UDMA_MODE_MEM_散 射_收集)、

    /*任务7、加载 TX 缓冲器以启动 SPI */

    DMA_TaskStructEntry (1、UDMA_SIZE_8、
    UDMA_SRC_INC_NONE、SpiTxBuffer[2]、
    UDMA_DST_INC_NONE、&EUSCI_B1_SPI->TXBUF、
    UDMA_ARB_1、(UDMA_MODE_AUTO)、

    };
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在此片段中、您提供了一些没有意义的东西:
    (1)触发器是 eUSCI TX IFG、然而、根据这个触发器、您似乎正在从接收缓冲区中读取数据。 用于触发 DMA 的 TX IFG 只指示数据已从发送缓冲区移动到发送移位寄存器中、并且没有接收到实际数据。 在发送移位寄存器中有数据实际移出之前、SPI 时钟不会变为有效状态。
    (2) eUSCI RX 错误中断被启用。 根据提供的代码、我不确定如何处理此问题。 这意味着正在为 ISR 提供服务、可能会在 DMA 也为 RX 缓冲区提供服务的同时从 RX 缓冲区读取数据。
    (3)使用散聚法似乎不会带来任何好处。 当 TXIFG 触发发生时、更直接的做法是仅使用基本模式加载 TX 缓冲区。

    由于您不关心芯片选择、可能更好的示例是 SPI 回路、因此您只需要在 TX 上触发、只需将数据移动到 TX 缓冲区。
    dev.ti.com/.../

    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Chris 和 Bruce、我已经解决了 DMA 问题。 我使用了散热收集技术、这有助于我加快 SPI 速度、并能够节省10us 时间。 我还获得了与 SPI 回路技术类似的结果。 再次感谢您在我的论文中提供的支持。 )

    此致、
    Hasan