並行通信與串行通信
微控制器與外設之間的數據通信,根據連線結構和傳送方式的不同,可以分爲兩種:並行通信和串行通信。
並行通信:指數據的各位同時發送或接收,每個數據位使用單獨的一條導線。傳輸速度快、效率高,但需要的數據線較多,成本高。
串行通信:指數據一位接一位地順 序發送或接收。需要的數據線少,成本低,但傳輸速度慢,效率低。
從中我們可以瞭解到兩種通信方式各有各自的優缺點,在實際應用中根據不同情況而定。
CC2530的串口通信模塊
CC2530有兩個串行通信接口USART0和USART1,並且它們都能夠分別運行於異步UART模式或者同步SPI模式。具體用於那種模式通過設置U0CSR寄存器來選擇。
兩個USART接口具有相同的功能,且它們有對應的外部I/O引腳映射關係。通過
PERCFG寄存器設置。
映射關係:
位置1:RX0 — P0_2 TX0 — P0_3 RX1 — P0_5 TX1 — P0_4
位置2:RX0 — P1_4 TX0 — P1_5 RX1 — P1_7 TX1 — P1_6
對每個USART串口通信編程,本質是設置相關的5個寄存器:
<1> UxCSR: USARTx的控制和狀態寄存器。
<2> UxUCR: USARTx的UART控制寄存器。
<3> UxGCR: USARTx的通用控制寄存器。
<4> UxDBUF:USARTx的接收/發送數據緩衝寄存器。
<5> UxBAUD:USARTx的波特率控制寄存器。
相關寄存器介紹
接下來的代碼部分會涉及到一些寄存器的各個位作用
CLKCONCMD:時鐘頻率控制寄存器。
D7位爲32KHZ時間振盪器選擇,,0爲32KRC震盪,1爲32K晶振。默認爲1。
D6位爲系統時鐘選擇。0爲32M晶振,1爲16M RC震盪。當D7位爲0時D6必須爲1。
D5~D3爲定時器輸出標記。000爲32MHZ,001爲16MHZ,010爲8MHZ,011爲4MHZ,100爲2MHZ,101爲 1MHZ,110爲500KHZ,111爲250KHZ。默認爲001。需要注意的是:當D6爲1時,定時器頻率最高可採用頻率爲16MHZ。
D2~D0:系統主時鐘選擇:000爲32MHZ,001爲16MHZ,010爲8MHZ,011爲4MHZ,100爲2MHZ,101爲1MHZ,110爲500KHZ,111爲250KHZ。當D6爲1時,系統主時鐘最高可採用頻率爲16MHZ。
CLKCONSTA:時間頻率狀態寄存器。
D7位爲當前32KHZ時間振盪器頻率。0爲32KRC震盪,1爲32K晶振。
D6位爲當前系統時鐘選擇。0爲32M晶振,1爲16M RC震盪。
D5~D3爲當前定時器輸出標記。000爲32MHZ,001爲16MHZ,010爲8MHZ,011爲4MHZ,100爲2MHZ,101爲 1MHZ,110爲500KHZ,111爲250KHZ。
D2~D0爲當前系統主時鐘。000爲32MHZ,001爲16MHZ,010爲8MHZ,011爲4MHZ,100爲2MHZ,101爲1MHZ,110爲500KHZ,111爲250KHZ。
PERCFG:設置部分外設的I/O位置,0爲默認I位置1,1爲默認位置2
U0CSR:USART0控制與狀態;
D7爲工作模式選擇,0爲SPI模式,1爲USART模式
D6爲UART接收器使能,0爲禁用接收器,1爲接收器使能。
D5爲SPI主/從模式選擇,0爲SPI主模式,1爲SPI從模式。
D4爲幀錯誤檢測狀態,0爲無錯誤,1爲出現出錯。
D3爲奇偶錯誤檢測,0爲無錯誤出現,1爲出現奇偶校驗錯誤。
D2爲字節接收狀態,0爲沒有收到字節,1爲準備好接收字節。
D1爲字節傳送狀態,0爲字節沒有被傳送,1爲寫到數據緩衝區的字節已經被髮送。
D0爲USART接收/傳送主動狀態,0爲USART空閒,1爲USART忙碌。
U0GCR:USART0通用控制寄存器;
D7爲SPI時鐘極性:0爲負時鐘極性,1爲正時鐘極性;
D6爲SPI時鐘相位:
D5爲傳送爲順序:0爲最低有效位先傳送,1爲最高有效位先傳送。
D4~D0爲波特率設置:
對於波特率設置我們這還有介紹:
CC2530的波特率由BAUD_E和BAUD_M共同決定:
F爲微控制器的系統時鐘頻率:16MHz或32MHz。
在TI公司提供的數據手冊中,給出了32MHz系統時鐘下各常用波特率的參數值,由計算公式亦不難得出16MHz系統時鐘下對應的參數值。
UART口與計算機的COM口連接
先認識兩種電平:TTL電平和RS232電平。
TTL電平: 邏輯0----小於0.8V 邏輯1----大於2.4V。
RS232電平: 邏輯0----5~15V 邏輯1---- -5~-15V。
計算機的串行通信接口是RS-232的標準接口,而CC2530單片機的UART接口則是TTL電平,兩者的電氣規範不一致,所以要完成兩者之間的數據通信,就需要藉助接口芯片在兩者之間進行電平轉換,常用的有MAX232芯片。
注意:DB9接口中,公頭和母頭的排列順序是不同的。
串口小實驗
這次小實驗做的是CC2530串口0與串口助手連接,在32HMz的內部系統時鐘下產生19200的波特率。從串口助手發送一個字符或者一個字符串到開發板,開發板又將收到的字符或者字符串回送到串口助手上。
設計思路:
<1> 初始化USART0口的各個寄存器
<2> 設計字節發送函數
<3> 設計接收完成中斷服務函數
<4> 解析接收到的數據並執行相對應的操作
串口0初始化函數
選擇外設的引腳映射位置,並將對應的引腳設置爲外設功能 ,然後對波特率、控制寄存器和中斷的相關控制位進行設置。
void initUART(void)
{
CLKCONCMD &= ~0x40; //設置系統時鐘源爲32MHz晶振
while(CLKCONSTA & 0x40);//等待晶振穩定
CLKCONCMD &= ~0x47;//設置系統主時鐘頻率爲32MHz
PERCFG=0x00; //選擇位置1即P0_2,P0_3
P0SEL=0x0c; //將P0_2,P0_3口設置爲外設功能
U0CSR |= 0xc0; //串口設置爲UART異步通信模式並使能接收器
U0GCR |=9;
U0BAUD |=59; //設置波特率爲19200
UTX0IF = 0; //UART0 TX中斷標誌初始置位1
URX0IF = 0; //UART0 RX中斷標誌初始置位1
//U0CSR |=0x40; //允許接收
//IEN0 |=0x84;//開總中斷,接收中斷
URX0IE = 1;//使能URAT0接收中斷
EA = 1; //使能總中斷
}
數據接收中斷服務函數
#pragma vector =URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; //清中斷標誌
temp = U0DBUF;
RxFlag=1;//接收標誌置爲1
}
發送字節函數
void UartTX_Send_char(uchar Data)
{
U0DBUF = Data;
while(UTX0IF==0); //當發送成功標誌位置爲1後退出等待
UTX0IF=0; //軟件清除發送標誌
}
實驗源代碼
#include "iocc2530.h"
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
//函數申明
void initUART(void);//初始化串口
void UartTX_Send_char(uchar Data);//發送字符
uchar temp;
uchar RxFlag=0;
//串口初始化
void initUART(void)
{
CLKCONCMD &= ~0x40; //設置系統時鐘源爲32MHz晶振
while(CLKCONSTA & 0x40);//等待晶振穩定
CLKCONCMD &= ~0x47;//設置系統主時鐘頻率爲32MHz
PERCFG=0x00; //選擇位置1即P0_2,P0_3
P0SEL=0x3c; //將P0_2,P0_3口設置爲外設功能
U0CSR |= 0xc0; //串口設置爲UART異步通信模式並使能接收器
U0GCR |=9;
U0BAUD |=59; //設置波特率爲19200
UTX0IF = 0; //UART0 TX中斷標誌初始置位1
URX0IF = 0; //UART0 RX中斷標誌初始置位1
//U0CSR |=0x40; //允許接收
//IEN0 |=0x84;//開總中斷,接收中斷
URX0IE = 1;//使能URAT0接收中斷
EA = 1; //使能總中斷
}
void UartTX_Send_char(uchar Data)
{
U0DBUF = Data;
while(UTX0IF==0); //當發送成功標誌位置爲1後退出等待
UTX0IF=0; //軟件清除發送標誌
}
//串口中斷函數
#pragma vector =URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; //清中斷標誌
temp = U0DBUF;
RxFlag=1;//接收標誌置爲1
}
void main(void)
{
initUART();
while(1)
{
if(RxFlag==1)
{
UartTX_Send_char(temp);
RxFlag=0;
}
}
}
本次介紹就到這了,謝謝大家的觀看!