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.

[参考译文] MSP430FR5994:随机 SPI/DMA 数据损坏

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1206891/msp430fr5994-random-spi-dma-data-corruption

器件型号:MSP430FR5994

您好!

我使用 DMA 从 SPI 闪存读取数据。

随机地、读取缓冲区中有一个字节已损坏。  损坏字节始终等于0xFC。

随着待传输数目的增加、这种情况发生的频率也会越来越高。  如果读取的数据是20字节、那么永远不会发生这种情况。

起初、我虽然指针很乱、但这不能是因为代码会等待 DMA 传输完成、原因是:

while ((SPI_TX_DMACTL & DMAIFG)= 0){};
while ((SPI_RX_DMACTL & DMAIFG)= 0){};
SPI_TX_DMACTL = SPI_DMA_STOP;
SPI_RX_DMACTL = SPI_DMA_STOP;
while ((SPI_UCBxSTATW & UCBUSY)!= 0){};  

当传输完成时、损坏的字节会立即出现。

使用示波器探测 MSP 引脚上的 SPI 总线时不会发现损坏的字节。  SPI 总线上任何时候都不传输0xFC。  从不。  从闪存读取的数据完全符合其要求。

实际上、DMA 或 SPI 在内部行为错误。

SPI 时钟为8MHz。

问题出现在我们的所有器件上、因此它与损坏的器件无关。

绝对不寻常

有什么想法吗?

此致、

弗雷德里克

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

    错误的字节在缓冲区的什么位置出现? 这可能(也可能不)是一种线索。

    在 F2系列中、为了避免溢出、我始终必须将 Rx 通道设置为比 Tx 通道更高的优先级。 我想这里替代的是 DMACTL4:ROUNDROBIN。

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

    对于 SPI、我必须不断提醒自己的一点是仔细检查时钟的相位和极性。 我忘记了它有一段时间了、有一个 OLED 显示屏。 数据表表示、它不关心时钟的空闲状态。 确实如此。 不足以使其不工作、但足以使其不稳定。

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

    错误的字节往往出现在同样的偏移量上(即:对于50个字节的读取、显示为22、37和41)。  不是绝对值、但绝对存在更容易出错的偏移。  我以为这是一个线索,但我不能理解。

    我将介绍超限理论。  系统中可能正在进行其他 DMA 传输...  谢谢提示。

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

    我相信一个错误的相位/极性将导致第一个字节上的问题、并且很多其它字节也将是错误的。

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

    在我看来、0xFC 看起来也有点像一个"位涂片"、可能来自(正如 David 提到的)时钟相冲突或简单的传播延迟。 您的电线使用多长时间? 我看到过在8MHz 下使用12英寸的导线。

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

    如前所述、MCU 引脚处的信号都正常。  它位于具有大约2英寸布线的 PCB 上。  无论将什么字节压入行中、我都会得到0xFC。  我将使用0x0、0x01或0x80等值。  如果有任何一个会变为0xFC、这将是非常明显的示波器。  当读取零时、MISO 是绝对平坦的。  没有任何可以解释为0xFC 的毛刺脉冲。

    时钟信号也 是干净的。

    降低 SPI 时钟速度会改变错误率和错误偏移、但这并不是一种一致的方法。 这是完全不同的。

    交换通道0用于 RX、1用于 TX、ROUNDROBIN、我没有看到任何改善。   

    因此、这与超限理论背道而驰、

    无论如何、在可能同时需要 DMA 的系统中、以16MHz 运行 SPI 的速度对于 MCLK 而言可能太快。  至少、这个 bug 让我们明白了这一点。

    可能某种主要功能是长时间阻止 DMA。  但是 、NMI 被禁用、并且从不设置 DMA 中止标志。  这也不太可能。

    感谢您的帮助。  任何分支攻击都可以提供帮助。

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

    尊敬的 Fred:

    您如何观察0xFC 值、您是否只是在从 SPI 闪存读取完成后检查缓冲区中存储的值?

    在读取 SPI 闪存时、调试器是否正在运行并连接? 您的代码中是否有任何其他同时运行的功能?

    此致、
    Brandon Fisher

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

    我通过调试器和在 UART 上打印观察到0xFC。

    在连接和未连接调试器的情况下都会发生相同的行为。

    我们确实同时进行了很多工作。 由于对"应用"代码进行了2级优化而对驱动程序没有进行优化(因此没有对访问 SPI 和 DMA 寄存器的代码进行优化)、FRAM 的使用率约为95%。

    我尝试了在存储器中移动用于读取/写入 SPI 的所有缓冲器。  这是相同的。  该功能可以最大程度地解决存储器损坏问题。

    CPU 始终处于工作模式。  未使用 LPM。

    感谢大家参与讨论。

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

    我再重复一遍大卫的假说,然后我就停止了。 时钟相位误差不一定总是出现、甚至不一致、因为微小的时序片段和/或位组合可能会隐藏该条件。 有几次(面对无法估量的数据表)、我不得不尝试 CPHA/CPOL 的所有(4倍)组合、以查看症状是否发生变化。 我希望您知道这一点、但无论如何我要提一下:CPHA 和 UCCKPH 极性相反、即 CPHA=0意味着 UCCKPH=1。

    仔细思考一下、溢出(SPI 或 DMA)通常会导致 DMA 停止、因为没有足够的(Rx)字节到达。 这往往会指向 SPI (eUSCI)、但我不知道会是什么。

    我想问一下您要与什么闪存器件通信吗?

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

    我不能想象在采样数百个连续零时、时钟相位会产生任何影响。

    我尝试了所有其他相位和极性设置: 总伤害。  错误的字节会显著增加。  发送到闪存的命令可能从一开始就被误解为垃圾命令。

    闪存为 Winbond W25Q256JVEIQ。

    不过、导致失速的 DMA 溢出是合理的。  

    这给我们留下了 eUSCI 问题或我遇到的最奇怪的代码错误之一。

    也不太可能。

    我的我的...

    此致、

    弗雷德里克

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

    尊敬的 Fred:

    根据您的测试、这似乎不存在明显的原因。 它现在看起来很丑、此时我想尝试从 项目副本中删除其他函数、看看它们中是否有任何函数对观察到的错误产生影响。

    显然、从任何涉及 eUSCI 的其他内容(但 SPI 外设、因为您似乎已经在那里进行了一些调试)开始、DMA 是一个理想的起点。  

    此致、
    Brandon Fisher

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

    我们正赶上时间来(提交),看看这个错误已经有多长时间没有涂油。

    如果我们 只是想去除 SPI 代码以外的所有内容、而且仍然存在错误、我会将 其与您分享。  此时发现问题可能更容易。

    感谢您的支持。

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

    我深入整理了该数据表、由于该数据表声称不关心空闲时钟状态、因此应该有两种时钟/相位组合有效。 相位/极性组合0、0或1、1应该相同。

    关于该器件、我感到惊讶的一点是、它专为速度而打造、这会带来麻烦。

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

    我没有看到你的症状,使用一个非常简单但类似的实验: S/MCLK=16MHz, SPI clock=8MHz, UCA3, DMA 通道4/5 , W25Q128JV( Adafruit 分线板; 3字节地址),导线~6"。 程序只写入一页(256B)、读取另一 页(清理味觉)、读取写入的页、然后比较 Tx 与 Rx 数据并停止。

    什么都不会发生。 我想这是最大的差值。

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

    我们发现了在一个两年前的承诺中引发错误的一个非常单一的行!

    我们开始在 UART ISR 中允许嵌套中断。  注释_enable_interrupt ()调用可解决通过 SPI 读取的所有错误。

    我们为什么开始允许嵌套中断以及我们是否确实需要这一功能正在研究中。

    但为什么 DMA 处理的 SPI 读取会变得一团糟?

    有人对此有解释吗?

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

    尊敬的 Fred:

    一般而言、我们不建议在 MSP430上使用嵌套中断、因为这些中断会很混乱、并且很难调试。

    我怀疑有一种方法可以避免使用嵌套 UART ISR、因此您不必担心递归导致栈溢出或人为扩展第一个 ISR 的执行时间。 我无法准确说明它会导致 SPI/DMA 问题的原因、但 嵌套中断有很多警告。  

    此致、
    Brandon Fisher