一、串行通訊技術概述
串行通訊的通俗定義:
串行通訊的分類
時鐘線、數據線、通過時鐘保持數據同步
異步串口通信
UART
波特率
幀格式
idle 空閑時候保持高電平
在發送數據的時候先發送一位起始位 低電平0
然后數據 0 1 。。。。8 位
P這位是可選的一般在多級通訊的時候需要發送9位數據在第9位時候 是地址位
SP1(必選的一位停止位 是1) 也可以選2位 加一個SP2
之后數據繼續保持空閑高電平
接線圖
RS232電平標準
DB9 接口定義
TXD /RXD /GDN 三根線即可瞞足絕大數應用場合
MAX3232標示的是3.3V的芯片我們用的是5V MAX232 芯片標示錯了 不論引腳封裝還是順序都是完全相同的。
MAX 232 芯片能提供2路串口我們只用一個。由于這個電路圖上是按照DB9定義的走線了所以我們就得用交叉線來跟PC通訊了。
M16的USART特點
USART
寄存器
Three Separate Interrupts (3個 分離 獨立的中斷 ) TX
complete 發送完成中斷
以下是整段中文解釋
通用同步和異步串行接收器合轉發器(USART)是一個高度靈活的串行通訊設備。主要特點為:
噪聲濾波使用起來通信質量相比其他單片機的通信質量大大提升,怎么操作USART呢 ?
首先介紹下有關的寄存器
第一個寄存器I/O
數據寄存器 UDR
share the same I/O address
其實就是發送數據和接受數據寄存器都采樣同一個名稱UDR
寫 就是 發送
第二個寄存器是
UCSRA
第七位和第六位
第5位是 數據寄存器空 ,就是檢測UDR 是否準備好接受新的數據。indicates 表明
the UDRE flag indicates if
第4位:幀錯誤
第1位:雙 發送 速度
this bit only has effect for the asynchronous
operation
第0位:多處理器 communication 通訊 模式
所以這個UCSRA
這個控制狀態寄存器一般用的最多的是第五位
第三個寄存器是控制狀態寄存器B
第七位:RXCIE
如果是使用USART
writing
this bit to one enables interrupt on the
一個USART
接受中斷結束
第六位:TXCIE
別人的解釋:置位后使能TXC中斷,當TXCIE
當然第六位我們一邊用不到的。
第五位:USART
數據寄存器空中斷使能
第3位:發送使能
這兩位非常重要如果要用串行口 這兩位必須使能。取代了通用端口了。
這UCSZ2 位combined
(結合)UCSRC寄存器的
一般我們用8位 。 可以設置成5--9位 當然在AVR 上電復位之后它的寄存器默認設置就是8位所以這我們也不用設置
這個第1位和第0位分別是 :接受數據位8
這兩位僅僅對于數據長度設置成9位的時候才是有作用的他們分別是第9個數據位,所以我們這也是用不到。
這個位選擇開始訪問 UCSRC 或 UBRRH
寄存器。讀UCSRC
估計 UCSRC
默認是置0 :異步操作
these bits enable and set type of parity generation and check .這兩位設置奇偶校驗模式并使能奇偶校驗。
Disabled (禁止)
一般我們不用校驗 所以不用設置這兩位
可以看到 8位是 0 1
而我們去看看UCSRC 寄存器上電復位的初始值為
0 1
第0位:最后一位是 :時鐘極性
這一項僅對同步的時候有用,this bit is used for synchronous mode only. 同步模式我們也用不到所以這一位我們也不用管。
第五個寄存器波特率寄存器
相當于一個12位的二進制數:低8位是UBRRL
解釋:UCSRC寄存器與UBRRH 寄存器公用相同的I/O地址。對該寄存器的訪問,請參見P162 訪問 UBRRH/RCSRC寄存器。
我們計算波特率的時候只要將計算出的值的低8位寫入這個UBRRL就行了。高8位寫入UBRRH
下面的表格就粘貼了太累了!!
下面就講講怎樣使用這個USART、、、
---------------------------------------------------------------
第一步:設置波特率
#define F_CPU 16000000
#define BAUD 9600
UBRRH = (FOSC / BAUD0/16-1)/256
UBRRL = (FPSC/BAUD0/16-1)%6
第二步:使能發送、接受接受完成中斷
UCSRB |= (1<< RXEN)|(1<<TXEN)|(1<<RXCIE);
第三步:使能全局中斷
sei();
第四步:查詢方式發送、中斷方式接受
發送: while(!(UCSRA & (1<< UDRE))); UDR =c;
接受中斷:c = UDR ;
波特率怎么算的呢?在UART 下的時鐘產生 下有波特率發生器下圖
正常我們使用非倍速的時候
equations 方程
一個是波特率的計算公式一個是UBRR值的計算公式
UBRR
UBRR
用宏定義的好處 修改波特率方便。
實際演示下
編譯如下代碼:
然后下載進入,打開串口調試工具
反正我測試接受到的都是0 不知道為什么?
其實9600的波特率每秒最多發送多少字符 是9600 /10 960個字符因此串行速度還是非常快的
這就是串口發送的程序我們通常寫成一個函數
中斷方式使用USART步驟
第一步:設置波特率
#define F_CPU 16000000
#define BAUD 9600
UBRRH = (F_CPU/BAUD/16-1)/256
UBRRL = (F_CPU/BAUD/16-1)%6
第二步:使能發送
UCSRRB |= (1<<RXEN)|(1<<TXEN)|(1<<RICIE);
第三步:使能全局中斷
sei();
第四步:查詢方式發送、中斷方式接受
發送:
UDR =c;
接受中斷:c = UDR;
如果用中斷接受必須在GCC單片機程序 找中斷向量名稱
中斷接受、就講到這里!