主题中讨论的其他器件: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