車乾的ZigBee學習筆記四——串口通信

一、串口配置步驟

1、相應IO配置成片上外設功能
2、配置相應串口的控制和狀態寄存器
3、波特率

二、串口發送字符串

1、相關原理圖

在這裏插入圖片描述
P0_2、P0_3配置爲外設功能時,P0_2爲RX,P0_3爲TX
USART0和USART1是串行通信接口,能夠分別運行於異步UART模式或者同步SPI模式

2、相關寄存器 UXCSR UXGCR UXBUF UXBAUD CLKCONCMD CLKCONSTA

(1)UXCSR USART 0/1 控制和狀態
在這裏插入圖片描述
(2)UXGCR USART 0/1 通用控制
在這裏插入圖片描述
(3)UXBUF USART 0/1 接收/傳送數據緩存
在這裏插入圖片描述
(4)UXBAUD USART 0/1 波特率控制
在這裏插入圖片描述
(5)CLKCONCMD 時鐘控制命令
在這裏插入圖片描述
(6)CLKCONSTA 時鐘控制狀態
在這裏插入圖片描述

3、波特率計算

在這裏插入圖片描述

由寄存器UxBAUD.BAUD_M[7:0]和UxGCR.BAUD_E[4:0]定義波特率。該波特率用於UART 傳送,也用於SPI 傳送的串行時鐘速率。波特率由下式給出:F 是系統時鐘頻率,等於16 MHz RCOSC 或者32 MHz XOSC。
在這裏插入圖片描述

4、例程

#include<iocc2530.h>
#include<string.h>

typedef unsigned char uchar;
typedef unsigned int uint;
#define TX_SIZE  20

#define TX_STRING  "Xuaner Zigbee"

char TXDATA[TX_SIZE];  //存儲發送字符串


/*********毫秒延時******/
void delayms(uint ms)
{
	uint i,j;
	for(i=0;i<ms;i++)
		for(j=0;j<1070;j++);
}


/*********串口初始化函數**********/
void inituart(void)
{
	//IO配置
	PERCFG = 0x00; //外設控制寄存器 USART 0 的 IO 位置:0 爲 P0 口位置 1 
	P0SEL = 0x0c; //P0_2,P0_3 用作串口(外設功能)
	P2DIR &= ~0XC0; //P0 優先作爲 UART0
 
	//串口配置
	U0CSR |= 0x80; //設置爲 UART 方式
	U0GCR |= 11; 
	U0BAUD |= 216; //波特率設爲 115200
	UTX0IF = 0; //UART0 TX 中斷標誌初始置位 0
}


/**********串口發送函數******/
void UARTsendstring(char *data, int chang)  //chang 發送長度
{
	uint i;
	for(i=0;i<chang;i++)
	{
		U0BUF = *data++;
		while(UTX0IF == 0);
		UTX0IF = 0;
	} 
}


void main(void)
{
	CLKCONCMD &= ~0X40;		//設置系統時鐘爲32MHZ晶振
	while(CLKCONSTA & 0x40); //等待晶振穩定爲 32M
	CLKCONCMD &= ~0x47; //設置系統主時鐘頻率爲 32MHZ 
 
	inituart(); //調置串口相關寄存器
	memset(TxData, 0, TX_SIZE); //數據清 0
	memcpy(TxData, TX_STRING, sizeof(TX_STRING)); //複製發送字符串到 TxData
	while(1)
	{
		UARTsendstring(TxData, sizeof(TX_STRING)); //串口發送數據
		delayms(1000); //延時 1 秒
	}
}




三、串口收發字符串

原理圖、寄存器、波特率同串口發送字符串
例程:

#include <ioCC2530.h>
#include <string.h>

typedef unsigned char uchar;
typedef unsigned int uint;

#define UART0_RX 1
#define UART0_TX 2
#define SIZE 51

char RxBuf;
char UartState;
uchar count;
char RxData[SIZE]; //存儲發送字符串


/***********延時函數**********/
void delayms(uint ms)
{ 
	uint i,j;
	for (i=0; i<ms; i++)
		for (j=0; j<1070; j++);
}


/********串口初始化函數*********/
void inituart(void)
{ 
	PERCFG = 0x00; //外設控制寄存器 USART 0 的 IO 位置:0 爲 P0 口位置 1
	P0SEL = 0x0c; //P0_2,P0_3 用作串口(外設功能)
	P2DIR &= ~0xC0; //P0 優先作爲 UART0
 
	U0CSR |= 0x80; //設置爲 UART 方式
	U0GCR |= 11; 
	U0BAUD |= 216; //波特率設爲 115200
	UTX0IF = 0; //UART0 TX 中斷標誌初始置位 0
	U0CSR |= 0x40; //允許接收
	IEN0 |= 0x84; //開總中斷允許接收中斷
}


/*********串口發送函數*****/
void UARTsendstring(char *data, int chang)
{
	uint i;
	for(i=0; i<chang; i++)
	{
		U0DBUF = *data++;
		while(UTX0IF == 0);
		UTX0IF = 0;
	}
}

/*******串口中斷處理函數*******/
#pragma vector = URX0_VECTOR 
__interrupt void UART0_ISR(void)
{ 
  URX0IF = 0; // 清中斷標誌
  RxBuf = U0DBUF; 
}



void main(void)
{
	CLKCONCMD &= ~0x40; //設置系統時鐘源爲 32MHZ 晶振
	while(CLKCONSTA & 0x40); //等待晶振穩定爲 32M
	CLKCONCMD &= ~0x47; //設置系統主時鐘頻率爲 32MHZ 
 
	inituart(); //調用串口初始化函數 
	UartState = UART0_RX; //串口 0 默認處於接收模式
	memset(RxData, 0, SIZE);
 
	while(1)
	{
		if(UartState == UART0_RX) //接收狀態
		{ 
			if(RxBuf != 0) 
			{ 
				//以'#'爲結束符,一次最多接收 50 個字符
				if((RxBuf != '#')&&(count < 50)) 
					RxData[count++] = RxBuf; 
				else
				{
					if(count >= 50) //判斷數據合法性,防止溢出
					{
						count = 0; //計數清 0
						memset(RxData, 0, SIZE);//清空接收緩衝區
					}
					else
						UartState = UART0_TX; //進入發送狀態
				}
				RxBuf = 0;
			}
		}
 
		if(UartState == UART0_TX) //發送狀態
		{
			U0CSR &= ~0x40; //禁止接收
			UARTsendstring(RxData, count); //發送已記錄的字符串。
			U0CSR |= 0x40; //允許接收
			UartState = UART0_RX; //恢復到接收狀態
			count = 0; //計數清 0
			memset(RxData, 0, SIZE); //清空接收緩衝區
		} 
	}
}
















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章