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-CC1310:SPI 无法按预期工作

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/887402/launchxl-cc1310-spi-not-working-as-expected

器件型号:LAUNCHXL-CC1310
主题中讨论的其他器件:CC1310

你好。

我尝试通过 CC1310 Launchpad 的 SPI 驱动程序从 Winbond 控制1Gb NAND 闪存型号 w25n01gv (使用 Mikroe 闪存5咔嗒板:www.mikroe.com/flash-5-click)。

在构建所有 I/O API 之前、我刚刚编写了一对基本函数来测试与存储器的通信:读取 JEDEC ID 并读取三个状态寄存器中的一个。

要查找 CC1310 SPI 帧格式的正确设置、我搜索了存储器数据表(www.winbond.com/.../W25N01GV 修订版 O 092619.pdf) 并获取了以下信息:

- 8位 SPI 帧

-/CS 引脚在所有存储器命令期间(在所有 SPI 事务期间)必须为低电平

-输入:存储器在时钟的上升沿从主器件读取位数据

-输出:存储器在时钟的下降沿之后准备位数据、并且可以在时钟的上升沿从主器件读取

-在总线待机期间,内存接受时钟信号,通常为低电平或高电平

在阅读有关 SPI 模式的 CC1310参考手册时、我发现/CS 线路在使用 PHASE-Control=1时仅在整个 SPI 事务期间保持低电平、因此我使用频率为1MHz 的 SPI0开始测试、帧格式设置为 SPI_POL0_PHA1、并在 PIN_Config BoardGpioInitTable[]中定义 CC1310_LAUNCHXL_SPI0_CSn。 不管用。

为了查看发生了什么、我将示波器连接到/CS (红色信号)、CLK (黄色信号)、MISO (品红色信号)和 MOSI (绿色信号)引脚。 这是我在读取状态寄存器时看到的(字节0:命令、字节1:寄存器地址、字节2:返回的寄存器值):



正如您看到的、/CS 引脚在 SPI 帧之间上升、存储器中没有任何内容。 要放弃模式的名称错误、我更改为 SPI_POL0_PHA0、这就是我得到的结果:



除了时钟活动边沿的时钟/2延迟、一切都是一样的。 SPI_POL0_PHA1和 SPI_POL0_PHA0模式之间的/CS 引脚没有差异。 我检查了 SPI_POL1_PHA1和 SPI_POL1_PHA0:空闲时间内的时钟引脚按预期为高电平、但在所有情况下、/CS 线在 SPI 帧之间上升。

为了尝试解决这种情况、我定义了一个 GPIO 引脚来手动控制/CS 线路并使用 SPI_POL0_PHA1进行检查:



现在、我在所有传输期间的/CS 均为低电平、但尚未从存储器输出。

我将测试从读取状态寄存器更改为读取 JEDEC ID (字节0:命令、字节1:虚拟、字节2:返回制造商 ID、字节3-4:返回器件 ID):



与寄存器测试相同:不工作。

然后、我还记得存储器使用上升沿来处理输入和输出位数据、如果我使用外部引脚手动控制 DE /CS 线路、我不需要将 PHA 设置为1 (此外、如果它不能按预期工作)。 因此、我尝试使用 SPI_POL0_PHA0:



最后、我从存储器获得了输出!... 但不正确:我得到的制造商 ID 为0xDC、而不是预期的0xEF。 器件 ID 为0x0000而不是预期的0xAA21、则没有任何内容。

我还在 MISO 线路中看到了大瞬时脉冲。 可能是由于我使用电缆将存储器连接到 CC1310 Launchpad。 考虑到这一点并知道 Launchpad 具有另一个连接到 SPI0的存储器、我再次尝试了 SPI1的所有相同测试。 所有的工作方式与 SPI0的工作方式相同。 SPI0和 SPI1中都存在 POLxPHA1问题。

然后我意识到、如果时钟序列是连续的并且没有在 SPI 帧之间存在间隙、那么我在最后一个测试中获得的0xDC 将是0xEF。

考虑到测试的所有结果、我接下来要问的问题是:

1.为什么在 POLxPHA1模式下、/CS 引脚在每一帧后都变为高电平、而 CC1310的参考手册指出它在所有 SPI 事务期间都将保持低电平? 它可以以何种方式像规范中一样工作?

2.为什么它将/CS (SSIn_FSS)行为与相位控制相关联? 更有趣的是、它与更多器件兼容以分离角色、并且我们可以在 SPI 参数中设置极性和相位、而在另一个新参数中、我们可以在单帧/CS 之间进行选择、例如"SSIn_FSS 连续传输" 还是连续帧/CS? 这将避免需要实现一个专用于控制/CS 的外部 GPIO、并避免与 GPIO 信号相关的滞后。

3.为什么帧之间有这些时钟停止? 难道这不是从交易开始到交易结束的连续脉冲序列吗? 我假设它与 SPI 驱动程序中的/CS 控制行为有关。 当 PHA = 0时、/CS 必须在帧之间变为高电平、因此时钟必须在这些时刻停止。 另一方面、当处于 PHA = 1 /CS 时、应保持低电平、并且时钟可以是连续的... 但是、正如我在该模式不能正常工作之前向您展示的那样。 即使按预期工作、也不会对我有效、因为存储器需要时钟的上升沿来输入和输出数据。 考虑采用单独 SPI 参数来控制/CS 的另一个原因、正如我在前面第2点所说的那样。 如何获得具有有效上升沿的连续时钟脉冲序列、以使存储器正常工作?

我对 SPI 驱动器的引脚配置有一些疑问:

4.为什么在 PIN 驱动程序"PIN_Config BoardGpioInitTable[]"数组中将所有 SPI 引脚定义为下拉输入? 不应将 CLK 和 MOSI 定义为输出?

5.要禁用/CS SPI 引脚,我已经看到,我需要将 CC1310_LAUNCHXL_SPI0_CSn 定义为 PIN_UNLOADD。 这可防止信号传播到引脚中。 不过、如果我将 CC1310_LAUNCHXL_SPI0_CSn 定义为一个引脚、并且我没有在"PIN_Config BoardGpioInitTable[]"数组中包含此引脚配置、我已经看到该引脚具有/CS 信号。 这是怎么可能的? 它是在运行时在 SPI 驱动程序内定义的引脚、我们不需要在引脚阵列中进行静态配置吗?

此致、

Juan Pablo Novo

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

    尊敬的 Juan:

    我将在明天更深入地探讨您的问题、并与您联系。  

    同时、您是否考虑使用 TI 提供的 NVS 驱动程序与您的外部闪存连接? 它应支持 Winbond W25xx 系列开箱即用,除非您想:)

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

    尊敬的 Juan:

    1) 1)这一点取决于您如何使用和配置驱动程序。 默认情况下、驱动程序使用 DMA 操作在单个事务中会达到10帧限制。 如果事务小于此值、则使用轮询方法、该方法可以看起来像多个小事务、而不是单个大事务(这意味着 CS 在(0、1)模式下切换)。

    这对您来说不应该是问题、因为存储器无论如何都不支持此模式。 它仅支持(0、0)和(1、1)。 模式(1、1)还应保持 CS 处于低电平、但要获得此行为、我希望您需要强制驱动程序始终在 DMA 模式下工作。 为此、您可以进入板级配置文件、找到与您使用的 SPI 外设相关的 HwAttrs 结构、并将"minDmaThreshold"值设置为1。  

    2) 2)我在这里给出的最佳答案是每个 IP 设计以及通常使用的格式。  实际上、器件处理 CS 的方式没有任何设定、许多"SPI 兼容"器件也决定了其自身的要求。 因此使用 SW CS (与您所做的相似)的情况并不少见。

    3) 3)参考1)此处、很可能是由于您未达到 DMA 限制而结束轮询传输。  

    4) 4)该表简单定义了应用的任何部分不使用时的引脚状态。 一旦您打开驱动程序实例、它将获取引脚的所有权并根据需要重新配置引脚。  

    5) 5)您引用的 PIN 数组是(再次)仅设置 PIN 的默认值。 如果你看看我之前谈到的 HwAttrs 表、你可以看到你用于 SPI 硬件的引脚被传递到这个结构中。 换言之: PIN_Config BoardGpioInitTable[]->未使用时的默认值、 spiCC26XXDMAHWAttrs[]-> SPI 驱动器的配置、包括要使用的引脚。

    最后、此芯片系列受 NVS 驱动程序支持、这意味着我们已经在 SDK 中提供了对它的支持(这也应表明您可以实际连接到它)。  

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

    您好、M-W

    感谢您的快速回答。

    我将尝试降低 DMA 阈值并告诉您结果。

    关于使用 NVS 驱动程序来管理存储器、我不太确定 NVS 是否可以实现、因为我了解了 NOR 和 NAND 闪存的许多差异。 例如:NVS 驱动程序中的扇区大小定义为擦除扇区大小。 在中、扇区也不是用于读取/写入的基本存储器单元、它可以单独擦除(或在较大的块中擦除)。 但在 NAND 中、用于读/写的基本存储单元是页、要擦除的最小大小是块(确定的页数)。 那么、如何设置 NAND 存储器的 NVS 扇区大小呢? 页面大小? 块大小?

    此外、我查看了 NVS 驱动程序文档、发现它是一个用于读取/写入/擦除存储器页/扇区/块/区域的基本接口。 必须理解为将其充分配置到所使用的目标存储器(例如:与 NAND 存储器相关的验证缓冲区大小是多少? 如何使用 NVS 建议的区域大小模式访问完整内存?) 如果要使用存储器执行特殊任务(例如读取/写入状态寄存器、使用页读取缓冲区、连续读取、管理坏块内部表等)、则必须将它们分开实施。

    因此、我认为构建一个 API 来通过具有我所需的所有功能的 SPI 访问存储器比学习和测试 NVS 驱动程序以及将来自 NVS 函数的读取/写入/擦除与我提供的特定 SPI API 函数混合更简单、更快。

    此致、

    Juan Pablo Novo

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

    尊敬的 Juan:

    您很可能需要调整驱动程序本身中的扇区大小等(因为它需要256字节的页并且这是硬编码的)。 如果您更接近源代码、您应该会看到它们共享大多数相同的 OP 代码等 如果您认为使用 NVS 驱动器接口需要付出很大的努力、您可以始终将其用作项目的基础、因为它能够与 W25系列的其他芯片配合使用(并且它们在一定程度上共享接口和操作码)。

    至于"已验证的缓冲区大小"、这只是一个由软件用来验证存储器内容的缓冲区。 它用作驱动程序将数据读出到的温度缓冲器。 缓冲区的大小不需要与存储器本身相关、但缓冲区越小、则需要迭代次数越多。

    NVS 驱动程序是一种基本的"最适合"驱动程序。 由于它应满足多种制造商和闪存类型的需求、因此该功能仅限于目标存储器之间共享的最低支持集。 这意味着、如果您需要访问所使用的存储器提供的更多功能集、则最好自行操作。 但是、在这种情况下、即使您不需要其余的逻辑、驱动程序仍可用作有关如何设置和处理 SPI 部件的指南。  

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

    大家好、M-W

    以下是使用"minDmaTransferSize=1"的结果:

    尽管返回的制造商 ID 值(0xDE)接近预期值(0xEF)、但 minDMA 更改对间隙没有执行任何操作。 未 返回器件 ID 值(0x0000、而不是0xAA21)。

    在这里、minDMA 起作用。 但是、由于边沿不正确、因此不返回任何内容。

    这与最后一个相同,但已缩小,以便显示 spiTransaction ()中引入的 DMA 负载,该负载使 GPIO /CS 以额外的延迟进行更改。 我认为可以将特定的/CS 参数添加到 SPI 参数结构中来解决这个问题。

    最后我测试了这个。 它具有正确的边沿和连续的脉冲序列。 我认为这应该是正确的、但不幸的是、存储器不会返回有效值。 它们与 POL0_PHA0的第一个案例相同...

    我开始想存储器是否会有问题。 今天、我直接从存储器测量 MISO 线路、而不将其连接到 CC1310、正如您所看到的、MISO 呈现的峰值与以前相同。 它们在更改级别时出现、甚至在没有更改时出现。 这很奇怪、你不想吗?

    我会询问 Winbond 这个问题、可能同时购买一些替代产品来测试其他产品、看看会发生什么情况。

    我会将此设置为由您解决、当我有更多信息时、我会告诉您。

    再次感谢您的帮助。

    此致、

    Juan Pablo Novo

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

    尊敬的 Juan:

    我同意尖峰看起来很奇怪、可能与器件与电路板的连接方式有关(或有故障)。 根据布线、如果器件输出0xDE 遵循它们所说的(0、0)(1、1)模式、则看起来确实是器件输出0xDE。 只有当您假装在下降沿进行采样时、才有一定意义(但是、这会留下保留时间、因为它也会更新此沿上的数据)。

    如果您有任何问题、我将随时关注您提供的更多信息。