2012-10-23 23 views
3

我需要爲連接到STM32 Cortex M3 MCU的閃存芯片創建驅動程序。該芯片通過SPI總線進行控制。我打算使用MCU的集成SPI外設,但不幸的是,它僅支持8位或16位數據包,而閃存芯片命令長14位。因此,我必須使用GPIO從頭開始實施協議。我的問題是:確保正確的信號時序的正確方法是什麼?我目前想在插入delays之間斷言和解除斷言禁用GPIO線路,但它似乎是相當不可靠的。有沒有更好的方法?在ARM Cortex M3上實現非標準SPI變化

+4

我會抵制這樣一個模糊的界面的內存。有很多使用「標準SPI」的存儲器,只要有SPI標準即可。 – Lundin

+0

@Lundin,不幸的是,硬件部分不是我設計的,顯然我們現在不能把它扔掉。我同意一個更方便的接口芯片將是更好的選擇。 –

+1

也許有其他製造商的引腳兼容替代品?即使重新設計硬件不是一種選擇,您至少應該要求使用該特定部件的理由。 – Lundin

回答

4

傑布的答案是首選的方法,如果可能的話,你應該使用硬件SPI,如果DMA是一個很好的選項。

如果您出於某種原因發現您不能使用硬件SPI,但必須使用GPIO上的「bit-banging」來實現它,您應該檢查在GPIO上的定時器/ PWM硬件中有哪些可用選項MCU。你不能使用,並且不應該在你發佈的鏈接中使用鈍的「愛好者燒燬延遲」,實時性能將是垃圾,你將佔用CPU 100%。

大多數MCU定時器都帶有一個引腳輸出功能,可以在定時器超時時改變引腳的狀態。然後,僞代碼將是:

  • 確定是否下一個比特發送爲1或0。
  • 的MCU極性寄存器中相應設置,以便它將銷切換到高或低的水平。
  • 當計時器過去時,您需要再次設置極性,可能是通過中斷。如何做到這一點非常依賴硬件。
  • 在您對數據(MOSI)進行位反轉的同時,您還需要生成時鐘和片選。時鐘可以以與數據相同的方式生成,或者可以通過PWM信號生成(如果該選項可用)。芯片選擇是最簡單的部分,因爲您只需在數據傳輸過程中將引腳拉低即可。

最後,關於如何爲特定MCU編寫軟件SPI,很可能有一些應用筆記或官方示例。

2

如果可能的話,我會推薦使用SPI和DMA構建!

您可以將您的數據重新映射到大小爲14位倍數的字節數組中。 所以你必須每次發送7 * 4Bits = 28bytes的倍數。
然後,您可以使用帶有8Bit大小的標準SPI。

但是,與SPI/DMA相比,這應該快得多。

0

一些使用模糊數據長度的設備被設計成在事務開始時它們將忽略在第一個「1」之前計時的所有「0」位,或者所有「1」位被計時在第一個「0」之前。如果您的設備碰巧是以這種方式設計的,那麼您可以使用8位或16位SPI模式,將兩個「垃圾」位與感興趣的位一起計時。