2013-07-05 50 views
3

我是SPI新手; Linux內核提供了用於聲明SPI總線和設備的API,並根據標準Linux驅動程序模型對其進行管理。SPI:Linux驅動程序模型

,可以看到該結構spi_master這裏的描述:https://www.kernel.org/doc/htmldocs/device-drivers/API-struct-spi-master.html

以上在鏈路中的描述指出,「每個設備可以被配置爲使用不同的時鐘速率,因爲這些共享信號,除非該芯片忽略被選中「。爲了把這個句子放在比賽中,我必須說「設備」是指SPI從設備,而「共享信號」是MOSI,MISO和SCK信號。

實際上,在struct spi_device(https://www.kernel.org/doc/htmldocs/device-drivers/API-struct-spi-device.html)中有一個名爲max_speed_hz的屬性,它不存在於struct spi_master中。所以我可以理解上面聲明的第一部分:「每個設備可以配置爲使用不同的時鐘頻率」。

但是,第二部分是什麼意思?是否「因爲共享信號被忽略,除非芯片被選中」意味着我被允許使用不同的時鐘速率,但只有一個時間通過啓用/禁用具有不同速率的從器件?

謝謝你的幫助!問候,

- 利瑪竇

+0

是的,但這是因爲您只想一次與一臺設備通話。每臺設備都在公交車上「轉彎」。每個設備都有自己的一套命令,最大SCLK等等。所以我們只想一次啓用一個設備。這可能有一些警告,但我認爲這通常是正確的。 – rkyser

+0

@rkyser:你爲什麼說「你只想一次與一個設備交談」?爲簡單起見,我們假設一個時鐘頻率。我們來看看[典型的SPI總線上的維基百科](http://en.wikipedia.org/wiki/File:SPI_three_slaves.svg)。假設從機有8位數據寄存器,主機有24位數據寄存器。你是否說我不允許通過將SS1,SS2和SS3置零(假設從設備選擇爲低電平有效)使所有從設備一起工作? –

+0

我認爲這取決於硬件架構。在你給出的例子中,如果主設備正在輸出24位數據,由於每個從設備接收到完全相同的位,所以從設備如何知道哪個設備屬於它? [這個體系結構](http://en.wikipedia.org/wiki/File:SPI_three_slaves_daisy_chained.svg)對你正在談論的內容會更好。但是,再一次,這實際上取決於SPI設備正在與之交談。我只是從我有限的經歷中發言。 – rkyser

回答

1

@Matteo米:我想你實際上是允許simultaeously設置SS1,SS2和SS3至零,以這種方式使所有三個SPI從在同一這一刻。原因是,SPI從設備在接收MOSI線路上的數據時,同時發送MISO線路上的數據。如果實際上全部是三個從機將把數據放在(共享)MOSI線路上,那麼在數據和電流兩方面都會發生非常糟糕的事情。

0

SPI是一個非常鬆散的「標準」,沒有太多的規則可以遵循,這是很好的(而且我猜測很糟糕)。這很好,因爲它很靈活。這很糟糕,因爲根據您所處理的特定硬件,它可以以不同方式實施。某些設備僅支持半雙工通信,正如您所知,需要協調何時可以驅動總線。選擇線路(芯片使能,從機選擇,無論你想給他們打電話)提供了一個方便的方法來做到這一點,而無需使用位來識別哪個從機應該從總線上獲取消息。正如沃爾夫岡所說的,在全雙工模式下,在每個時鐘脈衝上,數據從主機和從機上分配到總線上,可能需要選擇線來防止不好的事情發生。我想強調可能需要;主處理器與其他處理器進行通信是完全合理的,這些處理器在響應某些特定位模式(例如,「地址」)時僅驅動總線...更多軟件/固件?是的,但它並沒有阻止你。因此,如果你的8位從機是說的,例如8位DAC,那麼你確實可以寫出主數據寄存器的值組塊。獨立的選擇線路可以讓你在沒有所有這些奴隸一次駕駛巴士的情況下做到這一點。是的,你必須一次將每個從機的值轉換爲主寄存器,但這也是一個完全合理的設計。

與一些更復雜的串行協議不同,SPI實際上非常靈活;因爲它不會將您鎖定到最大字數或要求您寫入總線的任何數據由地址,偏移量和內容組成。