并行通信與串行通信
微控制器與外設之間的資料通信,根據連線結構和傳送方式的不同,可以分為兩種:并行通信和串行通信。
并行通信:指資料的各位同時發送或接收,每個資料位使用單獨的一條導線。傳輸速度快、效率高,但需要的資料線較多,成本高。
串行通信:指資料一位接一位地順 序發送或接收。需要的資料線少,成本低,但傳輸速度慢,效率低。
從中我們可以了解到兩種通信方式各有各自的優缺點,在實際應用中根據不同情況而定。
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;
}
}
}
本次介紹就到這了,謝謝大家的觀看!