串列埠收發資料實驗
一、實驗目的
利用CC2530的串列埠0不停的列印資訊到電腦上,同時接收從串列埠發過來了的資料,把傳送過來的資料直接送回給電腦。
二、實驗環境
1.硬體:通用節點或任意感測器節點一個、USB模擬器、USB電纜、PC機;
2.軟體:IAR Embedded Workbench for MCS-51、串列埠除錯工具。
三、實驗內容
1、瞭解有關實驗內容及知識點:
使用協議:RS232 RS480
RS232通訊協議:
R:接收-預設高電平(起始位-八位資料-接受位)。
1:傳送速率:波特率(115200bp)
2:奇偶校驗(電平轉換晶片:低的放更低,高的更高)
T:傳送
微介面:HPML、USB、TYPE-C、雷電3介面-3G速度、可擴充套件10介面等。
非同步接收發送器:RX引腳
TX引腳
晶片時鐘配置:32HZ XOSC(外部時鐘)16HZ RXOSC(內部時鐘)
TIMER TICKS:低拉鬧鐘(頻率:250KHZ-過1s)
U0BUF暫存器:8位
2、使用IAR 開發環境設計程式,利用CC2530 的串列埠0 進行資料收發通訊。
(1)硬體設計
在CC2530中,此次我們使用USART0,並且工作在UART標準串列埠模式下。
此圖為部分外設複用IO對應圖;
接下來我們瞭解了有關CC2530相關暫存器:
P0暫存器(IO資料暫存器);
POSEL暫存器(外設功能選擇暫存器);
PODIR暫存器(IO輸入輸出選擇暫存器);
接下來我們瞭解了晶片的時鐘操作及配置:
此圖為CLKCONCMD 暫存器;
此圖為CLKCONSTA 暫存器;
此圖為CH340晶片完成了USB轉串列埠。(通過USB電纜連線節點和計算機後,CH340晶片會在計算機中虛擬一個串列埠,這個串列埠訊號對於圖中的CH340_TXD和CH340_RXD,通過J2上的跳線帽與CC2530的P0.2和P0.3引腳相連。)
(2)軟體設計(串列埠函式)
#define uint unsigned int
#define uchar unsigned char
//定義控制燈的埠
#define led1 P1_0
#define led2 P1_1
void InitIO(void); //IO初始化
void InitUart(void); //串列埠初始化
void SendString(char*string,uint legth); //傳送字串
uchar temp; // 存放接受的資料
char wch[] = "2#155 hello!\n";
/*****************************************************************************
功能描述: 延時
Count: 延時單位數量
*****************************************************************************/
void DelayXms(unsigned int Count)
{
unsigned int i;
unsigned int j;
for(i = 0; i < Count; i++)
{
for( j=10000; j>0; j--);
}
}
/*****************************************************************************
功能描述: IO初始化
*****************************************************************************/
void InitIO(void)
{
SLEEPCMD &= ~0X04;
CLKCONCMD = 0X10; //32k和32M時鐘使用外部晶體,timer分頻8M
while(CLKCONSTA!=0X10); //等待時鐘切換
SLEEPCMD = 0X04;
P2DIR = 0x00; //高兩位零 若設則最高優先USART0
P1DIR|= 0X03; //P1.0 P1.1 LEDs 燈埠配置
P0DIR|= 0X00; //input
PERCFG = 0x00; //UART0 預設埠
P1SEL = 0X00;
P0SEL = 0X0c; //P0<3:2>設定成外圍應用
}
/*****************************************************************************
功能描述: 串列埠初始化
*****************************************************************************/
void InitUart(void)
{
U0CSR |= 0x80; //UART方式
U0GCR = 11; //baud_e 波特率設為115200
U0BAUD |= 216; //baud_m = BaudRate*2^(28-buad_e)/32M-256
//BaudRate=(256+baud_m)/2^(28-buad_e)x32MHz
UTX0IF = 1; //接收中斷標記
U0CSR |= 0X40; //允許接收
URX0IE = 1; //接收中斷使能
EA =1; //總中斷開關開啟
}
/*****************************************************************************
功能描述: 串列埠傳送字串
string: 字串指標
lenth: 長度
*****************************************************************************/
void SendString(char*string,uint lenth)
{
uint j;
for (j=0; j<lenth; j++)
{
U0DBUF = *string++; //將要傳送字元送入U0DBUF傳送暫存器
while(UTX0IF == 0); //等待發送完成
UTX0IF = 0; //清0標誌位
}
}
/*****************************************************************************
功能描述: 主函式
*****************************************************************************/
void main(void)
{
InitIO();
InitUart();
DelayXms(10);
led1=1; //點亮2個LED燈
led2=1;
SendString(wch,sizeof(wch));
while(1)
{
; //進入無限迴圈等待中斷函式被處觸發
}
}
/*****************************************************************************
功能描述: 串列埠中斷函式
*****************************************************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; //清中斷標誌
temp = U0DBUF;
U0DBUF = temp; //將收到的字元傳送回去
while(UTX0IF == 0); //等待發送
UTX0IF = 0; //清發送標誌
led1 = ~led1; //指示中斷活動
led2 = ~led2;
}
四、實驗結果