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:通过 DMA 通道操作 SPI2

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/565836/msp432p401r-operating-spi2-through-dma-channel

器件型号:MSP432P401R

你(们)好

我正在尝试通过 DMA 通道6、7操作 SPI_B2 (P3.5-3.7)、但它不起作用我启动 SPI_B2并在没有 DMA 通道的情况下对其进行测试、它工作正常、 但是当我使用 DMA 通道时、通道的启动是正确的、并且 DMA 表中的控制字也是正确的、但是 DMA 不会移动、并且控制字显示它不会减少剩余要发送的字节数。

SPI2已正确启动、因为我可以手动写入 EUSCI_B2的 UCBTXBUF、并使用 P3.5-P3.6上的逻辑分析仪查看字节和时钟。

我要附上代码的相关部分(仅 TX DMA):

DMA_DATA_STRURT DMACONTRO表[16];           //8 DMA 通道* 2 (ALT 通道)= 16*4*4字节
#pragma DATA_ALIGN (DMAcontrolTable、256)

UC TestArray[10]={1、2、3、4、5、6、7、8、9、10};

//设置 SPI2外设

///---------------------- =  

MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P3、GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7、GPIO_PRIMARY_MODULE_FUNCTION);

EUSCI_B2->CTLW0 |= EUSCI_B_CTLW0_SWRST;//将 eUSCI 状态机置位

EUSCI_B2->CTLW0 = EUSCI_B_CTLW0_SWRST |   //保持 eUSCI 状态机处于复位状态
                       EUSCI_B_CTLW0_CKPL |   //将时钟极性设置为高电平、CKPH=0。 在时钟的上升沿采样的数据。
                       EUSCI_B_CTLW0_MSB |    // MSB 优先、8位
                       EUSCI_B_CTLW0_MST |    //设置为 SPI 主设备
                       EUSCI_B_CTLW0_MODE_0 |// 3线模式00
                       EUSCI_B_CTLW0_SYNC |   //设置为同步模式
                       EUSCI_B_CTLW0_ssel_SMCLK |   //使用 SMCLK
                       EUSCI_B_CTLW0_STEM;             //在3线制模式中忽略,在4线制模式中激活从器件使能信号。
                     

EUSCI_B2->BRW =(US)(SMClock / 1000000);// fBitClock = fBRCLK/(UCBRx+1)。

EUSCI_B2->CTLW0 &=~EUSCI_B_CTLW0_SWRST;  //初始化 USCI 状态机

 MAP_SPI_enableModule (EUSCI_B2_base);

/*配置 DMA 模块*/
//----------------------------------
map_dma_enableModule();  
MAP_DMA_setControlBase (DMAcontrolTable);

//将通道6分配给 EUSCIB2TX
//--------------------------------------------------
MAP_DMA_赋 值通道(DMA_CH6_EUSCIB2TX1);

/*为主缓冲区设置*/
MAP_DMA_setChannelControl (DMA_CH6_EUSCIB2TX1 | UDMA_PRI_SELECT、UDMA_SIZE 8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1);
/*为备用*/设置缓冲区
MAP_DMA_setChannelControl (DMA_CH6_EUSCIB2TX1 | UDMA_ALT_SELECT、UDMA_SIZE 8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1);

//清除该通道的高优先级位。
// dma_Control->PRIOCLR = 1 << 6; //无效

/*为 DMA 通道分配中断*/
MAP_DMA_assignInterrupt (DMA_INT0、DMA_CHANNEL);  //分配给通用 DMA0

/*为 DMA 通道启用中断*/
// NVIC->ISER[1]= 1 <<(DMA_INT0_IRQn-32)& 31);
MAP_Interrupt_enableInterrupt (DMA_INT0);

//设置6字节长度的传输

///--------------------------------

MAP_DMA_setChannelTransfer (UDMA_PRI_SELECT | DMA_CH6_EUSCIB2TX1 、UDMA_MODE_BASIC、&TestArray[0]、

                               (void*) map_spi_getTransmitBufferAddressForDMA (EUSCI_B2_base)、6);

/*启用 DMA 通道*/  
map_dma_enableChannel (dma_channel_6);

/*现在 DMA 已启动并已设置,从而启用通道。 EUSCI
*硬件应接管并传输/接收所有字节*/

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

    您好!

      DMA 上的通道6和7不支持 eUSCIB2上的 SPI 实现。  在通道6和7中找到的 eUSCIB2参考适用于支持的多个 I2C 从地址(SLAU356e 的第24.3.10节、

     )。

    (摘自数据表)

     您将需要使用 DMA 通道4和5,如以下代码示例所示:

     在这里可以找到有关多个 DMA 触发器的类似讨论、如下所示:

    此致、

    Chris

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

     尊敬的 Chris:

    感谢您的澄清、手册中对 discussion...it 的引用并不明确。

    唯一的问题是通道4、5已经被 UART 使用了... 它以1Mbit 的速率运行。 我无法切换到 SPI0、因为硬件已设置、所以除非没有其他选项、否则我需要通过 SPI ISR 管理传输。   

    此致、

    Shai。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Shai,
    您可能已经研究过这个问题、但是您是否能够利用端口映射并分别移动到 UCA0或 UCA1和 DMA 通道0、1或2、3? 我特别想到的是引脚3.4-3.7。

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

    您好 Chris。

    我想过它、但它不能唯一起作用的方法是、如果我在 SPI2和 SPI0引脚(P3.4-7和 P1.4-7)之间切换、我不确定我是否完全理解 PMAP 寄存器机制... 如果有一种方法来切换引脚,它将解决问题...有什么想法吗?

    此致、

    Shai。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Shai,
    引脚1.4至1.7不能进行端口映射。 这些是使用 USCB0的主要函数进行修复的、我解释了 SPI0的含义。 除了 USCB0-2之外、还有 USCA0-2、因此在 P3.4至 P3.7上、除了 USCB2是默认值外、您还可以映射 USCA0、USCA1、USCA2。 如果您在 msp432p401.h 中查看、您将找到 SIMO、SOMI、CLK 等的各种设置

    遗憾的是、USCA3在端口映射中不可用。 这样、您就可以按照最初的建议使用 DMA 通道6和7。 如果您可以使用 DMA 通道0和1、它们分别连接到 eUSCI_A0_TX 和 RX 的触发器、那么您可以按照如下方式对 USCA0CLK、USCA0SIMO、USC0SOMI 进行端口映射:

    /*端口映射器配置寄存器*/
    const uint8_t port_mapping []=

    //端口 P3:
    PM_NONE、PM_NONE、PM_NONE、PM_NONE、PM_NONE、 PMAP_UCA0CLK、PMAP_UCA0SIMO、
    PMAP_UCA0SOMI
    };

    /*重映射*/
    MAP_PMAP_configurePorts ((const uint8_t *) port_mapping、PMAP_P3MAP、3、
    PMAP_disable_reconfiguration);

    MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P3、
    GPIO_PIN5+GPIO_PIN6+GPIO_PIN7、GPIO_PRIMARY_MODULE_FUNCTION);

    dev.ti.com/.../

    我注意到您正在将 driverLib 用于某些 API、建议您还将用于 SPI:

    dev.ti.com/.../

    /* SPI 主配置参数*/
    const eUSCI_SPI_MasterConfig spiMasterConfig =

    EUSCI_A_SPI_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源
    3000000、 // SMCLK = DCO = 3MHz
    50万、 // SPICLK = 500kHz
    EUSCI_A_SPI_MSB_FIRST、 // MSB 优先
    EUSCI_A_SPI_PHASE_DATA_Changed_ONFIRST_captured_on_next、//相位
    EUSCI_A_SPI_CLOCKPOLARITY_INACT_HIGH、//高极性
    EUSCI_A_SPI_3引脚 // 3线 SPI 模式
    };

    /*在3线主控模式下配置 SPI */
    SPI_initMaster (EUSCI_A0_BASE、&spiMasterConfig);

    /*启用 SPI 模块*/
    SPI_enableModule (USCI_A0_BASE);

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

    感谢大家提出的好建议、至少让我更熟悉 MSP 的选项。
    我试图重新排列引脚的功能、但由于硬件已经设置并连接到其他电路板、我无法轻松切换引脚功能、第二件事是我们使用全部3个 UART 和64QFN 封装、 这使我无法选择将 SPI 映射到通道 A、I2C 网络连接到 P6.6-7引脚。 我无法更改引脚功能、但只能在 SPI 之间切换。 当我说硬件已经设置时,这就是我的意思…
    如果无法在 SPI0和 SPI2之间切换。 我们将需要使用旧的 ISR 方法、我想知道我们是否可以使它变得非常短、以便它可以在48MHz 时钟下保持6-8MHz (每字节大约50个周期)...由于我们是这里的主器件、因此时钟的速率和连续性可能会有一定的灵活性。
    我仍然尝试查看我们是否可以在硬件上使用跳线。

    此致、
    Shai。