STM32的資料傳輸外設:USART、I2C、SPI三種常見介面的學習
一、USART序列介面
序列介面分為非同步序列介面和同步序列介面兩種,其中非同步序列介面統稱為通用非同步收發器介面UART,具有同步功能的UART(包含時鐘訊號SCLK)稱為通用同步/非同步收發器介面USART。
USART的電氣特性標準包括RS-232C、RS422、RS423和RS485等,其中RS-232C是最常見的序列通訊介面(桌上型電腦的顯示器與主機的連線線好像就是RS232吧)
RS232有9個引腳,當然最常用的只有三個:RXD(接收資料)、TXD(傳送資料)、GND(用來共地);而RS232的主要指標有兩個:資料速率和資料格式。資料速率就是我們設定的波特率,而資料格式便是我們設定的起始位、資料位、校驗位、停止位;
因為UART是掛載在APB1上的,所以我們使用其傳輸資料的時候,要先開啟相應的時鐘。但是不要忘了,UART是需要用到GPIO介面的,所以我們還需要開啟GPIO的時鐘,並且先初始化GPIO介面,再初始化USART。
至於USART使用哪些GPIO引腳,我就不贅述了,網上隨便一查就能知道。
當我們程式需要對USART進行操作的時候,我們若通過暫存器進行操作的話,那麼通過查詢USART暫存器的表便可以慢慢書寫下來,而通過庫函式的話,通過正點原子的例程也可以很清楚的學習到。
我們只需要知道在我們的主函式裡先使用初始化函式,將USART初始化完成,然後接收資料的話通過串列埠中斷來完成,根據專案設定的接收結束標誌,把接收結束標誌位置1,在主函式中通過查詢該標誌位的真假來完成接收。
而傳送的話,我們既可以用重定向printf來發送資料(但是我不建議實時系統或者系統資源比較小的時候使用,因為該方法會使程式耗費的資源大大增加);也可以通過自己寫傳送函式,通過傳入字串指標,通過對指標的查詢,來逐位元組輸出到USART->DR,再查詢USART->SR來判斷是否傳送成功,從而傳送下一位元組。
二、I2C內部整合匯流排介面
內部積體電路匯流排介面I2C是通訊控制領域廣泛採用的一種標準,連線在總線上的每一個裝置都有唯一的7/10位地址。
I2C採用一根雙向序列資料線SDA和一根雙向序列時鐘線SCL實現主/從裝置間的多主序列通訊。
而I2C所要學習的也正是其各個時期的時序以及資料線的高低電平變動:
I2C匯流排在傳輸資料的過程中一共有三種訊號:開始訊號、結束訊號、應答訊號。
開始訊號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳輸資料。
結束訊號:SCL為高電平時,SDA由低電平向高電平跳變,結束傳輸資料。
應答訊號:接收資料的IC在接收到8bit的資料後,向傳送資料的IC發出一個特定的低電平脈衝,表示已經接收到資料。例如CPU向受控單元發出一個訊號後,等待受控單元發出一個應答訊號,CPU接收到應答訊號則再根據實際情況決定是否傳送下一個訊號;若沒有接收到應答訊號,則可以判斷受控單元出現了故障。
這三種訊號裡,起始訊號是必須需要的,而結束訊號和應答訊號都可以視情況不要。
而使用I2C的時候肯定是要先初始化,初始化的時候我們先初始化GPIO的時鐘,然後根據時序圖來寫出起始訊號,結束訊號與應答訊號,而向從IC寫資料與讀資料,這些函式在正點原子裡都有寫,我就不佔篇幅贅述啦。
三、SPI序列裝置介面
SPI在工業控制領域的應用也可以說是非常多的,SPI可以實現主裝置或從裝置協議,並且它是一種典型的全雙工資料傳輸方式,其傳輸的正確性通過序列時鐘SCK來保證。當配置為主裝置時,SPI可以連線多達16個獨立的從裝置,傳送資料和接收資料暫存器的寬度可以設定為8位或者16位。
SPI使用四根線來實現序列通訊:兩根資料線、一根時鐘線、一根控制線
主出從入MOSI:主裝置輸出資料,從裝置輸入資料
主入從出MISO:主裝置輸入資料,從裝置輸出資料
序列時鐘SCK:主裝置輸出,從裝置輸入,用於同步資料位
從裝置選擇NSS:主裝置輸出,從裝置輸入,用來選擇哪一個從裝置與主機通訊。
並且SPI的介面時序也由兩個很重要的引數決定:時鐘極性與時鐘相位
時鐘極性為0時初始電平是低電平,為1時初始電平是高電平;時鐘相位為0時第一個邊沿採集資料,為1時第二個邊沿採集資料。
由於時間原因,我在這個篇幅裡無法完全說明SPI的使用方法,我會在找個時間更新此次的部落格,或者另開一個帖子,歡迎大家前來指正。謝謝啦,嘿嘿