2013-05-19 59 views
1

我將爲ARM開發板編寫一個SPI驅動程序。它不適用於Linux。如何爲Zynq 7000 ARM開發板編寫SPI驅動程序?

昨天,我閱讀了賽靈思提供的QSPI驅動程序,並試用成功。不過,我真的很想寫我自己的SPI驅動程序。

這裏是我的問題:

  1. 是什麼在使用QSPI和SPI之間的區別?
  2. 如果我寫一個基於QSPI的驅動程序,它會工作嗎?
  3. 如果我從頭開始編寫驅動程序,基本步驟是什麼(READ/WRITE/INITIALIZE)?
  4. 最後,爲什麼SPI必須同時發送和接收?

謝謝大家。

+0

這需要整理和澄清很多。但是,處理器中的QSPI內核傾向於在處於這種模式時能夠與SPI通信,因此首先檢查文檔和源文件,並確保您已有的驅動程序不能用於普通SPI。 –

+0

SPI本質上是一個位的交換,但沒有人說在寫入過程中讀取的內容必須在每種情況下都很重要 - 這取決於外設。對於很多人來說,在命令執行過程中讀取的內容毫無意義,然後在讀取響應數據時輸出的內容無關緊要。但是,也可以製作優化總線使用率的外設,在提供新命令的同時爲您提供舊的或默認的/狀態響應。 –

回答

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或四路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章中斷中介紹。 第17.3.5節中斷服務程序描述了SPI控制器的中斷機制。
  6. 開始數據傳輸:

    主方式操作選擇:手動/自動啓動和SS,請參見17.3.3主模式數據傳輸。

    從模式操作,請參見17.3.4從模式數據傳輸。

我希望有幫助!