一隻可以爬行、跳舞、避障,並且可以手機遙控的機器蜘蛛是怎麼做到的呢?下面這張圖給出了這個機器人系統的組成。

視頻封面

00:09六足機器人

樹莓派作為控制核心,實現演算法處理和指令發送,FPGA內部實現PWM發生器,驅動18路舵機動作。要想讓樹莓派和FPGA協調工作,兩者之間的通信就顯得尤為重要。

計算機系統發展至今,雖然數據通信匯流排也在不斷的更新換代,速度帶寬不斷提升,但是有一些匯流排,尤其是一些串列匯流排SPI/I2C/UART等至今仍然是應用的主流。

在這個六足機器人系統中,樹莓派和FPGA之間就使用的串列匯流排通信,對於MCU來說SPI/I2C/UART等串列匯流排是標配,我們只需要在軟體中配置一下寄存器就可以工作了,但是對於FPGA來說,如何實現這些匯流排呢?

UART(通用非同步接收/發送)是一種計算機硬體設備,它在計算機中的字元之間轉換數據,以及在起始位和停止位之間封裝這些字元的非同步串列通信格式, 其中數據格式和傳輸速度是可配置的。

在UART通信中,兩個UART可直接相互通信。 發送UART將來自CPU等控制設備的並行數據轉換為串列格式,並將其串列發送到接收端的UART,接收UART將串列數據轉換回接收設備的並行數據。 在兩個UART之間傳輸數據只需要兩根線, 數據流從發送UART的Tx引腳到接收UART的Rx引腳。

本質上,UART充當並行和串列介面之間的中介。 UART的一端是八條左右數據線(加上一些控制引腳),另一條是兩條串列線 - RX和TX。

兩個設備可以發送和接收數據的串列介面是全雙工或半雙工。

UART以非同步方式發送數據,也就是說沒有時鐘信號將發送UART的位輸出與接收UART的位採樣進行同步。 發送UART將「起始」和「停止」位添加到正在傳輸的數據包中, 這些位定義了數據包的開始和結束,接收UART基於這些位的信息知道何時開始讀取輸入的串列數據。

當接收UART檢測到起始位時,它以特定的頻率(也就是「波特率」)讀取輸入的串列數據。波特率是數據傳輸速度的度量,單位-每秒位數(bps)。 兩個UART必須以相同的波特率運行。發送和接收UART之間的波特率相差不能超過10%,偏差太遠就無法對數據進行正確的解讀。兩個UART還必須配置為發送和接收相同的數據包結構。

實際應用中的信號傳輸方式

將兩個UART的設備進行連接有多種方式,取決於具體的應用場景,在這裡我們僅看兩種:TTL UARTRS-232

TTL UART:當微控制器和其它器件進行串列通信時,通常以TTL電平進行通信。 TTL串列信號存在於微控制器的電源電壓範圍內 - 通常為0V至3.3V或5V。 VCC電平(3.3V,5V等)的信號表示空閑線,值1或停止位。 0V(GND)信號表示起始位或值為0的數據位。

RS-232 UART:可以在一些更古老的計算機和外圍設備上找到,就像TTL串口翻轉一樣。 RS-232信號通常介於-13V和13V之間,但規格允許從+/- 3V到+/- 25V。 在這些信號上,低電壓(-5V,-13V等)表示空閑線,停止位或值為1的數據位。一個高的RS-232信號表示起始位或0- 值數據位。 這與TTL系列相反。

SPI是一種用於短距離通信(主要是嵌入式系統中)的同步串列通信介面規範,廣泛用於各種MCU處理器中,同感測器,串列ADC、DAC、存儲器、SD卡以及LCD等進行數據連接。

4種傳輸模式:

每次數據傳輸都是先將SSN被驅動為邏輯低電平時開始。由時鐘的極性(CPOL)和相位(CPHA)構成了4種不同的數據傳輸模式(0,1,2,3),分別對應四種可能的時鐘配置。

  • CPOL: 時鐘的極性,它控制著時鐘信號的初始邏輯狀態。
  • CPHA: 時鐘相位,它控制了數據轉換和時鐘轉換之間的關係。

時鐘的極性和相位構成了4種不同的可能,也就有4種模式。

在時鐘周期的上升沿採樣的位在時鐘周期的下降沿移出,反之亦然。

具有非反相時鐘極性

  • 模式0:配置時鐘相位使得數據在時鐘脈衝的上升沿採樣,並在時鐘脈衝的下降沿移出。 這對應於上圖中的第一個藍色時鐘軌跡。 請注意,數據必須在時鐘的第一個上升沿之前可用。
  • 模式1:配置時鐘相位使數據在時鐘脈衝的下降沿採樣,並在時鐘脈衝的上升沿移出。 這對應於上圖中的第二個藍色時鐘軌跡。

使用反相時鐘極性

  • 模式2:配置時鐘相位,使得數據在時鐘脈衝的下降沿採樣,並在時鐘脈衝的上升沿移出。 這對應於上圖中的第一個橙色時鐘軌跡。 請注意,數據必須在時鐘的第一個下降沿之前可用。
  • 模式3:配置時鐘相位,使得數據在時鐘脈衝的上升沿採樣,並在時鐘脈衝的下降沿移出。 這對應於上圖中的第二個橙色時鐘軌跡。

I2C是一種簡單地連接多個晶元的匯流排方式,跟SPI對比,I2C沒有天生的主、從之分,也就是說掛在兩根線(數據線SDA和時鐘線SCL)上的所有器件都是生而平等的。

I2C匯流排傳輸時序

I2C協議概要

以下是I2C的主要特徵:

  • 不論匯流排上掛多少個設備,只需要兩根信號線(時鐘SCL和數據SDA)就搞定;
  • 兩根信號線都通過合適阻值的上拉電阻連接到正電源上;
  • 每個設備的介面都是通過漏極開路(或集電極開路)的輸出驅動連接到時鐘和數據信號線上;
  • 每個從設備都有一個7位的地址,可供定址用。主設備必須知道這些從設備的地址以便同指定的一個從設備進行通信;
  • 所有傳輸均由「主設備」發起和終止;「主設備」可以將數據寫入一個或多個「從設備」或從「從設備」請求數據;
  • 在系統中「主」和「從」不是固定的,任何一個設備都可以作為「主」或「從」,只要它配置了適當的硬體或固件,實際上在嵌入式系統中最常採用的架構就是一個「主設備」向多個「從設備」發送命令或由多個「從設備」採集數據;
  • 數據信號在時鐘的下降沿更新,並在上升沿被採樣,如下圖;

I2C協議中數據和時鐘的時序關係

  • 數據是以一個位元組進行傳輸的,每一個位元組跟著1位的握手信號,作為ACK/NACK(應答/無應答)位。

I2C有何優勢?

  • 管腳/信號數量少,即便掛了很多的設備,也只用兩根線;
  • 可適應不同的從設備的要求;
  • 可支持多個主設備;
  • 引入ACK/NACK功能以提升應對錯誤的能力。

有何劣勢?

  • 增加了固件和底層硬體的複雜度
  • 增加了協議的負荷,降低了數據傳輸的吞吐率
  • 需要上拉電阻

由此可以看到I2C比較適合複雜、多樣化、需要通信設備靈活擴展的場景;UART比較適合單點對單點的連接,因為UART沒有標準的方式來定址不同的設備或共享管腳。SPI比較適合系統中有一個主設備和少量的從設備,而且每一個從設備都有一個單獨的「從設備選擇」信號,當匯流排上有多個設備的時候會需要更多的管腳,布線的難度也會增加,當你需要支持多個主設備的時候,SPI用起來也會非常尷尬。

如果你需要較高的傳輸速率,使用I2C就不太合適,SPI能夠支持更高的時鐘頻率,數據負載開銷也最小。如果你想使用FPGA從頭設計串列數據傳輸,SPI和UART的底層硬體設計要簡單得多,迫不得已再用I2C。

好了,今天的分享到這就告一段落啦!其他更多內容請掃碼下方關注本堂課教學!


推薦閱讀:
相关文章