單片機是一種集成電路晶片。它採用超大規模技術將具有數據處理能力的微處理器(CPU)、存儲器(含程序存儲器ROM和數據存儲器RAM)、輸入、輸出接口電路(I/O接口)集成在同一塊晶片上,構成一個即小巧又很完善的計算機硬體系統,在單片機程序的控制下能準確、迅速、高效地完成程序設計者事先規定的任務。所以說,一片單片機晶片就具有了組成計算機的全部功能。
1、SPI
SPI允許單片機和外圍設備或者單片機之間高速同步數據傳輸,SPI可以有主機和從機模式之選,通信的主從機之間通過移位寄存器同時交換數據。目前自己用的以主機模式居多。SPI需要四線:SS,MISO,MOSI,SCK。
通信過程:在設置好SPI的工作模式:包括SCK頻率(數據傳輸速率),工作速度,主從模式,以及數據接收發送對應的時鐘極性。在主模式下,將SS拉低表示通信的開始,然後通過向SPI數據寄存器中寫入一字節的數據後自動啟動時鐘SCK開始進行一次通信,通信完成後會產生相應的中斷標誌,標誌一個字節數據的傳送完成。通信完成後將SS腳拉高,表示通信過程已經結束。
注意SS引腳的設置:當設置為從機模式時,SS引腳應設置為輸入,拉低的時候SPI才能起作用,拉高的話是消極的SPI模式;在主機模式下,SS引腳可以設置,一般應設置為輸出,如果設置為輸入的話應保持為高,否則將不能進行正常的主機模式操作。
2、USART
USART的操作比較簡單,主要是設置波特率,數據格式,以及中斷允許位等,值得至於的是其USART IN SPI MODE,在SPI模式下的USART的操作跟SPI操作差不多,主要是Clock的設置,然後發送數據還是通過USART的中斷進行
3、I2C
I2C接口是簡單強大的通信接口,只需要兩根雙向總線(時鐘和數據線),SCL和SDA,即可實現一個主機和最多128個從機進行通信。模擬I2C接口的過程:啟動I2C,一般是在SCL為高時將SDA拉低啟動數據發送,SDA只有在SCL為低時才能拉高拉低有效,在SCL為高時拉高拉低SDA只是用於停止啟動I2C通信
相信很多人都對單片機與計算機或者晶片通信時,RXD與TXD如何連接比較困惑。因為在一些電路圖中,有的是直連接法,有的是交叉接法,讓人有點摸不著頭腦。
首先需要明白兩個概念,就是DTE和DCE。DTE是指數據終端設備,典型的DTE就是計算機和單片機。DCE是指數據通信設備,典型的DCE就是MODEM。RS232串口標準中的RXD和TXD都是站在DTE立場上的,而不是DCE。明白了這一點,再講下面的接線方法,就很好理解了。
單片機與計算機進行串口通信時,單片機的RXD接計算機的TXD,單片機的TXD接計算機的RXD。
(1)使用串口直通線。
設計電路時,單片機的RXD連接電路板DB9的TXD,單片機的TXD連接電路板DB9的RXD,具體實現可在232電平轉換晶片處反接。
(2)使用串口交叉線。
設計電路時,因為串口線已做交叉,單片機的RXD連接電路板DB9的RXD,單片機的TXD連接電路板DB9的TXD,均直連即可。
這就可以解釋為什麼有的電路中使用直連接法,有的電路中使用交叉接法,就是因為使用的串口線不同。
通信按照基本類型可以分為並行通信和串行通信。並行通信時數據的各個位同時傳送,可以實現字節為單位通信,但是通信線多佔用資源多,成本高。比如我們前邊用到的 P0 = 0xFE;一次給 P0 的 8 個 IO 口分別賦值,同時進行信號輸出,類似於有 8 個車道同時可以過去 8 輛車一樣,這種形式就是並行的,我們習慣上還稱 P0、P1、P2 和 P3 為 51 單片機的 4 組並行總線。
而串行通信,就如同一條車道,一次只能一輛車過去,如果一個 0xFE 這樣一個字節的數據要傳輸過去的話,假如低位在前高位在後的話,那發送方式就是 0-1-1-1-1-1-1-1-1,一位一位的發送出去的,要發送 8 次才能發送完一個字節。
STC89C52 有兩個引腳是專門用來做 UART 串行通信的,一個是 P3.0 一個是 P3.1,它們還分別有另外的名字叫做 RXD 和 TXD,由它們組成的通信接口就叫做串行接口,簡稱串口。用兩個單片機進行 UART 串口通信,基本的演示圖如圖 11-1 所示。
圖中,GND 表示單片機系統電源的參考地,TXD 是串行發送引腳,RXD 是串行接收引腳。兩個單片機之間要通信,首先電源基準得一樣,所以我們要把兩個單片機的 GND 相互連接起來,然後單片機 1 的 TXD 引腳接到單片機 2 的 RXD 引腳上,即此路為單片機 1 發送而單片機 2 接收的通道,單片機 1 的 RXD 引腳接到單片機 2 的 TXD 引腳上,即此路為單片機 2 發送而單片機 1 接收的通道。這個示意圖就體現了兩個單片機相互收發信息的過程。
當單片機 1 想給單片機 2 發送數據時,比如發送一個 0xE4 這個數據,用二進位形式表示就是 0b11100100,在 UART 通信過程中,是低位先發,高位後發的原則,那麼就讓 TXD首先拉低電平,持續一段時間,發送一位 0,然後繼續拉低,再持續一段時間,又發送了一位 0,然後拉高電平,持續一段時間,發了一位 1„„一直到把 8 位二進位數字 0b11100100全部發送完畢。這裡就涉及到了一個問題,就是持續的這「一段時間」到底是多久?由此便引入了通信中的一個重要概念——波特率,也叫做比特率。
波特率就是發送二進位數據位的速率,習慣上用 baud 表示,即我們發送一位二進位數據的持續時間=1/baud。在通信之前,單片機 1 和單片機 2 首先都要明確的約定好它們之間的通信波特率,必須保持一致,收發雙方才能正常實現通信,這一點大家一定要記清楚。
約定好速度後,我們還要考慮第二個問題,數據什麼時候是起始,什麼時候是結束呢?
不管是提前接收還是延遲接收,數據都會接收錯誤。在 UART 通信的時候,一個字節是 8 位,規定當沒有通信信號發生時,通信線路保持高電平,當要發送數據之前,先發一位 0 表示起始位,然後發送 8 位數據位,數據位是先低後高的順序,數據位發完後再發一位 1 表示停止位。這樣本來要發送一個字節的 8 位數據,而實際上我們一共發送了 10 位,多出來的兩位其中一位起始位,一位停止位。而接收方呢,原本一直保持的高電平,一旦檢測到了一位低電平,那就知道了要開始準備接收數據了,接收到 8 位數據位後,然後檢測到停止位,再準備下一個數據的接收。我們圖示看一下,如圖 11-2 所示。
圖 11-2 串口數據發送示意圖,實際上是一個時域示意圖,就是信號隨著時間變化的對應關係。比如在單片機的發送引腳上,左邊的是先發生的,右邊的是後發生的,數據位的切換時間就是波特率分之一秒,如果能夠理解時域的概念,後邊很多通信的時序圖就很容易理解了。
打開APP閱讀更多精彩內容聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴