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.

[参考译文] AM3358:SPI TX 数据损坏

Guru**** 2668435 points

Other Parts Discussed in Thread: AM3358, TPS3809

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1588325/am3358-spi-tx-data-corruption

部件号: AM3358
主题中讨论的其他器件: TPS3809

你好。

我正在为工业传感器编写一个 Linux 内核驱动程序、我使用的是 BeagleBone Black (AM3358BZCZ100) 开发板。 处理器是 SPI 主器件。

我观察到、在某些情况下、写入 OMAP2_MCSPI_TX0 寄存器的字节在 MOSI 线路上输出不同。 据我所知、cs 置为有效后的第一个字节有时会受到影响 — 应为 1 的位有时为 0。 它可以每次在几个数据包上复制一次。

我修改了 drivers/spi/spi-OMAP2-mcspi.c 文件、以打印写入 TX 寄存器的所有字节和一些额外变量:

@@–722、6 +724、8 @@ OMAP2_mcspi_txrx_Pio(结构 SPI_DEVICE *SPI、结构 SPI_TRANSFER *xfer)
    RX_reg      = BASE + OMAP2_MCSPI_RX0;
    chstat_reg   = BASE + OMAP2_MCSPI_CHSTAT0;
 
+   pr_info(“Pio %d 0x%x 0x%p 0x%p 0x%p\n“、xfer->len、l、tx_reg、rx_reg、 chstat_reg);
+
    if (c <(word_len>>3))
        返回 0;
 
@@–735、6 +739、7 @@ OMAP2_mcspi_txrx_Pio(结构 SPI_DEVICE *SPI、结构 SPI_TRANSFER *xfer)
        执行{
            C -= 1;
            if (TX!= NULL){
+                PR_INFO(“%02x\n",“,*tx、*tx);
                if (mcspi_wait_for_reg_bit (chstat_reg、
                        OMAP2_MCSPI_CHSTAT_TXS)< 0){
                    DEV_err(&spi->dev、“TX 超时\n“);

 

并且 dmesg 输出看起来正确(这使得内核错误的可能性不那么普遍)。

使用 Logic Pro 信号分析仪观察 MOSI 信号时、会有一个 0x70、而不是发送到 TX 寄存器的 0xf0。 如果我们看一下在第一个位在时钟沿输出 MOSI 线路时的模拟信号捕获、则信号为 500mV、因此第一个位读取为 LO 而不是 HI — 请参阅屏幕截图。 我看到、每当该位错误时、模拟电压始终在 500mV 左右。

在 AM335x 勘误表中的 SPI 快速搜索显示无结果。 在两个不同的开发板上进行了测试、两个开发板相隔几年、结果相同。

我的驱动程序代码和设备树文件可以在这里找到: https://codeberg.org/subDIMENSION/lkm_sandbox/src /branch/main/honeywell_abp2030pa

您是否收到过有关此问题的任何反馈?

另外需要注意的是、Linux 内核中的 OMAP2-mcspi 驱动程序忽略了芯片选择相关的延迟、有时在 cs 被断言违反传感器时序图后生成时钟信号 0.6us。 稍后我将发送一个补丁。

稍后编辑:

我还尝试过什么,但没有工作

 -将 SCLK 从 800kHz 降至 100kHz

 -在 CS 下降边沿和 SCLK 开始之间插入较大的延迟

 -在 mcspi 驱动程序中禁用了 mcspi 自动挂起/自动恢复

 -在 MISO 线上增加了一个 100K 下拉电阻,希望安静下来的空闲信号,但它仍然在 1V 左右

谢谢你。

彼得

 

屏幕截图:

 

SPI_mangling.png

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

    如果我完全拆下包含传感器的分线板、只需将分析仪连接到 BBB 的 SPI 引脚、则 MOSI 线路上的数据是正确的。 这看起来像是 MOSI 信号强度过弱问题。  

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

    您好、Petre、让我将此问题发送给正确的硬件专家。 请允许他有一两天的时间回到你身边。

    谢谢您、

    Paula

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

     我找到了问题的“修复“。

    我的目的是测量 UC 向 MOSI 引脚上传感器板提供/接收的电流、因此我在 UC 和电路板之间串联了一个 100 Ω 电阻器、因此我测量两侧的电压。 这样一来、只要这个电阻器完全解决了问题、MOSI 线路上的所有数据现在无论时钟频率如何都有效。 移除电阻器而不更改任何其他内容肯定确认了“修复“。

    两个器件之间有~15cm 的引线、优质薄型多股铜线、devboard 上的短 SCLK/MOSI/MISO 布线、撒在 4 层板的内层 2 层上、所有层上都有铜接地覆铜。 SCLK 使用介于 100KHz 至 800KHz 之间的慢速频率。 信号间的串扰可以忽略不计。 如果硬件专家告诉我、要求该电阻器与 MOSI 线路串联是什么错误行为、我会很高兴? 为什么 MISO/SCLK 上不需要该功能?

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

    尊敬的 Petre Rodan:

    很高兴您找到了一种解决方案来消除 MOSI 信号线中 0.5V 的 1us 下降。 有关 SPI 情况下的串联电阻、请参阅  AM335x 原理图审阅检查清单的系统问题一节

    Q1:您可以尝试移除 100R 串联电阻并在上添加一个 33R 串联电阻 SPI_SCLK 尽可能靠近 SoC(您的 SPI 控制器)并进行测试?

    有关使用串联电阻器修复 SPI 的更多信息、您可能需要参阅以下 E2E 主题: 修复 SPI 物理接口问题的建议

    虽然您的 McSPI 以相对较低的速度运行、但您也可以在这份更通用的高速布局指南中找到一些有用的提示:  高速接口布局指南 

    内核代码向我显示您使用的是 Muxmode=0 中可用的 AM335x MCSPI0 引脚。  

    如果是、则这些引脚基于 LVCMOS 缓冲器。

    Q2:您在 MOSI 线路上的 100R 电阻上测量的最大压降是多少?   

      AM335x 数据表的直流电气特性一节介绍了保证 SoC LVCMOS 缓冲 McSPI0 引脚的 VoL 最大值和 VOH 最小值的(建议)输出电流 (6mA)

    请确保 连接到 AM3358 SPI0_D0 (MOSI) 的所选传感器 MOSI 输入消耗的电流不超过 6mA。 如果超过此电流、则应考虑添加适当的缓冲器 IC 来为传感器板 MOSI 线路提供电流。

    问题 4 SPI0_D0 线路上是否连接了任何其他外设?

    问题 5. 您是否能够 使用示波器观察 VDDSHV6 = 3.3V SPI0 I/O 电源电压。 SPI 通信期间、VDDSHV6 是否存在任何干扰?  

    我希望这些检查点能有所帮助!

    谢谢

    此致、

    Anastas Yordanov

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

    您好!

    非常感谢您的详细见解,我真的很感谢您花时间回答。

    Q1:您可以尝试移除 100R 串联电阻并在上添加一个 33R 串联电阻 SPI_SCLK 尽可能靠近 SoC(您的 SPI 控制器)并测试?

    从 MOSI 中删除了 100R、并尝试了 SPI0_SCLK 线路上 BBB P9 连接器处的 33R 和 100R 串联电阻。 这不仅解决了 MOSI TX 损坏问题,还增加了一个额外的问题 — 传感器出于某种原因停止提供转换数据-我必须从传感器计时输出 7 个字节。 第一个字节包含一个状态字节(这个是 0x40,正确)、然后是 6 个表示当前压力和温度的字节 — 这些字节均为零。 一旦我从 SCLK 上移除此串联电阻并向 MOSI 添加一个 100R、则一切都很完美。

    我还试图用 MOSI 线路上的 33R 替换 100R、损坏仍然存在。

    我想问题的根源是 MOSI 的快速压摆率、而不是 SCLK 线路的实际频率、因此我还尝试向器件树绑定中添加 SLEWCTRL_SLOW 以绑定到所有涉及的引脚、但没有任何正结果。

    Q2:您在 MOSI 线路上的 100R 电阻器上测量的最大压降是多少?  [/报价]

    经证明,该压降微不足道 — 远低于 50mV。 我需要 使用用户校准系数对这两个输入进行线性回归、以了解精确的电压差、但很低、因为可能不值得付出努力。  

    q4. SPI0_D0 线路上是否连接了任何其他外设?

    SPI0_D0 也称为 MISO 线路连接到 4 个不同的 SPI 传感器。 所有器件在其 CS 引脚上都有一个永久的 10K 上拉电阻器、当然在任何给定的时间只有其中一个会被置位。

    我尝试在 MISO 上添加 100K 下拉电阻,但在没有交换数据时无法降低线路噪声 — 这里的电压从 1.2V 衰减到 0.6 请参阅下面的屏幕截图中的 A5 通道。 我看到 mcspi 控制器驱动程序在每次交换几秒钟后调用 pinctrl_pm_select_idle_state (),所以我想它是“好“。

    Q5. 您是否能够 使用示波器观察 VDDSHV6 = 3.3V SPI0 I/O 电源电压。 SPI 通信期间、VDDSHV6 是否存在任何干扰?  [/报价]

    非常有趣的问题。 我移除了所有串联电阻以复制 TX 数据损坏。

    我在 U3 的引脚 5 处采样了 VDD3V3A(可追溯到 VDDSHV6 *)(请参阅 github.com/.../BBB_SCH.pdf 中的 SN74LVC1G06DCKR)   、并且似乎在发生损坏时会出现微小干扰。 这是唯一干扰该电源轨的地方。 请参阅随附的。

    同时、为我的电路板供电的 VDD3V3B 与传感器的 Vdd 在同一测试期间没有干扰。

    请允许我详细了解这种干扰。 您是将我的 100R 系列电阻器视为 MOSI 解决方案还是有更好的方案?

    在某些情况下、我用于开发传感器驱动程序的电路板位于此处: https://codeberg.org/subDIMENSION/lkm_sandbox/src /branch/main/hardware/honeywell_abp_hsc_mpr_devboard

    https://photos.app.goo.gl/tYFUn2bYrcj6g8ke6

    它总共包含 8 个传感器 IC - 4 个 SPI 和 4 个 I2C。 SCLK、MISO、MOSI 永久连接到基于 SPI 的传感器、而 SDA、SCL、CS 和转换结束中断 GPIO 则根据跳线进行控制。

    您是否也建议对 SCL/SDA 使用串联电阻? 我在使用 BBB 的 i2c 方面没有问题、但我希望该电路板与大多数微控制器/处理器兼容。

    非常感谢、

    彼得

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

    您好、Petre、

    感谢您的意见!

    从 MOSI 中删除了 100R、并尝试了 SPI0_SCLK 线路上 BBB P9 连接器处的 33R 和 100R 串联电阻

    对我来说、MOSI 线路上的 100R 串联电阻是一种意想不到的解决方案。 本指南建议仅在 SPI_SCLK 线路上放置一个 33R 串联电阻器。 我希望 BBB 版本 C3 P9 连接器尽可能靠近处理器。 但这显然不适用于您的情况。 我还没有听说过在 SCLK、MISO、MOSI 和 CS 线路上应用 100R 串联电阻。 您可能是对的、这与传感器 SPI 输入的较低压摆率有某种关系。 您放置在 MOSI 上的 100R 应以某种方式与 SPI SCLK 线路的寄生电容+传感器输入端的电容相结合、从而构成 LP 滤波器。 您是否注意到在放置 100R 电阻器后、在示波器中对 MOSI 上升时间有任何可见影响。  

    传感器数据表中是否有任何迹象表明此反应(保持在 500-600mV 的时间显著)是由压摆率时序违例引起的?  

    您是否为 VDDSH6 和传感器设备使用相同的电源?

    请给我一些时间来分析和回答您的剩余问题。

    感谢您的耐心

    此致、

    Anastas

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

    尊敬的 Petre:

    我通过提供的链接更深入地了解了 SPI 传感器相关规格。  

    在 ABP2 压力传感器数据表中、我看到了以下启动时序要求。 这在 AM3358 SPI 软件中有保证吗?

    您是否可以进行更精确的测量,只留下一个传感器 — 最好是 ABP2 没有 100R 串联电阻和下拉电 压率的 100K 下拉(电压差除以上升时间从 10%到 90%的 VDDSHV6 = 3.3V ) :

    - MISO 输出压摆率。 在相应的 SPI0_D1 SoC 输入引脚上测量。

    - SPI0_CLK 输出压摆率。 在传感器电路板的相应 CLK 输入端测量。  

    - SPI0_D0 (MOSI) 输出压摆率。 在传感器板的相应 MOSI 输入端测量。

    我找不到任何有关 ABP2、ABP、MRP 或 HSC 传感器的 CLK 和 MOSI 输入端允许的最大压摆率的数据。  

    您是否还找到了有关 MOSI 和 CLK 输入的输入电容的信息?

    您如何得出传感器板 MOSI 和 CLK 输入最大压摆率远低于相应 AM3358 McSPI0 控制器输出处的压摆率?

    更重要的是要了解传感器板 MOSI 和 CLK 输入端允许的最小压摆率、以及在传感器板 MISO 输出端获得的实际压摆率。

    AM3358 SPI0_MISO 输入上的预期最低压摆率大致计算如下:90%*VDDSHV6 - 10%*VDDSHV6 / t_rise (8ns) = 0.33V/ns。 请注意、不建议以更低的压摆率在 AM3358 SPI0_MISO 引脚上施加信号、使其压摆率低于最小 0.33V/ns。  

    请期待后续行动。

    谢谢你

    此致、

    Anastas Yordanov

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

    您好!

    感谢您发送编修。

    您是否为 VDDSH6 和传感器设备使用相同的电源?

    是的。 BBB 由 5V TDK Lambda LS25-5 电源供电。

    传感器板由扩展接头 P9 的引脚 1 + 3 供电。

    该电源轨在数据表中称为 VDD_3V3B、它由 VDDSH6*(也称为 VDD_3V3A)信号在 BBB 上启用的 500mA 稳压器生成。

    我的电路板在所有 IC 附近都有一个超小型 47 μ F 滤波电容器和 100nF 去耦。 在所有测试中、此 3V3 电源轨都是坚如磐石的。

    在 ABP2 压力传感器数据表中、我看到了以下启动时间要求。 这在 AM3358 SPI 软件中是否有保证?

    虽然驱动器确实不会在传感器 IC 上电和第一个请求之间强制施加 2.5ms 延迟、但在我们的特定情况下、该特定延迟会比这一延迟高许多个数量级。 我看到在某些情况下会发生这样的情况:违反了“下降到第一个时钟边沿“最小 2.5uS 要求。 发生这种情况时、我测得了 0.6uS(半时钟周期)。 但传感器在该时间点运行正常。

    我将返回到压摆率测量值。 不幸的是、我的 Fluke ScopeMeter 上的所有无源探头都不会影响测量结果。

    此致、

    彼得

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

    您好!

    在所有测试中移除了 100K 下拉电阻。
    每个位置至少测量 3 次、Fluke ScopeMeter 报告的平均上升时间 (10%–90%)(全 200MHz 带宽、未设置 HF 抑制选项)。 我使用微型接地探头引线进行更精确的测量、但在某些情况下、它会反向:

    在 MOSI 上使用 100R(TX 正常工作):

    扩展连接器上的 MISO、P9 ~5ns (SR、0.53 V/ns)(难以测量,由于接触不理想而产生较大的变化)
    传感器 2.4ns 附近的 MISO (1.1 V/ns)
    传感器附近的 CLK 7.5ns (0.35 V/ns)
    MOSI 靠近传感器-> 18.8ns (0.14 V/ns)<-


    MOSI 上无 100R(TX 故障):

    扩展连接器上的 MISO、P9 ~7ns (SR 、0.38 V/ns)(难以测量,由于接触不理想而产生较大的变化)
    传感器 2.1 ns 附近的 MISO (1.26 V/ns)
    传感器附近的 CLK 7.5ns (0.35 V/ns)
    MOSI 近传感器-> 6.0ns (0.44 V/ns)<-

    请注意、使用串联电阻时、MOSI 信号会大幅变慢。
    我在.dts 文件内的 AM33XX_PADCONF() 定义中设置了和不设置了 SLEWCTRL_SLOW 的情况下重新执行测量、因此测量的压摆率没有差异。

    我知道您告诉我要单独测试 IC、但目前无法进行测试。 我没有备件、我(但)不想通过重复焊接/拆焊而有损坏我唯一工作的备件的风险。 我计划做的是在 MSP430 微控制器上实施驱动器、使用相同的传感器板进行测试、并报告结果和压摆率。

    此致、
    彼得

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

    您好、Petre、

    感谢提供的测量:

    请注意、使用串联电阻时 MOSI 信号会大幅减慢。
    我在.dts 文件内的 AM33XX_PADCONF() 定义中设置了和不设置了 SLEWCTRL_SLOW 的情况下重新执行测量、因此测量的压摆率没有差异。

    可能该问题不是由于 SoC McSPI0 控制器提供的 MOSI 信号压摆率 (V/ns) 更高所致。  

    HYP.1:我怀疑 SPI0_CLK 和 SPI0_CS 之间的 SPI 信号之间可能存在违反传感器预期时间间隔的情况。

     

    [报价 userid=“504214" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1588325/am3358-spi-tx-data-corruption/6126093

    扩展连接器上的 MISO、P9 ~5ns (SR、0.53 V/ns)(难以测量,由于接触不理想而产生较大的变化)
    传感器 2.4ns 附近的 MISO (1.1 V/ns)
    传感器附近的 CLK 7.5ns (0.35 V/ns)
    MOSI 靠近传感器-> 18.8ns (0.14 V/ns)<-


    MOSI 上无 100R(TX 故障):

    扩展连接器上的 MISO、P9 ~7ns (SR 、0.38 V/ns)(难以测量,由于接触不理想而产生较大的变化)
    传感器 2.1 ns 附近的 MISO (1.26 V/ns)
    传感器附近的 CLK 7.5ns (0.35 V/ns)
    MOSI 近传感器-> 6.0ns (0.44 V/ns)<-

    [/报价]

    MISO SR = SoC > 0.33V/ns 适用于 AM335x 0.38V/ns。

    MOSI SR = 0.44 V/ns 与 0.14 V/ns(串联 100R)。 这是一个区别、并不排除第一个 SPI0 MOSI 位损坏可能与更快的输出相关。  

    MOSI SR = 0.44 V/ns、CLK SR = 0.35 V/ns、有关 ABP2 的 MOSI 和 CLK 输入上的预期 SR 可能是什么的提示?   

    移除了 100R 串联电阻:

    您是否可以尝试将 CS 下降沿和第一个时钟上升沿之间的延迟增加到 2.5us 以上、并观察 MOSI。

    您是否可以尝试将 C1 降低到 10 UF 并重试?

    谢谢

    此致、

    Anastas Yordanov

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

    您好!

    感谢您的耐心和宝贵的建议。

    我实现了针对 MSP430 平台的驱动程序、很惊讶、当不使用 MOSI 串联电阻时、问题仍然存在(这次将第二个位强制设置为 LO)。

    您关于减小 C1 的指针准确无误。 在 Honeywell 数据表中、他们为 Vdd 规定了最小上升斜率 10V/ms、我完全错过了这个斜率。

    使用 47 μ F C1 时、我的最终结果只有 5.7V/ms。 完全移除 C1 并从 MSP 器件板为电路板供电最终会达到 25V/ms、在~50%的情况下可以解决该问题。

    因此、这显然不是 AM335 问题。

    再次感谢您、对分心感到抱歉!

    彼得

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

    您好、Petre、

    我很高兴在这里、一些测量有助于您找到问题的根本原因。 我想您应该考虑恢复具有 10uF 值的 C1 滤波电容器、并再次评估复位芯片 U1、TPS3809 的电源压摆率。 您可以减小 C1 电容值、直到获得合理的压摆率值>= 10V/ms。 您还可以在非常靠近 TPS3809 的电源引脚处添加一个与 C1 并联的 100nF 电容器。

    也很抱歉、如果我重复一下、请交叉检查传感器是否满足建议的电源序列。 您可以将探头连接到 CLK、MOSI、CS、VDD_3V3 并检查时序。 然后应用必要的软件延迟校正。

    谢谢

    此致、

    Anastas Yordanov

      

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

    您好:

    我  电路板重新设计了一点、以便在 Vdd 时提供非常快的上升斜率、同时保持 C1 接近。 因为只有 MPR 系列传感器不支持重置信号。

    关于电源序列、我在传感器上电几秒钟后尝试连接所有数字线路、但有时即使这也不能保证无错误的功能。 有时、我需要对一些传感器进行拆焊、然后对它们进行隔离测试。  

    无论是哪种方式、我都会关闭该线程、因为它显然不是 AM335 故障。

    再次感谢!

    彼得