我将为 ARM 开发板编写一个 SPI 驱动程序。它不适用于 Linux。
昨天看了Xilinx提供的QSPI驱动,试了成功。但是,我真的很想编写自己的 SPI 驱动程序。
以下是我的问题:
- QSPI 和 SPI 在使用上的区别是什么?
- 如果我写一个基于 QSPI 的驱动程序,它会工作吗?
- 如果我从头开始编写驱动程序,基本程序是什么(READ / WRITE / INITIALIZE)?
- 最后,为什么 SPI 必须同时发送和接收?
谢谢大家。
我认为首先从你的最后一个问题开始可能更容易。
Why must SPI send and receive at the same time?
简单的答案是它是协议的一部分。当数据在 MOSI 线上从 Master 移出到 Slave 时,Slave 缓冲区中的数据在 MISO 线上转移到 Master。这允许硬件在每个设备中使用单个寄存器来存储正在发送的数据和正在接收的数据。这里有一个很好的过程图:
http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus
不太简单的答案是 SPI 不是一个定义明确的标准。根据您使用的设备,有不同类型的实现。甚至还有一种变体,将 MOSI 和 MISO 线组合起来并以双向方式使用(3 线 SPI)。然而,我处理的大多数实现都是通过两条不同的线路发送和接收,这往往是标准方法。
What is the difference between QSPI and SPI on usage?
QSPI 或 Quad SPI 实际上不遵循标准方法,打破了同时发送和接收的概念。它利用四个双向 I/O 线来发送和接收数据,并且通常用于内存应用程序(因为它比 SPI 更快)。使用 QSPI,您不会同时发送和接收。
If I write a driver based on QSPI, will it work?
当然!您只需要熟悉您正在使用的硬件。同样,SPI 与 Quad SPI 非常不同,您经常可以找到使其非常易于使用 QSPI 的硬件实现。例如,您的 Zynq 7000 有一个 QSPI 控制器,它有很多功能可以简化编码过程。它还将在充当普通 SPI 控制器的“传统模式”下运行。最重要的是,Zynq 7000 有另外两个没有为 QSPI 设置的标准 SPI 控制器。我强烈建议您阅读此处的技术文档:
http://www.xilinx.com/support/documentation/user_guides/ug585-Zynq-7000-TRM.pdf
If I write a driver from scratch, what is the basic procedure?
这是非常依赖于硬件的。我对您的硬件做了一个快速的概述,但是在这里详细说明这些步骤需要的时间太长了。但是,您设备的技术手册似乎有很好的分步说明,用于配置和使用 QSPI 和 SPI 控制器。以下是 SPI 部分的示例:
17.3.1 启动顺序
示例:启动顺序
开始数据传输:
Master Mode 操作选择:Manual/Auto start 和 SS,参考章节 17.3.3 Master Mode Data Transfer。
从机模式操作,请参阅第 17.3.4 节从机模式数据传输。
我希望这会有所帮助!