我认为先从最后一个问题开始可能会更容易。
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 启动顺序
示例:启动顺序
- 重置控制器:断言和取消断言 Ref 和 CPU_1x 重置,请参阅第 17.4.1 节重置。
- 编程时钟:编程 SPI_Ref_Clk,请参阅第 17.4.2 节时钟。
- Tx/Rx 信号路由:请参阅第 17.5 节 I/O 接口。
- 控制器配置:请参阅第 17.3.2 节控制器配置。
- 中断配置:配置 ISR 以处理中断条件。最简单的 ISR
从 RxFIFO 读取数据并将内容写入 TxFIFO。 PS中断控制器是
第 7 章,中断中描述。 SPI 控制器的中断机制在
第 17.3.5 节中断服务程序。
-
开始数据传输:
主模式操作选择:手动/自动启动和SS,参见17.3.3主模式数据传输。
从机模式操作,请参阅第 17.3.4 节从机模式数据传输。
希望对你有帮助!