天天看點

樹莓派與Arduino SPI通信

關聯知識視訊教程

  • 使用Raspberry Pi零無線網絡建構自己的GPS跟蹤系統
  • Raspberry Pi + Django家庭伺服器
  • 使用Raspberry Pi和Python的輪式機器人運動控制

本教程介紹了使用SPI(串行外圍裝置接口總線)進行Raspberry Pi與Arduino通訊和控制的基本架構。 SPI代表了一種非常完善的晶片間通信方法,該方法在兩種裝置的硬體中均實作。 在這裡,我們将詳細探讨SPI,讨論硬體和軟體注意事項,并開發一個雙向通信方案的工作示例,該方案可适用于許多指令和控制應用程式。

介紹

Arduino 3.3伏

選擇運作在3.3v電壓下的Arduino,可以在兩個裝置的輸入和輸出引腳之間實作直接連接配接,而無需進行電平轉換即可對齊電壓并保護樹莓派輸入,進而簡化了此項目。

Arduino通常被描述為5伏平台,但這并非完全正确。 實際上,在許多标準Arduino的核心中,ATMEGA328P-PU微控制器的額定工作電壓為1.8v至5.5v。 盡管旗艦版Arduino Uno和許多其他産品都是為5v操作而設計的,但也有很多官方和非官方的3.3v Arduino供您選擇,包括Fio,Pro,Pro-Mini和Lilypad。 (Pro和Pro-Mini具有3.3v和5v版本。)

開發本教程時使用的“ Arduino”是ATMEGA328P-PU,在面包闆上采用準系統配置。 該設定确實是準系統。 沒有電壓調節器或外部時鐘晶體,隻有由樹莓派的3.3v抽頭和10K電阻将複位引腳拉高的晶片供電。 (當然,在電源軌上放置一些去耦電容器也沒有什麼壞處。)除了誘人的電路簡單性和節儉性之外,準系統配置是連接配接Raspberry Pi的理想選擇。 3.3v運作不僅對樹莓派友好,而且使用電壓調節器和晶振可以顯着降低總體功耗,這對于在3.3v線路上具有50mA限制的老式樹莓派尤其重要。

我通常在電池供電的小型項目中使用此準系統設定。 自己制作時,需要考慮一些在較低電壓下運作328P的注意事項。 最重要的問題是需要以較低的時脈速度運作,8MHz是最快的時鐘,可以在3.3v時可靠地支援該時鐘。 另一個考慮因素是,必須禁用或配置328的掉電檢測,以使壓差小于3.3v。

Arduino官方網站上有board.txt檔案:從Arduino到面包闆上的微控制器,它将提供适當的設定來運作最低限度的闆并加載8MHz相容的引導程式。 如果您不熟悉啟動引導程式和建構自己的主機闆,則本頁面還将為您提供一個很好的起點,以收集必要的知識和技能。

關于樹莓派環境和C ++編譯器的一些注意事項

本教程是使用運作标準Raspian Linux發行版的Raspberry Pi Model B和Raspberry Pi 2開發和測試的。 這些示例應該可以在任何目前的Raspberry Pi型号上無需修改的工作。 我通過SSH從Linux PC上的終端通過SSH運作Raspi“無頭”(沒有螢幕或鍵盤),是以實際上我的所有互動都在指令行中進行。 示例代碼使用C ++編寫,并使用GNU編譯器集合(GCC)進行編譯。 GCC是Raspian發行版的一部分,是以無需安裝或配置即可使用。 此處的所有示例都可以使用非常簡單的指令行文法進行編譯:

g++ -o <target> <source>
           

要通路SPI外設,必須具有較高的使用者權限,是以将需要使用sudo執行編譯後的示例,如下所示:

sudo ./example
           

SPI接口

SPI是Raspberry Pi Arduino連接配接的幾種可行選擇之一。 SPI接口的一些優點是廣泛采用,信号完整性,協定設計的靈活性和簡單性。

SPI采用主從架構。 主裝置啟動并控制與從裝置的所有通信。 SPI通信是同步的,這意味着兩個裝置之間的資料傳輸通過共享的時鐘信号同步。 SPI通信也是全雙工的,這意味着資料可以同時在兩個方向上流動。

主機通過時鐘線控制資料傳輸。 每次主機向時鐘線發出脈沖時,就會有一位資料從主機發送到從機。 同時,從從機向主機推送一位資料。 實際上,出于我們此處的目的,可以将資料視為在位元組級别上移動。 主機和從機各自将一個位元組加載到其各自的SPI資料寄存器中,主機向時鐘線脈沖八次以在每個方向上壓入一個位元組。 盡管可以設定各種硬體标志和可以觸發的中斷,但是沒有SPI協定。 兩個裝置之間同時傳輸一個位元組的資料是整個過程的全部。 如果需要,确認信号,錯誤檢查,資料包定義和其他通用協定功能都可以在軟體中處理。

SPI總線本身由四個實體連接配接組成:兩條資料線,一條時鐘線和從選擇線。 主機必須為每個從機配備一條從機選擇線,是以理論上所需的從機選擇線的數量可能會增加。

Raspberry Pi和Arduino的時鐘和資料線的名稱和标簽相同:

  • SCLK:串行時鐘(主機輸出)
  • MOSI:主站輸出,從站輸入(主站輸出)
  • MISO:主機​​輸入,從機輸出(從機輸出)

但是,在從站選擇線上,兩個平台之間的命名略有不同。 在Arduino上,該行稱為“從屬選擇”,縮寫為SS。 在Raspberry Pi上,該過程稱為“片選”(縮寫為CS),而CS線稱為“晶片使能”線(簡稱為CE)。 PI實際上使兩條從選擇線可用,辨別為CE0和CE1。

與某些串行總線方案不同,在串行總線方案中,一個裝置的傳輸線(TX)連接配接到另一裝置的接收線(RX),在SPI中,一個裝置上的四條線直接連接配接到另一裝置上的相應線,如下圖所示。

SPI總線在ATMEGA328P-PU上的實體位置很簡單,如下面的引腳圖所示。 SS在實體引腳16上,MOSI在引腳17上,MISO在引腳18上,而SCLK在引腳19上。

Raspberry Pi GPIO接頭的引腳排列圖更加簡單。 遵循下面的引腳圖(與版本A,A +,B,B +和2B保持一緻),MOSI是引腳19,MISO引腳21和SCLK引腳23。在本教程中,我們使用引腳24上的CS CE0。

啟用樹莓派SPI

在樹莓派上編碼SPI

Arduino上編碼SPI

代碼

詳情參閱http://viadean.com/rpi_spi_arduino.html