通用異步收發傳輸器(Universal Asynchronous Receiver/Transmitter),通常稱作UART。
串口是“串行接口”的簡稱,即采用串行通信方式的接口。串行通信將數據字節分成一位一位的形式在一條數據線上逐個傳送,其特點是通信線路簡單,但傳輸速度較慢。
UART在發送數據時,將並行數據轉換成串行數據來傳輸;
UART在接收數據時,將接收到的串行數據轉換成並行數據。
(1)同步串行通信(Synchronous serial communication),I2C、SPI等有時鐘信號的協議,都屬於這種通信方式。
(2)異步串行通信(Asynchronous serial communication),串口通信,就是這種通信方式。
在設置好數據格式及傳輸速率之後,UART負責完成數據的串並轉換,而信號的傳輸則由外部驅動電路實現。電信號的傳輸過程有著不同的電平標準和接口規范,針對異步串行通信的接口標準有RS232、RS422、RS485 等,它們定義瞭接口不同的電氣特性,如 RS-232 是單端輸入輸出,而 RS-422/485為差分輸入輸出等。
COM口是指針對串行通信協議的一種端口,是PC上異步串行通信口的簡寫,大部分為9針孔D型。COM口裡分RS232,RS422和RS485,傳輸功能依次遞增。
當單片機 1 想給單片機 2 發送數據時,比如發送一個 0xE4 這個數據,用二進制形式表 示就是 0b11100100,在 UART 通信過程中,是低位先發,高位後發的原則,那麼就讓 TXD 首先拉低電平,持續一段時間,發送一位 0,然後繼續拉低,再持續一段時間,又發送瞭一 位 0,然後拉高電平,持續一段時間,發瞭一位 1……一直到把 8 位二進制數字 0b11100100 全部發送完畢。這裡就涉及到瞭一個問題,就是持續的這“一段時間”到底是多久?由此便引入瞭通信中的一個重要概念——波特率。
波特率就是發送二進制數據位的速率,習慣上用 baud 表示,即發送一位二進制數據的持續時間=1/baud。在通信之前,單片機 1 和單片機 2 首先都要明確的約定好它們之間的通 信波特率,必須保持一致,收發雙方才能正常實現通信。
在 UART 通信的時候,一個字節是 8 位,規定當沒有通信信號發生時,通信線路保持高電平,當要發送數據之前,先發一位 0 表示起始位,然後發送 8 位數據位,數據位是先低後高的順序,數據位發完後再發一位 1 表示停止位。這樣本來要發送一個字節的 8 位數據,而實際上我們一共發送瞭 10 位,多出來的兩位其中一位起始位,一位停止位。而接收方呢,原本一直保持的高電平,一旦檢測到瞭一位低電平,那就知道瞭要開始準備接收數據瞭,接收到 8 位數據位後,然後檢測到停止位,再準備下一個數據的接收。如下圖所示:
在CPU與被控IC之間、IC與IC之間進行雙向傳送,高速IIC總線一般可達400kbps以上。
lIC協議中通過設備地址來尋址、選中總線上的某個設備並與其進行通訊。而SPI協議中沒有設備地址,它使用NSS信號線來尋址,當主機要選擇從設備時,把該從設備的NSS信號線設置為低電平,該從設備即被選中,即片選有效,接著主機開始與被選中的從設備進行SPI通訊。所以SPI通訊以NSS線置低電平為開始信號,以 NSS線被拉高作為結束信號。
兩線式串行總線,由數據線SDA和時鐘SCL構成,可發送或接受數據。
空閑狀態:兩個信號線均處於高電平。
起始信號:當SCL為高期間, SDA由高到低的跳變。
停止信號:當SCL為高期間, SDA由低到高的跳變。
應答信號:發送器每發送一個字節,就在時鐘脈沖9期間釋放數據線,由接收器反饋一個應答信號。應答信號為低電平時,規定為有效應答位(ACK簡稱應答位),表示接收器已經成功地接收瞭該字節,應答信號為高電平時,規定為非應答位(NACK), 一般表示接收器接收該字節沒有成功。對於反饋有效應答位ACK的要求是,接收器在第9個時鐘脈沖之前的低電平期間將SDA線拉低,並且確保在該時鐘的高電平期間為穩定的低電平。如果接收器是主控器,則在它收到最後一個字節後,發送一個NACK信號,以通知被控發送器結束數據發送,並釋放SDA線,以便主控接收器發送一個停止信號P。
數據有效性:IIC總線進行數據傳送時,時鐘信號為高電平期間,數據線上的數據必須保持穩定,隻有在時鐘線上的信號為低電平期間,數據線上的高電平或低電平狀態才允許變化。
0201efda3d5a1262c3b2b6e8bb54e3a9
I2C中心以啟動信號START來掌管總線,以停止信號STOP來釋放總線;啟動信號START後緊接著發送一個地址字節,其中7位為被控器件的地址碼,一位為讀/寫控制位R/W,R/W位為0表示由主控向被控器件寫數據,R/W為1表示由主控向被控器件讀數據;當被控器件檢測到收到的地址與自己的地址相同時,在第9個時鐘期間反饋應答信號。
在I2C總線上傳送的每一位數據都有一個時鐘脈沖相對應( 或同步控制),即在SCL 串行時鐘的配合下, 在SDA上逐位地串行傳送每一位數據。數據位的傳輸是邊沿觸發。
所有接到I2C總線設備上的串行數據SDA都接到總線的SDA上,各設備的時鐘線SCL接到總線的SCL上。I2C總線上的每個設備都自己一個唯一的地址,來確保不同設備之間訪問的準確性。
IIC總線最多可以掛多少個設備由IIC地址決定,8位地址,減去1位廣播地址,是7位地址,2^7=128,但是地址0x00不用,那就是127個地址, 所以理論上可以掛127個從器件。
I2C總線理論上掛接127個器件,但是在實際使用中,通常不會超過8個,一般六七個就到頭瞭,I2C總線的驅動能力有限,太多的器件總線驅動不起來。
我們知道IIC的所有設備是接在一根總線上的,那麼我們進行通信的時候往往隻是幾個設備進行通信,那麼這時候其餘的空閑設備可能會受到總線幹擾,或者幹擾到總線,怎麼辦呢?
為瞭避免總線信號的混亂,IIC的空閑狀態隻能有外部上拉, 而此時空閑設備被拉到瞭高阻態,也就是相當於斷路, 整個IIC總線隻有開啟瞭的設備才會正常進行通信,而不會幹擾到其他設備。
多主機會產生總線裁決問題,當多個主機同時想占用總線時,企圖啟動總線傳輸數據,就叫做總線競爭。I2C通過總線仲裁,以決定哪臺主機控制總線。
SDA線的仲裁也是建立在總線具有線“與”邏輯功能的原理上的。節點在發送1位數據後,比較總線上所呈現的數據與自己發送的是否一致,是,繼續發送;否則,退出競爭。SDA線的仲裁可以保證I2C總線系統在多個主節點同時企圖控制總線時通信正常進行並且數據不丟失。總線系統通過仲裁隻允許一個主節點可以繼續占據總線。
設備地址標識外設在總線上的唯一性,每一個外設都有唯一的設備地址,設備地址由原理圖和芯片手冊共同定義!CPU通過設備地址來訪問到I2C總線上的某個外設!
通常我們為瞭方便把IIC設備分為主設備和從設備,基本上誰控制時鐘線(即控制SCL的電平高低變換)誰就是主設備。
IIC主設備功能:主要產生時鐘,產生起始信號和停止信號。
IIC從設備功能:可編程的IIC地址檢測,停止位檢測。
IIC的一個優點是它支持多主控(multimastering), 其中任何一個能夠進行發送和接收的設備都可以成為主總線。一個主控能夠控制信號的傳輸和時鐘頻率。當然,在任何時間點上隻能有一個主控。
主要用於近距離低速的芯片之間的通訊,成百上千米遠距離的通訊不行,抗幹擾能力差,它的成本低,結構簡單。
目前主要用於服務管理。 這包括各個組件狀態的通信。 例如,管理員可以查詢各個組件以管理系統配置,並瞭解組件(如電源和系統風扇)的功能狀態。 可隨時監控內存、硬盤、網絡和系統溫度等多個參數,提高系統安全性,便於管理。 IIC數據傳輸速度有標準模式100 kbps、快速模式400 kbps、高速模式3.4 Mbps,其他變種實現瞭低速模式10 kbps、高速模式1 Mbps。
每個時鐘周期傳輸一位數據,因此數據傳輸的速度由時鐘信號的頻率決定,SPI 通信始終由主機發起,因為主機配置並生成時鐘信號。
SPI總線的傳輸速率可以達到幾MByte/s且這不是固定的,一般受到以下幾個因素影響:
1)SPI的最大時鐘頻率(一般情況下,其最大時鐘頻率為系統時鐘頻率的1/2);
2)CPU處理SPI數據的能力;
3)輸出端驅動能力(PCB所允許的最大信號傳輸速率)等,其最大速率主要看主從器件控制器的性能。
比 I2C 更高的數據傳輸速率(幾乎是 I2C 的兩倍) 獨立的 MISO 和 MOSI 線,因此可以同時發送和接收數據。
MISO主設備數據輸入, 從設備數據輸出。
MOSI主設備數據輸出, 從設備數據輸入。
SCLK時鐘信號,由主設備產生。
CS從設備片選信號(是否工作),由主設備控制。
在圖中的標號1處,NSS信號線由高變低,是SPI通訊的起始信號。NSS是每個從機各自獨占的信號線,當從機檢在自己的NSS線檢測到起始信號後,就知道自己被主機選中瞭,開始準備與主機通訊。在圖中的標號處,NSS信號由低變高,是SPI通訊的停止信號,表示本次通訊結束,從機的選中狀態被取消。
SPI使用MOSI及 MISO信號線來傳輸數據,使用SCK信號線進行數據同步。MOSI及 MISO數據線在SCK的每個時鐘周期傳輸一位數據,且數據輸入輸出是同時進行的。數據傳輸時,MSB先行(高位先行)或LSB(低位先行)先行並沒有作硬性規定,但要保證兩個SPI通訊設備之間使用同樣的協定,一般都會采用上圖中的MSR先行(高位先行)模式。
觀察圖中的2345標號處,MOSI 及 MISO的數據在SCK的上升沿期間變化輸出,在SCK的下降沿時被采樣。即在SCK的下降沿時刻,MOSI及 MISO的數據有效,高電平時表示數據"1”,為低電平時表示數據"0"。在其它時刻,數據無效,MOSI及 MISO為下一次表示數據做準備。
SPI每次數據傳輸可以8位或16位為單位,每次傳輸的單位數不受限制。
數據幀格式
串行同行數據傳輸分為 MSB 和 LSB,也就是最高有效位在前,還是最低有效位在前。(註:最左邊的比特位即為最高有效位)。
比如傳輸一個字節:0x95(1001 0101)。
43ab75786b72b4acf370e37b8a723740
如果按照MSB(高位在前),則發送順序:1001 0101。
如果按照LSB(低位在前),則發送順序反過來:1010 1001。
上面講述的圖中的時序隻是SPI中的其中一種通訊模式,SPI一共有四種通訊模式,它們的主要區別是∶總線空閑時SCK的時鐘狀態以及數據采樣時刻。為方便說明,在此引入"時鐘極性CPOL"和“時鐘相位CPHA"的概念。
CPOL時鐘極性和CPHA時鐘相位的組合選擇數據捕捉的時鐘邊沿。
SPI_CR寄存器CPOL和CPHA位,能夠組合成四種可能的時序關系。
3.1 CPOL就是決定SCLK這個時鐘信號線,在沒有數據傳輸的時候的電平狀態。
CPOL(時鐘極性)=0:空閑狀態時,SCLK保持低電平
CPOL=1:空閑狀態時,SCLK保持高電平
3.2 CPHA就是決定數據位傳輸是從第一個時鐘(SCLK)邊沿開始,還是第二個從二個時鐘(SCLK)邊沿開始。
CPHA=0:數據從第一個時鐘(SLCK)邊沿開始采集
CPHA=1:數據從第二個時鐘(SLCK)邊沿開始采集
3.3 CPOL和CPHA合體就形成瞭SPI四種模式。
如果CPHA(時鐘相位)位置'1',SCK時鐘的第二個邊沿(CPOL位為0時就是下降沿,CPOL位為'1'時就是上升沿)進行數據位的采樣,數據在第二個時鐘邊沿被鎖存。
如果CPHA位被清'0',SCK時鐘的第一邊沿(CPOL位為'0'時就是下降沿,CPOL位為'1'時就是上升沿)進行數據位采樣,數據在第一個時鐘邊沿被鎖存。
1、SPI1_SCK時鐘引腳始終無法輸出時鐘信號
分析原因:SPI有些引腳對應的是特殊功能的引腳,以STM32F103C8T6為例,比如:PB3(SPI1_SCK)對應的是 JTDO,如果不配置則默認這個引腳的功能就是 JTDO的功能。芯片上電默認該引腳為調試引腳,電平為高電平,導致芯片的SPI1_SCK是無法拉低的。
找到芯片的復用重映射和調試I/O配置寄存器(AFIO_MAPR)的24:26位,可以看到相關解釋說明:即通過修改這3位的配置可以關閉調試引腳配置,釋放相應的IO口。實際使用中通過開啟AFIO輔助時鐘,將SWJ_CFG配置為2或者3即可當做普通IO使用,但如想作為SPI1時鐘引腳,還需在MAPR寄存器開啟SPI1的重映射!
f436524bd844d3286d66d772f760872a
開啟SPI1的重映射才會有時鐘信號輸出!
1. 使能GPIO時鐘(重映射後的IO);
2. 使能功能外設時鐘;
3. 使能AFIO時鐘。重映射必須使能AFIO時鐘:
RCC->APB2ENR |= 1<<0; //開啟AFIO輔助時鐘
RCCAPB2PeriphClockCmd(RCCAPB2PeriphAFlO,ENABLE);
上一篇