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.

[参考译文] MSP432E401Y:读取数据时将 SSI 用作 SPI 错误

Guru**** 2526700 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1269288/msp432e401y-ssi-used-as-spi-error-when-reading-data

器件型号:MSP432E401Y

您好!  

我们将 SS2用作 SPI、并尝试从外部闪存配置、写入和读取数据。 一切都运行正常、但有时我们从闪存芯片读取了 MISO 上的错误数据。 例如、如果我们预期01 02 03 04 05 06、则可以是所有数据都是00、也可以是一些随机数。

我们曾尝试切换到 SS3、但同样的问题仍然存在。 我们已经验证时钟信号是正确的、并且 MOSI 上的数据是正确的、但是闪存芯片没有响应我们的偶尔要求。 是否闪存芯片与 CPU 不兼容? 我们使用另一个系列的闪存 SST26VF064B。

提前感谢您!  

此致、

格尔加纳

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

    您好!

     我不熟悉此第三方器件  SST26VF064B。 如果您降低 SPICLK 频率、会得到不同的结果吗? 您可以在另一个电路板上重复同样的问题吗?  读取数据表、最大读取频率为40MHz。 我不确定您为 SS2配置的 SPICLK 频率是多少。 请检查您是否满足 SST26VF064B 的所有计时要求,如极性、相位和波特率以及交流特性,如数据设置和保持时间。 如果您完全确定从主器件发送到从器件的命令/数据正确、而从器件没有返回正确的数据、请联系 SST26VF064B 供应商以获取支持。 如果您认为这是 MCU 级问题、请使用其他信息更新此主题。  

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

    我们使用了1 MB 的速度、并降低到了40万 bps、但结果仍然相同。  
    至于极性和相位、我们使用模式0、这是闪存支持的模式之一。 在使用模式3时、我们得到错误的数据。

    我们保留设置时间、我们有1ms 的延迟。

    我们在另一个电路板上进行了测试、结果类似。  

    我们将闪存芯片连接到 LaunchPad 开发板、并使用示波器在 SS2的 CPU 引脚上进行测量。 有趣的是、如果我们在 CLK 引脚上具有不同的电容、则数据将变得错误。 示波器上的探头是10次、然后是15 pF、如果我们改为1次、则电容为71 pF。 在后者中、我们从 MISO 获取了错误的数据。 它的值很小、但仍然会影响通信。  
    你注意到了吗?  

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

    您好!

     您能展示 CLK、MOSI 和 MISO 示波器捕获吗? 是 MISO 信号、符合数据表中指定的 GPIO Vil 和 VIH 以及 SSI 特性。  

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

    我在60MHz 使用了这种组合,没有惊喜。 (I 使用的高速读取(0x0B)。)

    您如何进行芯片选择(FSS)? 使用 FSSHLDFRM 时、几乎要求 MODE=3 (特别是 SPH=CPHA=1)。

    另外、您是否在写入后等待 TPP (1.5ms)?

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




    您好!

    我将附加示波器中的捕获、其中显示了2个字节-一条 CPU 命令和一个来自闪存的字节。 这与我们期望从闪存  传输的数据字节相同:一旦字节为 BF 并且一段时间晚于00、闪存芯片将发送的字节、同时 CPU 将发送相同的数据、命令9F、然后是虚拟字节 AA。  

    第一张图片显示了来自 MISO 的数据正确时的 CLK (红色)、MISO (蓝色)和 MOSI (数字)行。 一个时钟周期之间的时间为2.5us 和 MISO 之间的时间大约为3V。 MISO 通道上有1V 的触发器、因此可以看到 MISO 何时上升。 在第一个时钟相位前、引脚 NCE 已经为低电平、在时钟上升前280us、NCE 变为低电平。  
    在第二张图片中、通信显示来自 MISO 的错误数据、我们有一个时钟、MOSI 线路似乎正常。 但我们看不到 MISO 线路、因此 CPU 读取为00。  

    /格尔加纳

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

    我将使用 TI 库并使用 GPIOPinConfigure (GPIO_PD2_SSI2FSS)来配置 FSS 引脚的替代函数。 在通过 MOSI 发送数据之前、该引脚被设置为低电平。  

    你说  FSSHLDFRM 是什么意思? 我们曾尝试用模式3配置 SSI、但得到的数据不正确。  
    我们使用轮询状态寄存器中的 BUSY 位而不是等待 TPP。 因此、如果未设置 BUSY 位、我们将继续。


    有趣的是、我们读取了正确的数据、但有时数据错误、可能是00、FF 或一些随机数。 这是一个敏感的东西、有时会变得不同。 我们曾考虑微处理器对于 SSI 的行为是否不同、但在勘误表中未找到。

    /格尔加纳

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

    大家好、Gergana:

     就生成 SPICLK 和 MOSI 而言、这两个屏幕截图在我看来是相同的。 这两个示例都显示 CPU 发送0x9F、后跟虚拟0xAA。 在阅读 SST26VF064B 数据表时、这是读取 JDEC 器件 ID 的命令序列、是否正确?  MISO 线路具有适当的电压、以满足 MCU 侧的 VIH 和 VIL 要求。 我认为这个问题与电气时序无关、但要确保您应该使用示波器而不是逻辑分析仪来进行交流时序分析。  如您所示、第二个屏幕截图显示 MISO 为零。 我不知道闪存器件有什么问题。 据我所知、 我 看波形没有发现 MCU 方面的任何问题。 您可以在其他电路板上重复同样的问题吗? 您是否正在使用#hold? 我将建议您查看闪存的其余输入、并确保它们上没有噪声。  另外、请联系闪存供应商。 我希望他们也能提供一些照明。  

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

    感谢您的答复。 我们已在其他电路板上进行了测试、发现了同样的问题。 和消费类电路板上的休眠模块。
    没错、这张屏幕截图是关于读取 JEDEC ID 的。 在本例中、数据为00、但对于示例、有时数据可以是7E 4C 87、而不是 BF 26 43。  


    我们使用#hold、并且每次将 NCE 设置为低电平并向闪存芯片发送命令或数据之前、它都会设置为高电平。  
    我们将联系闪存制造商。  

    我们尝试的另一项操作是将模拟示波器通道置于 MOSI 和 CLK 上、并将 CLK 的示波器探头更改为 x1。 MOSI 上的数据是正确的、探针上的电容不会干扰数据。 但如果我们将探针放在 MISO 和 CLK 上并将 探针从10次更改为1次(x10到 x1)、这意味着我们还更改了 CLK 引脚上的负载、CPU 读取的数据错误、或者闪存发送了错误的数据。

    /格尔加纳

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

    TRM 表23-2指出(Freescale 格式) FSS 在"连续"传输期间生效。 根据章节剩余部分中"连续"的用法、我得出结论:"直到 FIFO 空"。 这就意味着、如果软件允许 FIFO 在事务处理的中间清空、则该事务将被终止(FSS 被取消置位)、并且您编写的下一个操作会启动一个新事务(在中间)。

    我最初使用的是 FSSHLDFRM。 之后、当我向总线添加另一个器件时、我切换到显式 GPIO。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有时可以是7E 4C 87,而不是 BF 26 43。  [/报价]

    您能否在收到错误数据而不是全零数据时显示示波器屏幕截图。 我无法解释为什么会接收到零。 也许、闪存器件未正确接收到0x9F 命令、因此在没有有效命令的情况下发回所有零。 当您接收到 7E 4C 87而不是 BF 26 43时、似乎主器件缺少第一个位。 这将与时序有一些关系。 显示了示波器、我希望它能揭示更多细节。  

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

    您好!

    这是范围屏幕截图。  
    通道 A 是 MISO、通道 B 是时钟、D0是 NCE、在我们接收数据之前和之后它都处于低电平。 您是对的、数据缺少第一个字节。 是否可能是 CLK 引脚上的噪声干扰了它、我将探头设置为乘以1、其中电容为71 pF、而大于探头设置为乘以10。  

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

    此处将 MOSI 线路(D3)添加到图片中、以发送命令0x9F 并发送虚拟字节。  

    MISO 线为低电平、我可以注意到在命令的最后一个时钟周期结束时有一点向上移动、但它继续为低电平。  

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

    我在示波器上有更高的时间分辨率,并应放大 MISO。

    更接近的图片、其中 MISO 尝试在最后一个时钟周期(在 CPU 发送命令9F 后)上升、但再次变为低电平、上升至1.4V。

    在这里、我们丢失了第一个位、并读取了错误的 JEDEC nr。 不过、这个引脚是为 CPU 输入的、因为 CPU 中的某个引脚可能导致这个问题。  

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

    您好!

     您处于 MODE0状态、对吗? 这意味着 MISO 数据在 SSICLK 的下降沿被采样。 最大 VIL 为0.35* VDD、等于1.15V。 如果 MISO 为1.4V、则主机可能不会将其采样为有效的零。 我已经浏览了勘误表文档、没有找到任何相关勘误表可以解释这一点。

     您在使用 SSI 时是否正在使用任何其他 MCU 外设? 您是否可以尝试禁用除 SSI2之外的所有其他外设操作以访问闪存? 我想知道其他引脚是否对 MISO 引脚产生影响。  

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

    您好!  

    我们现在处于模式0。 我尝试了禁用其他外设、例如禁用通过 I2C 和其他模块的通信。 它没有帮助。 我们在 SPI 或 SSI 上没有任何其他东西。  
    我们注意到的一个有趣现象是、当不采用时钟周期来引导 MCU 的 CLK 引脚时、引脚在字节之间具有高阻抗。 为了不消耗电流、我们一开始就将其设置为输入、然后使用 TI 库将其配置为 SSI CLK、即引脚 GPIO_PA2_SSI0CLK。 这是否会破坏通信? 是否应该所有其他时间都将其设为输出低电平?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们从一开始就将其设置为输入,以避免消耗电流,然后使用 TI 库将其配置为 SSI CLK,而是引脚 GPIO_PA2_SSI0CLK。 这是否会破坏通信? 是否应该所有其他时间都将其设为输出低电平?  [/报价]

    您好!

     您是否通过任何机会更改了驱动器? 或者您刚刚调用了常用 API GPIOPinConfigure ()和 GPIOPinTypeSSI ()?   GPIOPinTypeSSI() 具有以下引脚配置。 您能否展示有关如何配置引脚的代码片段?


    GPIOPinTypeSSI (uint32_t ui32Port、uint8_t ui8Pins)
    {
    //
    //检查参数。
    //
    assert (_GPIOBaseValid (ui32Port));

    //
    //使引脚成为外设控制。
    //
    GPIODIRModeSet (ui32Port、ui8Pins、GPIO_DIR_MODE_HW);

    //
    //设置用于标准推挽操作的焊盘。
    //
    GPIOPadConfigSet (ui32Port、ui8Pins、GPIO_strength_2mA、GPIO_PIN_TYPE_STD);

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

    我们不会更改股票 API。 我们按原样使用它们。

    我们使用 ssi.h、pin_map.h 中的定义以及驱动程序库中的其他文件。 我们为 CPU 16MHz 设置频率。 SPI 的速度为1Mbps。

    以下是我们使用的配置顺序:

    SysCtlPeripheralEnable (SYSCTL_Periph_SSI2);  
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);

    GPIOPinTypeSSI (GPIO_PORTD_BASE、(GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_3));
    GPIOPinConfigure (GPIO_PD3_SSI2CLK);
    GPIOPinConfigure (GPIO_PD1_SSI2XDAT0);//针对 MOSI 的引脚
    GPIOPinConfigure (GPIO_PD0_SSI2XDAT1);//针对 MISO 的引脚

    SSIDisable (SSI2_base);
    SSIConfigSetExpClk (SSI2_BASE、_16_MHz、SSI_FRF_MOTO_MODE_0、SSI_MODE_MASTER、SSI_1_MBBS_SPEED、  8uL);

    SSIAdvModeSet (SSI2_base、SSI_ADV_MODE_LEGATE);


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

    您好!

     我没有看到您的配置有任何问题。 问题在于 MISO 引脚上更具电气性、而不是引脚配置。 我有点犹豫、建议添加一个外部下拉电阻器是否会在 MISO 引脚上产生影响、但您可以尝试一下。   

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

    我曾使用代码的内部下拉电阻、但它没有改变我们从 MISO 而不是数据中得到00的情况。  

    我想知道 MCU 和 SSI 的行为是否会因批次而异。  
    对于具有相同 MCU 标记且具有相同闪存且在另一个 MCU 上显示错误的几个电路板、我们未发现任何问题。  
    我可以读取两个批次的 MCU 芯片上的标记是不同的。  

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

    我对您的设置有疑问、因为您说您具有相同的组合。 如何设置 CLK 引脚、是否有一个连接到 GND 的电阻器连接到该引脚?  

    我们注意到、当 CPU 不为字节计时时、CLK 引脚悬空、因此具有高阻抗、这对于时钟引脚而言是奇怪的。

    我们使用 TI 驱动程序功能配置了 CLK 引脚、并将其设置为 SSI2的时钟。 但当我们没有通信时、我们不知道引脚的状态是什么。 即使我们一开始将其设置为输出低电平、SSI 的配置也将接管并更改设置。  

    /格尔加纳

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我尝试使用内部下拉代码,但它没有改变我们从 MISO 得到00而不是数据。  [/报价]

    您好!

     我建议 MISO 上的外部下拉电阻、而不是内部下拉电阻。  

     根据您的波形、当 CLK 引脚没有计时数据时、我没有看到它悬空。

    当你调用  GPIOPinTypeSSI 时、该管脚的控制(例如方向控制)被从 GPIO 模块传递到 SSI 模块。  


    GPIOPinTypeSSI (uint32_t ui32Port、uint8_t ui8Pins)
    {
    //
    //检查参数。
    //
    assert (_GPIOBaseValid (ui32Port));

    //
    //使引脚成为外设控制。
    //
    GPIODIRModeSet (ui32Port、ui8Pins、 GPIO_DIR_MODE_HW );

    //
    //设置用于标准推挽操作的焊盘。
    //
    GPIOPadConfigSet (ui32Port、ui8Pins、GPIO_strength_2mA、GPIO_PIN_TYPE_STD);

    我想知道 MCU 和 SSI 的行为是否会因批次而异。  [/报价]

    这当然是可能的、因为在制造过程中、每个芯片和晶圆之间可能存在一些差异。 但我无法解释为什么这个特定的芯片会以这种方式表现出来。 我在过去没有看到过这样的报道。 由于您还有其他几个电路板未显示该问题、因此我建议您进行 ABA 交换测试。 这是为了确保问题与 MCU 无关。   导致该问题的可能是各种因素的组合(例如焊接、引线电容或 SST26VF064B、甚至是 MCU 本身)。  

     A-B-A  交换方法是一种简单的交叉检查测试、可以确认发现的问题不是系统性问题。

    • A-B-A  交换方法
      (1)拆除可疑部件( A )。
      (2)更换可疑部件( A )、具有已知良好的组件( B )并检查原电路板现在是否工作正常。
      (3)安装可疑部件( A )连接到已知正常的板,然后查看是否在正常板上出现相同的故障。

    步骤3很重要、因为它可以帮助我们排除任何可能问题是由系统问题或良好电路板上的多个轻微不良元件相互作用引起的。

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

    您好!

    我们甚至尝试了使用外部下拉电阻器、但没有效果。  

    我们看到时钟线悬空。 红色线、通道 B 是 CLK。



    您知道在没有数据传输时 SSI 模块是如何设置 CLK 引脚的吗?  

    谢谢你的建议。 我们将进行考虑。

    此致、

    格尔加纳

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

    我们看到时钟线悬空。 红色线、通道 B 是 CLK。

    [/报价]

    您好!

     您能在良好的电路板上展示 CLK 引脚的波形吗?  

    您是否有机会执行 ABA 交换测试?

    您是否知道在没有数据传输时 SSI 模块是如何设置 CLK 引脚的?  
    [/报价]

    SPO=0时、在不发送时 CLK 应该为低电平。  

    17.3.7.2飞思卡尔 SPI 帧格式
    Freescale SPI 接口是一个4线接口、其中 SSInFss 信号用作从机
    选择。 如果在传统模式下操作并使用 Freescale SPI 帧格式、则 INACTIVE 状态
    SSInClk 信号的相位均可通过 SSICR0寄存器的 SPO 和 SPH 位进行编程
    控制寄存器。 如果在高级/双路/四路 SSI 模式下运行、则 SP0和 SPH 位必须为
    编程为0。


    SPO 时钟极性位
    当 SPO 时钟极性控制位清零时、它在 SSInClk 上产生稳定的低电平值
    引脚。 如果 SPO 位置位、则在没有数据时在 SSInClk 管脚上产生稳定的高电平值
    数据包类型。


    SPH 相位控制位
    SPH 相位控制位用来选择捕获数据的时钟边沿并允许边沿改变状态。
    该位的状态对发送的第一个位影响最大、即允许或不允许
    第一个数据捕获边沿前的时钟转换。 当 SPH 相位控制位清零时、
    在第一个时钟边沿转换时捕获。 如果 SPH 位被置位、数据将在第二个
    时钟边沿转换。

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

    您好!  

    我们在 CLK 线路上观察到同样的情况。 我们不确定这是否可能导致不良行为。  

    我们进行了 ABA 交换测试。 无法在 Launchpad 上工作的闪存芯片在应用板上工作。 但是、我们在应用电路板中使用 尚未使用的全新组件替换有问题的组件、同样的问题也会出现。  

    昨晚、我们在读取闪存时得到了一个错误的数据、即使是从我们以前没有看到过这个问题的电路板上读取的数据(它有另一批 CPU)。  
    这很好、至少当我们有相同的行为时。 但问题可能基于单个电路板的容差而出现。 我们继续尝试不同的方法来解决问题。 这个问题对我们来说是一个新问题、因为我们以前没有使用 SSI 模块、尤其是用作 SPI 的 SSI。  

    我们最新做的更改:

    我们注意到、如果我们用于 SPI 的引脚配置为高驱动  


    GPIOD->DR8R |=(GPIO_PIN_0 | GPIO_PIN_1|GPIO_PIN_2 | GPIO_PIN_3);  

    我们可以在读取的数据出错之前在 CLK 引脚上加载更多电容。  

    我们在 CLK 线路上还有一个47千欧的外部电阻器、CLK 更稳定。

    此致、

    格尔加纳

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

    我们在 CLK 线路上观察到同样的情况。 我们不确定这是否可能导致不良行为。  

    [/报价]

    您好!

     我尝试运行一个简单的1MHz SPI 示例。  我真的不会看到 SPICLK 在您的内部波动、尤其是在不进行传输时。  

     -您能否检查一下您的 MCU 和闪存是否有稳定的电源?

     - MCU 和闪存是否在同一个地方?

     - MCU 和闪存之间的布线是否远?

     -对于实验,你可以移除板上的闪存吗? 您是否会看到 SPICLK 的波动与连接闪存时相同?  

     -当您使用 LaunchPad 读取闪存时,您是否可以重复相同的问题(例如读取0或读取错误的值)?

    我们进行了 ABA 交换测试。 无法在 Launchpad 上工作的闪存芯片在应用板上工作。 但是、我们在应用电路板中使用 尚未使用的全新组件替换有问题的组件、同样的问题也会出现。  [/报价]

    我建议对 MCU 进行 ABA 交换测试。 您似乎需要更换闪存而不是 MCU。 是这样吗?

    GPIOD->DR8R |=(GPIO_PIN_0 | GPIO_PIN_1|GPIO_PIN_2 | GPIO_PIN_3);  
    [/报价]

    我也建议更改驱动强度。 您可以在 GPIOPinTypeSSI() API 中更改驱动强度。 默认为2mA。 最简单的方法是将 gpio.c 文件复制到您的项目目录、将修改复制到更高的驱动强度并重新编译项目。 修改后的代码将在 drivelib 库上生效。 或者、您可以更改代码并重新构建 driverlib 库。  


    GPIOPinTypeSSI (uint32_t ui32Port、uint8_t ui8Pins)
    {
    //
    //检查参数。
    //
    assert (_GPIOBaseValid (ui32Port));

    //
    //使引脚成为外设控制。
    //
    GPIODIRModeSet (ui32Port、ui8Pins、GPIO_DIR_MODE_HW );

    //
    //设置用于标准推挽操作的焊盘。
    //
    GPIOPadConfigSet (ui32Port、ui8Pins、GPIO_strength_2mA、GPIO_PIN_TYPE_STD);

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

    -我们有稳定的电源到 MCU 和闪存,我们检查了。 使用 SPI 时功率没有尖峰。  
    - MCU 和闪存具有相同的 GND
    -闪存和 MCU 之间的布线非常短
    -我们没有尝试移除闪存,看看时钟线是否波动,我们可以测试。  

    -从 Launchpad 读取时出现同样的问题。 读取正确的数据并读取0。  

    我们已将闪存从 Launchpad 移到不再影响该问题的电路板上、这是相同的行为。 即使我们用手指触摸 MCU 引脚、也可能会出现错误。  

    您可以尝试通过探头在 CLK 线路上引入一些额外电容、还是从外部引入一些电容、以查看从闪存读取的数据是否受到影响?  

    /格尔加纳

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

    大家好、 Gergana:

     我可以在下周试用 LaunchPad、在主设备和从设备之间执行一些基本的 SPI 操作。 由于我没有您的设置(连接定制电路板上的外部闪存)、我想我是否会重现相同的设置。

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

    感谢您提供宝贵意见。  
    IWe 尝试了 SPI 的不同设置。 如果我们将 SPI 配置的驱动强度更改为10 mA,即在  GPIOPinTypeSSI ()中,我们将获得更稳定的时钟并且不会出现读取0或错误数据值的错误。 您是否建议将10 mA 用于 SPI? 由于电压需要如此高、它是否会指出电子产品中的其他一些问题?  

    在同一函数中、我们还更改为 GPIO_PIN_TYPE_STD_WPD、以代替标准类型。 根据我们的理解、如果我们有模式0、则会将时钟信号编程为稳定状态为低电平。 根据《技术参考手册》中的注释、必须使用上拉电阻器对时钟信号进行编程、其中稳态高电平:  


      ''上拉可被用来避免 QSSI 引脚上出现不必要的切换、这可将
       从器件置于错误状态。 此外、如果 SSIClk 信号设置为稳定状态高电平
       通过 SSICR0寄存器中的 SPO 位、软件还必须配置 GPIO 端口
       与 SSInClk 信号相对应的引脚、在 GPIO 上拉选择(GPIOPUR)中用作上拉电阻
       寄存器。'  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们尝试了不同的 SPI 设置。 如果我们将 SPI 配置的驱动强度更改为10 mA,即在  GPIOPinTypeSSI ()中,我们将获得更稳定的时钟并且不会出现读取0或错误数据值的错误。 您是否建议将10 mA 用于 SPI? 由于电压需要如此高、它是否会指出电子产品中的其他一些问题?  [/报价]

    大家好、Gergana:

    虽然我很高兴看到更高的驱动强度以某种方式解决了您的问题、但我不明白  如果电容负载不大、为什么需要高至10mA。 您之前说过、MCU 和闪存之间的距离最小。  据我所知、GPIOPinTypeSSI 中默认使用的2mA 缓冲区强度对于大多数客户都是有益的。 您是我记得的第一个需要10mA 的客户。 我真的没有看到改变10mA 的问题、但它会增加您的电流消耗。  

     我建议您在探测示波器上的信号时、使用10倍的探头来降低总体容性负载。 您之前说过、测量结果是15pF、以较慢的上升/下降时间处于2mA 缓冲器的范围内。 使用10mA 驱动15pF 负载将在上升/下降时产生更尖锐的边沿。  

    在同一函数中、我们还更改为 GPIO_PIN_TYPE_STD_WPD、以代替标准类型。 根据我们的理解、如果我们有模式0、则会将时钟信号编程为稳定状态为低电平。 根据《技术参考手册》中的注释、必须使用上拉电阻器对时钟信号进行编程、其中稳态高电平:  


      ''上拉可被用来避免 QSSI 引脚上出现不必要的切换、这可将
       从器件置于错误状态。 此外、如果 SSIClk 信号设置为稳定状态高电平
       通过 SSICR0寄存器中的 SPO 位、软件还必须配置 GPIO 端口
       与 SSInClk 信号相对应的引脚、在 GPIO 上拉选择(GPIOPUR)中用作上拉电阻
       寄存器。'  

    [/报价]

    正确、 如果 SSICR0寄存器中的 SPO 设置为高电平、建议使用 GPIO_PIN_TYPE_STD_WPD。 但是、运行在模式0下时、实际并不需要 GPIO_PIN_TYPE_STD_WPD。  

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

    谢谢你。 我们在此处检查了示例代码:

    https://dev.ti.com/tirex/explore/node?node=A__AK4Mx17LHgMZFoRl0XdckQ__com.ti.SIMPLELINK_MSP432E4_SDK__J4.hfJy__LATEST

    其中驱动强度也高于默认的2 mA、 GPIOB->DR8R |=(GPIO_PIN_5 | GPIO_PIN_4);  

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

    大家好、Gergana:

     感谢您对 MSP432E 器件串行闪存操作的驱动强度进行交叉检查。  我想在串行闪存示例开发过程中、他们一定已经注意到默认驱动强度的影响、并手动更改强度以解决您所面临的可能类似问题。 这对我来说是个新鲜事。 我会将此帖子作为书签以供将来参考。 再次感谢。  

    /* No driverlib API 以便仅将 GPIO 高驱动设置,因此我们使用
    裸机*/
    GPIOB->DR8R |=(GPIO_PIN_5 | GPIO_PIN_4);
    GPIOD->DR8R |=(GPIO_PIN_5 | GPIO_PIN_4);
    GPIOE->DR8R |=(GPIO_PIN_5 | GPIO_PIN_4);

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

    感谢您对我们的案例的支持。  

    此致、

    格尔加纳