如何为Zynq 7000 ARM开发板编写SPI驱动程序?

时间:2013-05-19 03:16:40

标签: c embedded arm driver spi

我要为ARM开发板编写SPI驱动程序。它不适用于Linux。

昨天,我阅读了赛灵思提供的QSPI驱动程序,并成功尝试了。但是,我真的想编写自己的SPI驱动程序。

以下是我的问题:

  1. 使用QSPI和SPI有什么区别?
  2. 如果我根据QSPI编写驱动程序,它会起作用吗?
  3. 如果我从头开始编写驱动程序,基本步骤(READ / WRITE / INITIALIZE)是什么?
  4. 最后,为什么SPI必须同时发送和接收?
  5. 谢谢大家。

1 个答案:

答案 0 :(得分:1)

我认为从最后一个问题开始可能更容易。

Why must SPI send and receive at the same time?

简单的答案是它是协议的一部分。当数据在MOSI线上从主机移出到从机时,从机缓冲区中的数据将转移到MISO线上的主机。这允许硬件在每个设备中使用单个寄存器来发送数据和接收数据。这里有一个很好的流程图:

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还有另外两个标准SPI控制器,它们没有为QSPI设置。我强烈建议您阅读这里的技术文档:

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启动顺序

示例:启动顺序

  1. 复位控制器:置位和取消置位Ref和CPU_1x复位,请参见17.4.1复位。
  2. 程序时钟:编程SPI_Ref_Clk,参见17.4.2时钟。
  3. Tx / Rx信号路由:请参见17.5 I / O接口。
  4. 控制器配置:请参阅第17.3.2节“控制器配置”。
  5. 中断配置:配置ISR以处理中断条件。最简单的ISR        从RxFIFO读取数据并将内容写入TxFIFO。 PS中断控制器是        第7章中断,中断。 SPI控制器的中断机制如下所述        第17.3.5节中断服务例程。
  6. 开始数据传输:

    主模式操作选择:手动/自动启动和SS,参见17.3.3主模式数据传输。

    从模式操作,请参见17.3.4从模式数据传输。

  7. 我希望有所帮助!