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.

[参考译文] MSP430FR6043:在更高的 SPI 频率上传输数据时出现问题。

Guru**** 2391415 points
Other Parts Discussed in Thread: MSP430FR6043

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/978230/msp430fr6043-problem-with-transmit-data-on-higher-spi-frequency

器件型号:MSP430FR6043

你好!

 

我的环境:

MSP430FR6043
LaunchPad CC1352R1
CCS: 10.1.
MSP SDK: 3.80.10.09
CC SDK: 4.40.04.04

问题:

我打算在 MSP430FR6043上使用具有 DMA 的 SPI 来获得更高的发射频率。 MSP 连接到主器件 CC1352R1。 在我将 SPI 频率设置为1MHz 或更高之前、一切都正常工作、在 MSP (MISO)上传输数据开始被移位/延迟(类似于这样)。 因此、并非所有数据都被传输、我永远不会从 DMA 中获得中断。

示例设置:SPI 设置为2MHz、DMA 发送和接收通道设置为6字节长度。 数据是6字节:0x2、0x0、0x09、0x0、0xF6、 0xFF。 您可以看到、SPI 传输了两次相同的字节。

这是我的 SPI 和 DMA 配置、开始时我设置了所有内容:

EUSCI_A_SPI_initSlaveParam spiParam ={0};
spiparam.msbFirst = EUSCI_A_SPI_MSB_FIRST;
spiparam.clockPhase = EUSCI_A_SPI_PHASE_DATA_COLOCKE_ONFIRST_CHANGE_ON_NEXT;
spiparam.Polarity = EUSCI_A_SPI_SPI_LOCK_POCLPULL.SP_POLY_LOPON_POLIT_UST_SP_USCI_UST_SPICE
;spi_POLIT_POLIT_USCI_SP
EUSCI_A_SPI_initSlave (EUSCI_A0_BASE、&spiParam);
EUSCI_A_SPI_select4引脚功能(EUSCI_A0_BASE、EUSCI_A_SPI_ENABLE_SIGNAL for _4WIRE_SLAVE);

DMA_initParam dmaRxParam ={
通道选择= dma_channel_0、
.transfermodeSelect = dma_transfer_single、
triggerSourceSelect = DMA_TRIGGERSOURCE_14、
transferSize = SPI_FRAME_SIZE、// 6.
.transferUnitSelect = DMA_SIZE SRCBYTE_DSTBYTE、
triggerTypeSelect = dma_trigger_RISINGEDGE
};

dma_initParam dmaTxParam ={
通道选择= dma_channel_1、
.transfermodeSelect = dma_transfer_single、
triggerSourceSelect = DMA_TRIGGERSOURCE_15、
transferSize = SPI_FRAME_SIZE、// 6.
.transferUnitSelect = DMA_SIZE SRCBYTE_DSTBYTE、
triggerTypeSelect = dma_trigger_RISINGEDGE
};

dma_init (&dmaRxParam);
dma_init (&dmaTxParam); 

在每次传输之前、我都会重新配置设置、传输大小和缓冲区可在程序生命周期内更改:

dma_setTransferSize (dma_channel_0、6);//例如6字节
dma_setTransferSize (dma_channel_1、6);//例如6字节

dma_setSrcAddress (dma_channel_0、eUSCI_A_spi_getReceiveBufferAddress (eUSCI_A0_BASE)、dma_direction、dma_setrdcAddress (dma_data_rt_r32)、unchanged dma_tdma_tdma_r&tdma_r&tdma_r
dma_direction 增量);

dma_setSrcAddress (dma_channel_1、(uint32_t)&txFram.data、dma_direction 增量);
dma_setDstAddress (dma_channel_1、 EUSCI_A_SPI_getTransmitBufferAddress (EUSCI_A0_BASE)、DMA_DIRECTION 不变);

EUSCI_A_SPI_ENABLE (EUSCI_A0_BASE);

DMA_clearInterrupt (DMA_CHANGE_0);
DMA_enableInterrupt (DMA_CHANGE_0);
dma_enableTransfers (dma_channel_0);
dma_enableTransfers (dma_channel_1); 

在每次传输完成后、我会禁用 DMA 和 SPI:

dma_disableInterrupt (dma_channel_0);
dma_disableTransfers (dma_channel_0);
dma_disableTransfers (dma_channel_1);
eUSCI_A_spi_disable (eUSCI_A0_BASE); 

我是否错过或配置错误? 直到我不将频率设置为1MHz 或更高、所有东西看起来都很有魅力、但我希望至少使用4MHz。

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

    MCLK 设置为多快?

    我在跟踪中看到的是、移位是按字节进行的(按位将是不同的症状)、表示溢出/欠运转。 这表明 DMA 无法跟上。

    DMA 的传输只需要2个 MCLK、但时钟同步时、周期中也会出现"死区时间"[参考用户指南(SLAU367P)第11.2.7节]。 如果 FR6043处于 LPM 状态、DCO 启动时可能会有进一步的延迟。 然后、您必须将两个方向乘以2。

    每个交易都是双向的吗? 我怀疑、如果您在一个方向上关闭 DMA (让未使用的一侧刚好过载/欠载)、您将获得一些东西。

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

    您好、Bruce、

    我正在与 Robert 一起进行同一个项目。

    [引用用户="Bruce McKenney47378"] MCLK 设置为多快?
    MCLK 设置为8MHz。

    //将 DCO 频率设置为默认值16MHz
    CS_setDCOFreq (CS_DCORSEL_1、CS_DCOFSEL_4);
    //将 DIVIDER 设置为2
    CS_initClockSignal (CS_MCLK、CS_DCOCLK_SELECT、CS_Clock_divider); 

    [引用用户="Bruce McKenney47378"]这表明 DMA 无法跟上。
    这正是我的观点、但整个图片并未叠加。

    让我们进行计数。
    SPI CLK:2MHz
    SPI 字:8位
    SPI 从器件有两个移位寄存器和两个锁存缓冲器(UCxRXBUF、UCxTXBUF)。 根据 TRM:
    "
    设定的位数被接收时、UCxSIMO 上的数据在 UCxCLK 的反向边沿上被移入接收移位寄存器并被移动到 UCxRXBUF。 当数据从 RX 移位寄存器移动到 UCxRXBUF 时、UCRXIFG 中断标志被置位、表示数据已被接收。
    "

    因此、一个针对 DMA 的中断被以250kHz 频率触发(2MHz/8位)。
    据此、DMA 具有(1/250kHz) 4uS 来收集数据。

    这比 DMA 所需的时间要长得多。
    根据 TRM "表11-3. 最大单次传输 DMA 周期"、DMA 需要4个 MCLK 周期(在访问模式下)。
    假设 DMA 需要8个 MCLK 周期(双向)、我们仍然比所需的周期多4倍。

    我们是否错过了什么?
    这有什么意义?

    只读表11-3一个答案就会出现、我们以某种方式进入 LPM3 (或 LPM4)、我们需要额外的5us 才能启动 DCOCLK。 遗憾的是、我们认为我们不会在 SPI 传输期间进入 LPM。
    您是否有任何想法、如何对此进行调查?

    此致
    Adam

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

    我没有您的设备、因此我尝试使用 FR6989作为从器件来构建您的测试用例、我认为它具有与 FR6043相同的 eUSCI 和 DMA。 我使用 FR5994作为主器件。 在我的测试用例中、DMA 能够保持 SCK=8MHz。

    我遇到的一个差异是 TXIFG。 调用 EUSCI_A_SPI_ENABLE 将 TXIFG 设置为高电平、以便在启用通道(稍后)时没有触发 DMA 的边沿;症状是我的 Tx 侧从未发送任何内容。 我切换到 DMA_TRIGGER_HIGH (DMALEVEL=1)、这提供了正确的运行。 我不知道为什么你没有遇到这种情况、建议是在你发布的内容之外有一些相关的代码。

    我不知道我们在做什么不同。 如果这是 FR6043的特定功能、我将不会提供太多帮助。

    这是8MHz 时 STE 和 MISO (0x81-0x86)的轨迹。 我不得不在(主)中插入3个 SCK 间隙、以使 STE 摆动。 即使在没有适当间隙的情况下也能正常工作。

    这是我使用的从器件端程序:

    /cfs-file/__key/communityserver-discussions-components-files/166/Galon_2D00_s_2D00_6989.c

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

    您好、Bruce、

    您的信息非常有用。
    您投入了大量精力来重现我们的案例。 我们对此表示赞赏。 谢谢你。

    周一、我们将遵循您的建议并随时向您通报最新情况。

    此致
    Adam

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


    你好 Bruce。

    最后、我们让它发挥作用。 我必须修复两个问题:如您所说、将 DMA TX 触发器更改为 DMA_TRIGGER_HIGH (我不知道为什么它在具有较低频率的 DMA_TRIGG_RISINGEDGE 上工作)、并使器件保持在 LPM0以进行事务处理。 在这两次更改之后、带有 DMA 的 SPI 在8MHz 频率上工作正常。


    我仍然想知道两件事:

    在我的代码中、我首先初始化 SPI、然后启用 DMA 传输。 这样做是可以的、还是我应该反之亦然? 哪种方法更好?

    2、现在 MISO 引脚上有一个奇怪的东西、就像 SPI 比我设置的传输多一个字节。 我仔细检查了参数、一切看起来都很好、所以我不知道会导致它的原因。

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

    1) 1)我认为您也可以这样做、您只需跟踪 TXIFG 的工作情况即可。 您确实需要确保 TXBUF 已预加载、因为一旦第一个 SCK 出现、DMA 就没有时间运行。 使用 DMALEVEL=1时会有一些危险[参考 UG (SLAU367P)第11.2.3.2节]、但对于您正在执行的操作、我认为您不会遇到任何危险。

    2) 2) SPI (从器件)单元将发送与主器件(SCK)请求相同的字节、而不管 DMA 加载到 TXBUF 中的字节数量是多少。 我希望这会重复最后一个字节、而这不是我在这里看到的。 您是否仍在使用 DMA_TRANSFER_SINGLE? (我没有尝试过这种情况。)

    [编辑:我忘了问:您的代码是否直接写入 TXBUF 的任何位置? (EUSCI_A_SPI_transmitData)]

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

    2)

    我想 Robert 误解了 MISO 上的最后一个边沿。
    为了消除可能的泄漏电流、在完成 SPI 事务后、我们下拉主器件的输入(内部下拉电阻器)。

    我们看到的可能是以下序列:

    • 最后一个字节
    • MISO 变为高阻态或高电平(从器件)。 我不确定这是如何在从器件侧定义的。
    • 主器件下拉 MISO (SPI 事务已完成)

    明天、我们将对其进行仔细检查、并告知您是否是问题所在。

    BTW。 我们在原始波形(e2e.ti.com/.../spi-msp-dma.png)上看到的类似行为、但 CLK 要低得多。  

    此致

    Adam

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

    1) 1)感谢您参阅手册、这对您的理解非常有帮助。

    2) 2)是的、我仍在使用 DMA_TRANSFER_SINGLE。

    我做了更多的测试、发现了 MOSI 状态和最后一个字节之间的一些相关行为。 当最后一个字节的第一个位以高电平位(例如0x80)开始时、事务后有这个高 MOSI 状态:

    但是、当最后一个字节以低位(0x00)开始时、没有添加任何内容:

    此外、当不使用 SPI 时、我将 MISO 引脚设置为从主器件侧上拉的输入、但这种情况在我们在这里看到的情况超过80us 后发生、因此它将在 MSP 侧发生。

    我忘了问:您的代码是直接写入 TXBUF 的吗? (EUSCI_A_SPI_transmitData)

    我尝试在事务之前手动设置第一个字节(只写入 TXBUF)、但这没有帮助。 现在我没有类似的东西、只有 DMA 写入 SPI 寄存器。

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

    MISO 应该在 STE 无效后变为高阻态[Ref UG Sec 31.3.4.1]如果它在最终级别浮动一段时间、我不会感到太惊讶。

    您是否怀疑 STE 无效后它实际上被驱动?  

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

    您好、Bruce、

    [引用用户="Bruce McKenney47378"]您是否怀疑 STE 无效后它实际上是被驱动的?
    我们进行了更多实验、以确保在发送最后一个字节后由谁驱动线路。 我们连接了额外的33k 电阻器、该电阻器会永久下拉 MISO。
    即使连接了该电阻器、我们也会在发送最后一个字节后看到该额外的高电平。

    顺序如下(见附图):

    • 发送的最后一个字节
    • CS 已发布
    • MISO 线路在高电平状态下保持大约1.4us。 该线路由 MSP (从器件)驱动为高电平、这证明了使用该附加下拉电阻器进行的实验。
    • 80US 之后、主器件将 MISO 引脚配置更改为默认状态。 在我们的情况下、主器件连接一个内部下拉电阻器并将其保持为输入(以避免泄漏电流)。


    我们解决这个神秘问题并不重要、但我们很高兴知道为什么会这样做。
    有什么想法吗?

    此致
    Adam

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

    我假设这是 TSTE、DIS、额定电压为50ns (最大值)、这与1400ns 不同。 [参考数据表(SLASEF5A)第8.13.8.6节;看起来、它们重新编号了文档修订版 A 的所有章节]。 我不知道该怎么建议(没有人给我提供了 Verilog 的钥匙)。

    几张明暗的照片:

    1) 1)是否有可能使用"X"器件(引脚标记为"XMS430"而不是"MSP430")? LaunchPad 通常附带"X"器件、但我不知道 EVM。 "X"器件有时会在角落中出现怪异的情况、这些情况在它们成为"M"器件时就已解决。

    2) 2)您是否在 MISO 引脚上使用了 REN 电阻器? 例如、我知道、I2C 模式下的 eUSCI 不会禁用 REN 电阻器、在 SPI 模式下也可能是如此。

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

    我忘记了说这个"高电平"状态的长度不等于 SPI 字(字节)的长度。
    它在这个特定的图片中看起来类似、并且仅在这个 SCLK 上。
    如果我们降低频率、SPI 字将比这个意外的"高电平"状态更长。

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

    1) 1)我们将定制板用于 MSP430。 该芯片是在原始 TI store 购买的、未标记为过时或正在开发中。

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

    [引用用户="Bruce McKenney47378]2)您是否在 MISO 引脚上使用了 REN 电阻器?

    我不这么认为、但我明天会仔细检查。
    我们会仔细测量电流、并在器件处于非活动状态期间保持在1.5uA 以下。 我不会认为以意外的方式连接上拉或下拉是可能的。

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

    我在使用的设置上尝试了两个测试用例(FR5994主设备、FR6989从设备)。 光标相差1.4us。

    (1)一个4.7K 外部下拉电阻器  

    (b)内部下拉(~20k)

    20k 更慢并不奇怪、但我看不到任何真实的证据表明从器件在 STE 之后行驶。

    当然、FR6989是一种不同的(同级)芯片、但您的分析仪是否可能过于宽松?

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

    你好 Bruce。

    您完全正确、我们实际上看到的是 RC 电路的放电。

    确认:
    当我们连接一个较小的外部下拉电阻器4.7K 时、"高"状态变得更短(300ns)。

    当我们连接示波器时、我们可以看到 RC 放电曲线。

    感谢您的帮助以及您为帮助解决我们的问题而付出的努力。 下次再见。
    下面、我用外部下拉电阻器的不同值将示波器的波形围起来、以供任何需要确认的读取器使用。

    而无需额外的下拉电阻器、33k 电阻器和4.7k 电阻器。


    此致
    Adam