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.

[参考译文] LAUNCHXL-F28379D:MAX1978的间歇性 SPI 通信错误

Guru**** 2524460 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1302783/launchxl-f28379d-intermittent-spi-communication-errors-with-max1978

器件型号:LAUNCHXL-F28379D

您好、TI 社区:

我在与 MAX1978器件的 SPI 通信过程中遇到间歇性错误。 通信在几个周期内正常运行、发送和接收预期数据(如0x88波形中的初始正确值所示)。 但是、在传输过程中有时会出现错误、导致无法正确接收或发送预期数据(波形中标有"错误")。

误差是零星的、不遵循明确的模式。 波形表明问题可能出在 SPI 配置或信号完整性、但我仔细检查了设置、它们符合器件的要求。 根据数据表规格配置时钟频率、SPI 模式和位顺序、并验证了硬件连接。

你们中是否有人遇到过类似问题、或者您是否对潜在原因有任何见解? 对于故障排除或要检查的特定领域的任何建议、我们将不胜感激。

感谢您的帮助。

此致、  

戴内罗

e2e.ti.com/.../spi_5F00_ex3_5F00_external_5F00_loopback_5F00_fifo_5F00_interrupts.zipFull 代码已问世

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

    尊敬的 Nero:

    如果您最初接收到正确的数据、但然后它似乎损坏了、那么可能会出现您怀疑的一些时间或其他配置。 您的 SPICLK 频率和 LSPCLK 是多少?

    另请确保 SPI 设置符合 MAX1978的任何特定计时要求以及 MAX1978预期的时钟阶段。 F2837xD SPI 时序规格可在 数据表中找到。 

    我假设该图像的蓝色通道是芯片选择 SPISTE 线-它在不正确的数据传输期间是否总是出现尖峰高? 或者、是否甚至在没有拉高电平的传输中显示为不正确? 芯片选择应该在整个传输过程中保持低电平。

    此致、

    艾里森

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

    尊敬的 Allison Nguyen:

    感谢您的建议。 实际上、我已经花费了大量的时间来检查时钟极性和相位、正如我之前的帖子(e2e.ti.com/.../launchxl-f28379d-max1978-not-responding-to-spi-dac-transmissions-from-c2000-mcu)中所讨论的那样。 尽管我将该主题标记为"已解决"、但问题并未完全解决。

    关于 CS 信号、我同意它在传输过程中应该为低电平、但我不清楚如何在整个数据传输过程中保持低电平。 在 spi_ex3_external_loopack_fifo_interrupts 示例中、_interrupt void spibTxFIFOISR (void)函数最初没有 device_delay_US (40);Delay 设置。 如果没有这个延迟、CS 信号甚至都无法注册、这一点我在上一篇文章中已经提到过。

    您能否指导我如何确保 CS 信号在整个 SPI 事务期间保持低电平? 如果对此有任何见解,将不胜感激。

    此致、
    N

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

    e2e.ti.com/.../launchxl-f28379d-max1978-not-responding-to-spi-dac-transmissions-from-c2000-mcu

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

    尊敬的 Allison Nguyen:

    我正在努力实现 SPI 通信的特定时序图、并且我需要匹配两个参考时序图。 我一直在使用 spi_ex3_external_loopback_fifo_interrupts 示例作为我的实现的基础。 鉴于我的时序要求、您认为此示例是合适的起点吗、还是会推荐更适合修改的其他示例? 对于如何选择最合适的示例以实现这些时间目标、您的指导将会非常有帮助。

    此致、
    N

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

    void initSPIBMaster(void)
    {
        //
        // Must put SPI into reset before configuring it
        //
        SPI_disableModule(SPIB_BASE);
    
        //
        // SPI configuration. Use a 500kHz SPICLK and 16-bit word size.
        //
        SPI_setConfig(SPIB_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0,
                      SPI_MODE_MASTER, 500000, 8);
        SPI_disableLoopback(SPIB_BASE);
        SPI_setEmulationMode(SPIB_BASE, SPI_EMULATION_FREE_RUN);
    //    SPI_setEmulationMode(SPIB_BASE, SPI_EMULATION_STOP_MIDWAY);
    
        //
        // FIFO and interrupt configuration
        //
        SPI_enableFIFO(SPIB_BASE);
        SPI_clearInterruptStatus(SPIB_BASE, SPI_INT_TXFF);
        SPI_setFIFOInterruptLevel(SPIB_BASE, SPI_FIFO_TX2, SPI_FIFO_RX2);
        SPI_enableInterrupt(SPIB_BASE, SPI_INT_TXFF);
    
        //
        // Configuration complete. Enable the module.
        //
        SPI_enableModule(SPIB_BASE);
    }

    __interrupt void spibTxFIFOISR (void)
    {
    //计算DAC的固定值,例如0.3的比例
    uint16_t fixedData =(uint16_t)((0.2 / 1.5)* 65535);// 16位 DAC 值
    fixedData = fixedData << 2;//左对齐数据以使其变为16位

    //将固定值放入sData数组中,准备发送
    sData[0]= fixedData;

    //检查发送FIFO是否为空并准备好发送新数据
    while ((SPI_getTxFIFOStatus (SPIB_BASE)和 SPI_FIFO_TXEMPTY)!= SPI_FIFO_TXEMPTY);

    //发送数据
    SPI_writeDataNonBlocking (SPIB_BASE、sData[0]);
    // device_delay_us (40);

    //清除发送FIFO中断标志
    SPI_clearInterruptStatus (SPIB_BASE、SPI_INT_TXFF);
    INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group6);
    device_delay_us (100);




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

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

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

    尊敬的 Nero:

    感谢您提供的所有信息。 您能具体说明一下 MAX1978或 MAX5144是否存在问题吗? Thread 显示1978年、但您划了1544圈、因此我希望确保不熟悉这些器件、仅使用 F2837xD。 您还能解释一下您的系统的背景吗? 即您要尝试从哪个器件发送/接收哪些数据、以及数据的位数。

    以下是我根据您提供的内容提出的一些建议:

    1. 您需要确保的一件事是 F2837xD SPI 时钟模式设置为与 MAX 器件的预期相匹配。 从您连接的 MAX 器件的示意图中看、似乎 MAX 器件需要一个空闲低电平的 SPI 时钟、并在 SPICLK 的上升沿采样/锁存数据。 因此、我建议使用 SPI 模式1 (极性= 0、相位= 1)。
    2. 为了确保芯片选择在整个通信期间保持低电平、可以使用 GPIO 作为 SPISTE 芯片选择引脚并手动控制它(在通信之前写入"0"将其设置为低电平、然后写入"1"将其在通信后设置回高电平。
      1. 请注意:一些外设/从器件的工作方式中、芯片选择引脚应通过多字节传输持续为低电平。 如果是这种情况、并且根据您实际尝试执行的操作、您有几种选择: (1)使用 GPIO 作为芯片选择 F2837xD 上的 SPISTE、以便可以在通信前手动将其设置为低电平、然后在通信完成后手动将其设置为高电平。 或者(2) 您可以先连续发送所需的字节数(从 F2837xD 发送到 MAX)(以从 MAX 接收相同数量的字节数)、完成之后、您才会从接收缓冲区读取 F2837xD 接收到的所有字节。  
    3. 从您链接的另一个线程来看、MAX 似乎仅在8位模式下运行。 F2837xD 针对16位进行了优化、因此在这里需要注意不要丢失数据-这也取决于您要尝试执行的操作/您要发送/接收的数据类型。 一般情况下、如果从 F2837xD 发送8位数据、应在写入 TXBUF 之前向左移不少于8位。 接收到的8位数据 b F2837xD 应正确对齐、因此无需移位。
    4. 请确保满足 MAX 预期的时序要求。 您可以使用 F2837xD  数据表第8.12.5.1节"SPI 电气数据和时序"来计算现有要求、并将其与最大值要求进行比较、以查看是否满足要求。

    此致、

    艾里森

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

    尊敬的 Allison:

    感谢您的答复。 首先说明一下、MAX5144是我们 MAX1978评估板上用于 SPI 通信的一个组件。 它用作通过 F2837xD MCU 进行通信的 DAC。 我们的目标是精确配置 SPI 接口、以便将数据正确传输到该 DAC。

    此致!
    N




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

    尊敬的 Allison:

    经过进一步分析、使用 SPI 模式1 (极性= 0、PHASE = 1)会导致错误的 DAC 值、这可能是由于我的实现方案与 MAX5144通信协议之间存在不一致。 之所以使用(极性= 0、相位= 0)、是因为我们的高级硬件工程师通过专用 SPI 通信测试仪使用这些设置成功与 DAC 进行了通信。

    对于 CS 控制、我预计 spi_ex3_external_loopback_fifo_interrupts 示例会自动进行 CS 切换。 使用标准化模板时、手动控制 CS 似乎与直觉不符。 我对手动 SPI 寄存器配置的体验并不是很好、所以我以新手的身份对实际应用进行导航。

    鉴于时序要求和 SPI 数据处理的复杂性、我预计需要一周的迭代调试来与 MAX5144的规范保持一致。 在我根据器件的精确操作节奏校准代码时、即时解决方案可能无法实现。

    此致、
    N

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

    尊敬的 Nero:

    感谢您的 更新。 正确的是、该示例自动进行芯片选择切换。 但我仍然建议手动切换(在传输之前将其写入低电平、在通信完成后将其写入高电平)、以查看 您看到的行为/问题是否发生了变化。 实施过程不应过于复杂、因此如果您能够对其进行测试、这将帮助我们知道该问题与芯片选择无关-您可以通过将 SPISTE 引脚配置为 GPIO 输出引脚、 这样、您可以通过 SW 完全控制 SPISTE 引脚、并可以控制 SPISTE 引脚何时被拉至低电平或高电平。

    如果您能尝试一下、请告诉我。 其他一些后续问题:您在应用程序中尝试发送/接收多少字节的数据、以及在哪些字节的数据出错时是否存在任何模式?

    此致、

    艾里森

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

    尊敬的 Allison:

    我对这项工作非常陌生、并且仍然熟悉许多设置。 除了这一挑战、我们的高级软件工程师目前正在休假、因此我主要是独自解决这些问题。 我一直致力于手动控制用于 SPI 通信的片选(CS)信号。 根据您的建议、我已经将最初设置为 SPISTEB 的 GPIO27重新配置为通用输出引脚、以手动进行 CS 控制。 我已经修改了此spibTxFIFOISR功能、以便将 GPIO27在传输前设置为低电平、在传输后设置为高电平。 下面是我使用的代码片段:

    // Reconfigure GPIO27 as general-purpose output
    GPIO_setPinConfig(GPIO_27_GPIO27);
    GPIO_setDirectionMode(27, GPIO_DIR_MODE_OUT);
    
    __interrupt void spibTxFIFOISR(void) {
        GPIO_writePin(27, 0); // Set CS low before transmission
        // Data transmission code...
        GPIO_writePin(27, 1); // Set CS high after transmission
    }
    

    感谢您的持续支持。 如有任何进一步的指导,将不胜感激。

    此致!  

    n

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

    尊敬的 Nero:

    是的、您对 GPIO 芯片选择的实现方法的理解是正确的(只是在 FIFO 模式下、要注意过早地将芯片选择写入高电平、这样在写入芯片选择高电平之前只能检查 TX FIFO 是否为空)。 如果您在此过程中发现不同行为、或者您的进度有其他更新、敬请告知。

    此致、

    艾里森

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

    尊敬的 Allison:

    在配置 CS 的手动切换后、信号输出变得不正确。 我附上了一个示波器屏幕截图、其中显示了电流信号模式。 如您所见、CS 线路行为发生了显著变化、似乎会干扰数据传输。 我遵循了准则、将 GPIO27在传输前设置为低电平、在传输后设置为高电平、但这会导致意外结果。 您能否建议此流程中的潜在错误步骤、或建议可能导致此新问题的原因?

    完整源代码  

    此致、  

    n

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

    还是错了哈哈

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

    尊敬的 Nero:

    只是想澄清一下、这些图像中的绿色信号是 MOSI 线路、而不是 MISO?

    如果您手动控制芯片选择引脚、则在使用 SPI FIFO 模式时需要检查一些重要事项:

    1.  在写入发送 FIFO 来传输您的数据之前、您应该始终检查发送 FIFO 是否有空间  
    2. 确保在传输之前向 GPIO 写入"0"、  
    3. 确保您 在将"1"写入 GPIO 以使其为高电平之前、检查所有数据是否已成功/完全传输 再次入住

    项目1. 和2. 上面看起来不错、但看起来不像你在做第3项。 添加一个邮箱。 请记住、向 TXBUF 写入数据的速度快于实际从发送 FIFO 向另一个器件发送数据的速度。 您需要添加一行代码、在向 GPIO27写入"1"之前、检查 TXFFST 位(发送 FIFO 状态位)是否为0 (表示发送 FIFO 为空、并且数据实际上已发送)。 这可以是一个简单的 while 循环(例如、SpiaRegs.SPIFFTX.RXFFST!= 0)=;)

    此致、

    艾里森