- 註冊時間
- 2004-10-30
- 最後登錄
- 2025-1-23
- 主題
- 查看
- 積分
- 265
- 閱讀權限
- 50
- 文章
- 219
- 相冊
- 0
- 日誌
- 0
![Rank: 5](static/image/common/star_level3.gif) ![Rank: 5](static/image/common/star_level1.gif)
狀態︰
離線
|
本帖最後由 alphi 於 2011-12-18 16:05 編輯
前言
目前MCU可以與PC介面溝通常見有USB,USART/UART(RS232),GPIB(IEEE 488.1),RS485.其中以USART/ART(RS232)最為常見也最好控制.在Microchip PIC32系列中,最高可以提供高達6組與20Mbps傳輸速率的UART.以下將會使用PIC32 Peripheral Library與Microchip C32 Compiler作為實驗依據
原理
請參考wikipedia,http://zh.wikipedia.org/wiki/串行端口
序列通訊在軟體設定里需要做多項設定,最常見的設定包括鮑率(Baud Rate)、同位檢查(Parity Check)和停止位(Stop Bit)。
鮑率:是指從一裝置發到另一裝置的位元率,即每秒鐘多少位元bits per second (bit/s)。典型的鮑率是300, 1200, 2400, 9600, 115200, 19200等bits。一般通訊兩端裝置都要設為相同的鮑率,但有些裝置也可以設定為自動檢測鮑率。
同位檢查:(Parity:是用來驗證資料的正確性。同位檢查一般不使用,如果使用,那麼既可以做奇同位(Odd Parity)也可以做偶同位(Even Parity)。同
位檢查是透過修改每一發送位元組(也可以限制發送的位元組)來工作的。如果不作同位檢查,那麼資料是不會被改變的。在偶同位中,因為奇偶檢查位會被相應的置1或0(一般是最高位或最低位),所以資料會被改變以使得所有傳送的數位(含字元的各數位和檢查位)中「1」的個數為偶數;在奇同位中,所有傳送的數位(含字元的各數位和檢查位)中「1」的個數為奇數。同位檢查可以用於接受方檢查傳輸是否發送生錯誤——如果某一位元組中「1」的個數發生了錯誤,那麼這個位元組在傳輸中一定有錯誤發生。如果同位檢查是正確的,那麼要麼沒有發生錯誤要麼發生了偶數個的錯誤。如果使用者選擇資料長度為8位元,則因為沒有多餘的位元可被用來作為同位元,因此就叫做「無同位(Non Parity)」。
停止位元:是在每個位元組傳輸之後發送的,它用來幫助接受訊號方硬體重同步。
RS-232在傳送資料時,並不需要另外使用一條傳輸線來傳送同步訊號,就能正確的將資料順利傳送到對方,因此叫做「非同步傳輸」,簡稱UART(Universal Asynchronous Receiver Transmitter),不過必須在每一筆資料的前後都加上同步訊號,把同步訊號與資料混和之後,使用同一條傳輸線來傳輸。比如資料11001010被傳輸時,資料的前後就需加入Start(Low)以及Stop(High)等兩個位元,值得注意的是,Start訊號固定為一個位元,但Stop停止位元則可以是1、1.5或者是2位元,由使用RS-232的傳送與接收兩方面自行選擇,但需注意傳送與接受兩者的選擇必須一致。 在序列通訊軟體設定中D/P/S是常規的符號表示。8/N/1(非常普遍)表明8bit資料,沒有同位檢查,1bit停止位。資料位可以設定為5、6、7或者8位元(不可以大於8或小於5),同位檢查位可以設定為無(N)、奇(O)或者偶(E),同位檢查可以使用資料中的位元(bit),所以8/E/1就表示一共8位元資料位,其中一位用來做同位檢查位。停止位可以是1、1.5或者2位的(1.5是用在波特率為60wpm的電傳打字機上的)。
流量控制:當需要發送握手訊號或資料完整性檢測時需要制定其他設定。公用的組合有RTS/CTS, DTR/DSR或者XON/XOFF(實際中不使用連結器接腳而在資料流內插入特殊字元)。
接受方把XON/XOFF訊號發給發送方來控制發送方何時發送資料,這些訊號是與發送資料的傳輸方向相反的。XON訊號告訴發送方接受方準備好接受更多的資料,XOFF訊號告訴發送方停止發送資料直到知道接受方再次準備好。XON/XOFF一般不贊成使用,推薦用RTS/CTS控制流來代替它們。 XON/XOFF是一種工作在終端間的帶內方法,但是必須兩端都支援這個協議,而且在突然啟動的時候會有混淆的可能。 XON/XOFF可以工作於3線的介面。RTS/CTS最初是設計為電傳打字機和數據機半雙工協作通訊的,每次它只能一方數據機發送資料。終端必須發送請求發送訊號然後等到數據機回應清除發送訊號。儘管RTS/CTS是透過硬體達到握手,但它有自己的優勢。
實驗- #include <plib.h> // Peripheral Library
- /*
- MCU: Microchip PIC32MX795L
- Compiler: Microchip MPLAB C32 V2.01
- EVB: Explorer 16
- Author: Alphi 2011/12/18
- 編譯器參數
- SYSCLK = 80 MHz (8MHz Crystal/ FPLLIDIV * FPLLMUL / FPLLODIV)
- PBCLK = 20 MHz
- Primary Osc w/PLL (XT+,HS+,EC+PLL)
- WDT OFF
- */
- #pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF
- #pragma config POSCMOD = HS, FNOSC = PRIPLL, FPBDIV = DIV_4
- //取得核心頻率
- #define GetSystemClock() (80000000ul)
- //取得周邊匯流排頻率
- #define GetPeripheralClock() (GetSystemClock()/(1 << OSCCONbits.PBDIV))
- //取得指令頻率
- #define GetInstructionClock() (GetSystemClock())
- //設定UART2 Baudrate為115200bps
- #define UART2_BAUDRATE (115200)
- //UART2初始化
- void UART2_Init(void);
- //發送一個字元
- void PutCharacter(const char character);
- //程式進入點
- int main(void)
- {
- //設定系統參數
- SYSTEMConfig(GetSystemClock(), SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
- //設定UART2相關參數
- UART2_Init();
- //設定為多中斷模式
- INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);
- //啟用中斷
- INTEnableInterrupts();
- while (1);
- return 0;
- }
- //初始化UART
- void UART2_Init(void)
- {
- // Explorer-16 開發版使用 UART2 連接到 PC.
- //設定UART2 啟動TX/RX功能
- UARTConfigure(UART2, UART_ENABLE_PINS_TX_RX_ONLY);
-
- //設定UART2 FIFO模式與中斷模式在RX FIFO不為空時或者TX FIFO沒有滿發生中斷
- UARTSetFifoMode(UART2, UART_INTERRUPT_ON_TX_NOT_FULL | UART_INTERRUPT_ON_RX_NOT_EMPTY);
-
- //設定線上控制:資料傳輸長度為8bit,停止位元為1,無同位元檢查碼
- UARTSetLineControl(UART2, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);
-
- //設定UART2傳輸速率為115200
- UARTSetDataRate(UART2, GetPeripheralClock(), UART2_BAUDRATE);
- //啟用UART2相關功能
- UARTEnable(UART2, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));
- //設定UART2 RX接收中斷致能
- INTEnable(INT_SOURCE_UART_RX(UART2), INT_ENABLED);
-
- //設定主要中斷優先權為2
- INTSetVectorPriority(INT_VECTOR_UART(UART2), INT_PRIORITY_LEVEL_2);
-
- //設定次中斷優先權為0
- INTSetVectorSubPriority(INT_VECTOR_UART(UART2), INT_SUB_PRIORITY_LEVEL_0);
- }
- //發送一個字元
- void PutCharacter(const char character)
- {
- //等待可以發送
- while (!UARTTransmitterIsReady(UART2))
- ;
- //發送一個Byte
- UARTSendDataByte(UART2, character);
- //等待發送完成
- while (!UARTTransmissionHasCompleted(UART2))
- ;
- }
- // UART2 中斷處理函式
- void __ISR(_UART2_VECTOR, IPL2) UART2Handler(void)
- {
- // 是否為RX中斷
- if (INTGetFlag(INT_SOURCE_UART_RX(UART2)))
- {
- // 發送一個與接收一樣的字元
- PutCharacter(UARTGetDataByte(UART2));
- // 清除中斷
- INTClearFlag(INT_SOURCE_UART_RX(UART2));
- }
- //是否為TX中斷
- if ( INTGetFlag(INT_SOURCE_UART_TX(UART2)) )
- {
- //清除中斷
- INTClearFlag(INT_SOURCE_UART_TX(UART2));
- }
- }
複製代碼 結論
從上述程式碼可以知道在開發PIC32 UART時.使用PLIB將會非常簡易與方便 |
-
總評分: 威望 + 1
查看全部評分
|