一、并行通信與串行通信
微控制器與外設之間的數據通信,根據連線結構和傳送方式的不同,可以分為兩種:并行通信和串行通信。
并行通信:指數據的各位同時發送或接收,每個數據位使用單獨的一條導線。傳輸速度快、效率高,但需要的數據線較多,成本高。
串行通信:指數據一位接一位地順 序發送或接收。需要的數據線少,成本低,但傳輸速度慢,效率低。
二、CC2530的串口通信模塊
CC2530有兩個串行通信接口USART0和USART1,它們能夠分別運行于異步UART模式或者同步SPI模式。
兩個USART接口具有相同的功能,通過PERCFG寄存器可以設置兩個USART接口對應外部I/O引腳的映射關系:
位置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的接收/發送數據緩沖寄存器。
<4> UxBAUD:USARTx的波特率控制寄存器。
三、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接口中,公頭和母頭的排列順序是不同的。
四、原理圖數據手冊分析
配置串口的步驟
五、代碼示例
(1) 示例1: 編寫串口初始化函數,實現串口字符串發送 (CPU頻率在32MHZ下,波特率的為115200)
#include < ioCC2530.h >
#include < string.h >
?
//定義LED燈的端口
#define LED1 P1_2
#define LED2 P1_3
?
//定義KEY按鍵的端口
#define KEY1 P1_0 //定義按鍵為P1_0口控制
#define KEY2 P1_1 //定義按鍵為P1_1口控制
?
/*
函數功能:LED燈IO口初始化
硬件連接:LED1-- >P1_2 , LED2-- >P1_3
*/
void LED_Init(void)
{
P1DIR |=0x3< 2; //配置P1_2、P1_3為輸出模式
LED1 = 1;
LED2 = 1;
}
?
/*
函數功能:按鍵IO口初始化
硬件連接:KEY1-- >P1_0 KEY2-- >P1_1
*/
void KEY_Init(void)
{
P1SEL&=~(0x3< 0); //配置P1_0,P1_1處于通用GPIO口模式
P1DIR&=~(0x3< 0); //配置P1_0,P1_1為輸入模式
P1INP|= 0x3< 0; //上拉
}
?
?
void delay10ms(void) //誤差 0us
{
unsigned char a,b,c;
for(c=193;c >0;c--)
for(b=118;b >0;b--)
for(a=2;a >0;a--);
}
?
?
/*
函數功能:按鍵掃描
返 回 值:按下的按鍵值
*/
unsigned char Key_Scan(void)
{
static unsigned char stat=1;
if((KEY1==0||KEY2==0)&&stat)
{
stat=0;
delay10ms();
if(KEY1==0)return 1;
if(KEY2==0)return 2;
}
else
{
if(KEY1&&KEY2)stat=1;
}
return 0;
}
?
/*
函數功能:串口0初始化
*/
void Init_Uart0(void)
{
PERCFG&=~(1< 0); //串口0的引腳映射到位置1,即P0_2和P0_3
P0SEL|=0x3< 2; //將P0_2和P0_3端口設置成外設功能
U0BAUD = 216; //32MHz的系統時鐘產生115200BPS的波特率
U0GCR&=~(0x1F< 0);//清空波特率指數
U0GCR|=11< 0; //32MHz的系統時鐘產生115200BPS的波特率
U0UCR |= 0x80; //禁止流控,8位數據,清除緩沖器
U0CSR |= 0x3< 6; //選擇UART模式,使能接收器
}
?
?
/*
函數功能:UART0發送字符串函數
*/
void UR0SendString(char *str,unsigned int len)
{
int