題:
使用內置的SPI模塊和位敲打之間有區別嗎?
Skaevola
2013-05-21 07:28:50 UTC
view on stackexchange narkive permalink

兩者之間是否有區別,還是僅僅是一個抽象問題?我的直覺說沒有什麼區別,但我很想錯。

取決於您在撞擊方面有多出色。參見http://code.google.com/p/fastspi/和http://waitingforbigo.com/ :-)
五 答案:
user3624
2013-05-21 07:39:34 UTC
view on stackexchange narkive permalink

MCU中的實際SPI控制器外圍設備通常可以比接口的位衝擊​​更快。當然,這取決於MCU,但是看到SPI控制器以30 MHz以上的頻率運行,而比特跳動可能會限制在1 MHz左右(如果幸運的話),這不會令我驚訝。 >但是還有更多。當位撞擊時,MCU忙於位撞擊。它正在移出數據並旋轉GPIO線。意思是,它不能做其他任何事情。使用SPI控制器時,控制器忙於做所有這些事情,而MCU則可以自由地做其他事情。

因此,使用實際的SPI控制器,實際的SPI傳輸要快得多,MCU可以收回一些週期,可以用來做其他事情。

Amoch
2013-05-21 07:45:40 UTC
view on stackexchange narkive permalink

使用兩種方法都可以達到相同的結果並沒有什麼區別,但是出於某些原因,您會選擇其中一種。

使用SPI外設可以使處理器擺脫困境。不必擔心產生位撞擊I / O引腳的時序,使其能夠執行其他計算任務並簡化CPU的編程。由於外設是在硬件中實現的,因此與位衝擊I / O相比,它可以運行得更快,功耗更低。如果您的應用程序要求您選擇不帶SPI外圍設備的處理器,則在某些情況下,您可能希望使用I / O來與SPI接口。出於理智的考慮,除非絕對必要,否則我建議避免這樣做。

理智的原因是垃圾。與僅編寫SPI主代碼相比,通常將SPI硬件正確設置為所需的配置會花費更多的時間來讀取SPI外圍設備數據表,從而僅需讀取從設備數據表。
我會坦率地說,我有點聳人聽聞,但(公認的不成文的)意圖是,隨著應用程序複雜性的增加,確保整個系統在預定時間內繼續運行的負擔也越來越大。我已經實現了這兩種方式,並且我知道我更喜歡使用外圍設備,即使讀取數據表需要花費我幾分鐘的時間。
Olin Lathrop
2013-05-21 18:55:34 UTC
view on stackexchange narkive permalink

SPI是一個同步 i>接口,由主機控制時鐘。這意味著,如果您是大師,您將可以選擇時鐘速度和時序。從設備將可以處理的時鐘頻率有一些上限,但通常不在乎時鐘低於該頻率的速度。更具體地說,每個從站通常需要最短的時間才能看到時鐘處於高低狀態,然後才能再次切換,並且在時鐘沿周圍的數據線上存在一些最小數據建立和保持限制,從設備讀取數據線。

因此,在固件中實現SPI主設備確實非常容易。我經常這樣做是為了在沒有內置SPI硬件或者出於某種原因而無法用於某些目的時方便使用某些引腳。在固件中完成一個SPI主設備的過程幾乎就很容易。

許多SPI從設備速度非常快,因此通常只需確保每個時鐘週期至少一個指令周期即可滿足最小時鐘和建立時間寬。在這種情況下,代碼非常短且快速。在某些情況下,從設備每個時鐘相位可能需要兩個或三個指令周期,但這並不是很難保證的。低電平SPI位循環需要將下一個輸出位移入位置,抓取輸入位,並檢查循環計數器。通常,只需安排行車時間和採樣時間,並在正確的位置插入一些其他開銷,即可滿足兩個或三個週期的最小計時要求。如果速度很重要,則可以使用彙編器預處理器編寫展開循環。借助這樣的技術,您通常可以以大約從設備可以處理的速度獲得純固件SPI。

在固件中進行SPI主控有一些優勢。 SPI硬件有時在如何配置方面有點可笑。始終存在一個問題,即當從機選擇有效時,應該立即發生什麼。然後將第一位寫入數據線嗎?如果時鐘開始變低並且數據線應該在下降沿被鎖存怎麼辦?有時候這很重要,有時候卻沒有。使用固件SPI主設備,您可以更加寬容,並可能使用相同的例程與不同的從設備進行通信。例如,您可以確保MOSI(主輸出從輸入)數據線在時鐘的兩個邊沿上都是穩定的。 SPI硬件通常不會這樣做,因此需要根據當時與哪個從設備通信來重新配置此類硬件。

固件SPI主設備的另一個優點是您可以選擇每個SPI序列中任意數量的位。硬件通常限於8位的倍數。大多數設備旨在允許整個字節傳輸,但通常不需要它們。例如,一個10位的A / D可能會先發送10個數據位,然後如果繼續為其計時,則發送0或垃圾。如果使用硬件SPI,則將被迫傳輸16位並掩蓋垃圾。一切都可以正常工作,但是在這種情況下,固件SPI主控實際上可以比硬件更快,因為它僅傳輸最少的10位。

硬件SPI主機的主要優點是固件可以啟動字節傳輸,然後執行其他操作。時鐘通常還比展開的固件循環所能達到的更快。請注意,雖然這兩個優點在某些情況下可能很重要,但它們通常無關緊要。使用硬件傳輸字節的大多數SPI代碼隨後立即進入等待循環,以等待硬件完成傳輸。還要仔細檢查從機時序要求。 SPI設備總體上總體上是快速的,但是在某些情況下,無論如何,您都需要降低硬件速度以匹配從設備可以處理的最大速度。簡而言之,將SPI硬件用作主設備通常沒有什麼優勢,而有時不使用它甚至還有一些優勢。但是,對於奴隸來說,一切都不同。由於主機控制時鐘,因此從機必須為主機做任何準備。相對於指令時間而言,時序要求通常很短,因此通常需要硬件來實現SPI從設備。

您可以在固件中處理SPI從設備,但這很棘手,您必須仔細計算週期和等待時間,並且通常最終會實現您知道特定主機使用的協議的子集。例如,有一次我不得不設計與舊的模擬控制器板等效的數字器件(他們希望獲得模擬中無法合理完成的額外功能,並且他們想要更小,更便宜且更穩定的產品)。該開發板通過SPI總線連接到系統的其餘部分。舊的模擬板有兩個通道的D / A來設置控制值,還有一個兩個通道的A / D來回讀測量值。在單個處理器中實現這兩者都是很棘手的,其中包括弄清楚現有主機實際使用了硬件D / A和A / D SPI協議的哪些子集。它還開發了一種處理器,該處理器的運行速度可能比SPI時鐘速率快得多。最後,我使用了三個中斷,一個用於每個從機選擇,一個用於時鐘線的上升沿。最後一個中斷必須是系統中優先級最高的中斷,否則就無法滿足延遲要求。

總而言之,總的一點是,固件SPI主控器容易,小型,快速且靈活。 ,而且沒有理由迴避做某事。另一方面,對於從屬服務器,您確實需要硬件,或者您必須醒來並仔細考慮時序,延遲等。

您是否找到了可以像典型的硬件SPI設備一樣工作的微控制器從設備實現(例如,允許主設備隨時提供CS優勢並隨時讀取狀態,並使用CS來標記命令邊界?)甚至報告當前字節和前一個字節之間是否存在CS邊沿。
@supe:是的,這是一個問題。當未確定芯片選擇時,從SPI硬件通常會忽略時鐘和輸入數據,並將輸出數據線保持在高阻抗狀態,但通常不會告訴您芯片選擇邊界在哪裡。至少使用我記得使用的PIC SPI硬件,您必須為此設置片上選擇中斷。
我想知道您是否知道任何體面的實現。我猜不會。在選擇線上使用硬件中斷的問題是,如果在發送字節後不久在選擇線上發生轉換,則從站可能很難解決它是在所討論的字節之前還是之後發生的問題。我感到困惑的是,幾乎每個芯片都具有SPI從設備實現,但是似乎沒有一個芯片可以像典型的SPI硬件從設備一樣實際使用。與8048相比,情況有點像PIC上的處理器從端口。
8048處理器從端口具有一個地址引腳。當數據從外部寫入8048時,8048會鎖存該引腳的狀態並使其可用於其代碼(通常,命令的第一個字節將寫入一個地址,而參數或數據將寫入另一個地址)。讀取一個地址將產生8048代碼所放置的內容,但是從另一個地址讀取的某些位將由8048硬件生成以指示其是否準備好讀取或寫入數據。
+1指出區別是位(主)(容易)和從屬(更困難)。
rDg
2013-05-22 00:31:08 UTC
view on stackexchange narkive permalink

這取決於您要執行SPI的目的。如果您的興趣是從中獲得最高的數據速率,那麼硬件總是比bitbanging快(例如,teensy中的手臂皮質芯片3我可以使用硬件SPI支持以22Mbps的速度推出數據,而bitbanging的速度為〜4.5Mbps(它還可以處理3-16中每次傳輸的任意數量的比特-在以12位塊的形式向某些led控制器發送數據時非常有用!))。在16Mhz avrs上,兩者之間的差異不太明顯,硬件的最高數據速率似乎是4Mbps /低5Mbps,而bitbanging約為2.3Mbps。

此外,如果您使用硬件支持,再次,根據所討論的微控制器,您可以使用DMA控制器將數據移出,從而使代碼返回到其他比保管數據寫入更有趣的事情。

以上所有內容都取決於是否可以選擇硬件SPI。

Scott Seidman
2013-05-21 18:22:38 UTC
view on stackexchange narkive permalink

如果對SPI進行位擴展,則無法使用SSP中斷來處理通信。對於SPI的許多用途來說,這並不重要

沒有提及特定的處理器,因此“ SSP中斷”在此上下文中是沒有意義的術語。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...