cc2530串口通信
編寫程序實現實驗板定期向PC機串口發送字符串“Hello ! I am CC2530 。\n”。實驗板開機后按照設定的時間間隔,不斷地向PC及發送字符串,報告自己的狀態,每發送一次字符串消息,LED1閃亮一次。具體工作方式如下:
?、?通電后LED1熄滅。
?、?設置USART 0使用位置。
?、?設置UART工作方式和波特率。
?、?LED1點亮。
?、?發送字符串“Hello ! I am CC2530。\n”。
?、?LED1熄滅。
?、?延時一段時間,延時時間可以設置為3秒。
?、?返回步驟④循環執行。
串口通信介紹
數據通信時,根據CPU與外設之間的連線結構和數據傳送方式的不同,可以將通信方式分為兩種:并行通信和串行通信。
并行通信是指數據的各位同時發送或接收,每個數據位使用單獨的一條導線,有多少位數據需要傳送就需要有多少條數據線。并行通信的特點是各位數據同時傳送,傳送速度快效率高,并行數據傳送需要較多的數據線,因此傳送成本高,干擾大,可靠性較差,一般適用于短距離數據通信,多用于計算機內部的數據傳送方式。
串行通信是指數據一位接一位順序發送或接收。串行通信的特點是數據按位順序進行,最少只需一根數據傳輸線即可完成,傳輸成本低傳送數據速度慢,一般用于較長距離的數據傳送。
串行通信又分同步和異步兩種方式。
?。?)串行同步通信
同步通信中,所有設備使用同一個時鐘,以數據塊為單位傳送數據,每個數據塊包括同步字符、數據塊和校驗字符。同步字符位于數據塊的開頭,用于確認數據字符的開始;接收時,接收設備連續不斷地對傳輸線采樣,并把接收到的字符與雙方約定的同步字符進行比較,只有比較成功后才會把后面接收到的字符加以存儲
同步通信的優點是數據傳輸速率高,缺點是要求發送時鐘和接收時鐘保持嚴格同步。在數據傳送開始時先用同步字符來指示,同時傳送時鐘信號來實現發送端和接收端同步,即檢測到規定的同步字符后,接著就連續按順序傳送數據。這種傳送方式對硬件結構要求較高。
?。?)串行異步通信
異步通信中,每個設備都有自己的時鐘信號,通信中雙方的時鐘頻率保持一致。異步通信以字符為單位進行數據傳送,每一個字符均按照固定的格式傳送,又被稱為幀,即異步串行通信一次傳送一個幀。
每一幀數據由起始位(低電平)、數據位、奇偶校驗位(可選)、停止位(高電平)組成。幀的格式如圖5-1所示:
起始位:發送端通過發送起始位而開始一幀數據的傳送。起始位使數據線處于邏輯0,用來表示一幀數據的開始。
數據位:起始位之后就開始傳送數據位。在數據位中,低位在前,高位在后。數據的位數可以是5、6、7或者8。
奇偶校驗位:是可選項,雙方根據約定用來對傳送數據的正確性進行檢查??蛇x用奇校驗、偶校驗和無校驗位。
停止位:在奇偶檢驗位之后,停止位使數據線處于邏輯1,用以標志一個數據幀的結束。停止位邏輯值1的保持時間可以是1、1.5或2位,通信雙方根據需要確定。
空閑位:在一幀數據的停止位之后,線路處于空閑狀態,可以是很多位,線路上對應的邏輯值是1,表示一幀數據結束,下一幀數據還沒有到來。
2.CC2530的串口通信模塊
CC2530有兩個串行通信接口USART 0和USART 1,它們能夠分別運行于異步UART模式或者同步SPI模式。兩個USART具有同樣的功能,可以設置在單獨的I/O引腳,如表5-1所示
根據映射表可知,在UART模式中,使用雙線連接方式,UART 0和UART 1對應的外部設置I/O引腳關系分別為:
位置1:RX0----P0_2 TX0----P0_3 P0_5----RX1 TX1----P0_4
位置2:RX0----P1_4 TX0----P1_5 P1_7----RX1 TX1----P1_6
UART模式的操作具有下列特點:
? 8位或者9位有效數據
? 奇校驗、偶校驗或者無奇偶校驗
? 配置起始位和停止位電平
配置LSB或者MSB首先傳送
? 獨立收發中斷
? 獨立收發DMA觸發
? 奇偶校驗和數據幀錯誤狀態指示
UART模式提供全雙工傳送,接收器中的位同步不影響發送功能。傳送一個UART字節包含1個起始位、8個數據位、1個作為可選項的第9位數據或者奇偶校驗位再加上1個或2個停止位。實際發送的幀包含8位或者9位,但是數據傳送只涉及一個字節。
1234567891011121314
3.CC2530串口通信的相關寄存器
對于CC2530的每個USART串口通信,有5個如下的寄存器(x是USART的編號,為0或者1):
? UxCSR:USARTx控制和狀態寄存器
? UxUCR:USARTx UART控制寄存器
? UxGCR:USARTx 通用控制寄存器
? UxBUF:USART x接收/發送數據緩沖寄存器
? UxBAUD:USART x波特率控制寄存器
1234567
4.串口0初始化
串口0 初始化
PERCFG=0X00; //外設控制寄存器 這里使用串口0位置1
P0SEL=0X0C; //0_2 0_3設置特殊端口
U0CSR |=0X80;//0100 0000 0x80 串口通信的語言這里使用USART
U0BAUD =216 ;
U0GCR=10 ; //波特率
U0UCR |=0x80; //流控制禁止
U0CSR |=0x40; //允許接受數據
UTX0IF = 0; //接受標志位
URX0IF = 0; //發送標志位
URX0IE=1; //使能中斷
EA=1; //中斷總開關
串口設置
TX 發送數據
RX 接收數據
123456789101112131415161718192021
波特率設置
12
U0CSR和U0BAUD用來設置波特率
例如設置波特率位57600:
U0BAUD = 216;
U0GCR = 10;
12345
具體初始化
UART0初始化配置
1、設置USARTX0 為備用位置1,一般采用上電默認,無需配置
PERCFG &= ~0X01;
2、設置P0用作串口,P0_2、P0_3作為片上外設I/0
P0SEL |= 0X0C;
3、設置P0口外設優先級,采用上電默認值(P2DIR),無需配置
4、設置UART0波特率
U0BAUD = 59;
U0GCR = 10;
5、USART 模式選擇,UART 模式,允許接收
U0CSR |= 0XC0;
6、進行USART 清除,并設置數據格式為默認值
U0UCR |= 0X80;
7、清零UART0 RX 和 UART0 TX 中斷標志
URX0IF = 0;
UTX0IF = 0;
8、使能UART0 RX 中斷
URX0IE = 1;
9、使能全局中斷
EA = 1;
123456789101112131415161718192021
如果接收到了串口發來的數據URX0IF置1;
如果發送成功UTX0IF置1;
串口收發配置
1、串口初始化配置
2、發送函數
void SendString(char *p) //發送字符串
{
while(1)
{
if(*p == ‘\0’)
break;
U0DBUF = *p++;
while(!UTX0IF);
UTX0IF = 0;
}
}
12345678910111213141516
3、串口接收中斷服務函數
#pragma vector = URX0_VECTOR
__interrupt void URX0_f()
{
URX0IF = 0;
buff[i] = U0DBUF;
if(buff[i] == ‘#’)
{
TXstring(buff);
i = 0;
}
else
i++;
}
123456789101112131415
4、main函數及時鐘源的配置
void main()
{
CLKCONCMD &= ~0X47;
initUART0();
while(1);
}
U0CSR
USART模式選擇
開啟/關閉 接收數據功能,在發送數據的時候需要關閉接收數據功能
U0CSR |= 0X40; / U0CSR &= ~0X40;
123456789101112
U0UCR
一般采用上電默認值
U0UCR |= 0X80;
1234
URX0IF
清空UART0、UART1的RX 中斷標志
URX0IF = 0;
1234
UTX0IF
12
U0CSR
一般設置:
U0CSR |= 0X40; //允許接收
1234
URX0IE
IEN0 的第二位,使能UART0 RX 中斷
123
P2DIR
端口0外設優先級控制
使用USART0時 采用上電默認值
1234
代碼
/* 文件名稱:uart1.c
* 功 能:CC2530系統實驗-----單片機串口發送數據到PC
* 描 述:實現從 CC2530 上通過串口每3秒發送字串“Hello ,I am CC2530 。\n ”,在PC端實驗串口助手來接收數據。使用 CC2530 的串口 UART 0 ,波特率為 57600,其他參數為上電復位默認值。
*/
/* 包含頭文件 */
#include “ioCC2530.h” //定義led燈端口
#define LED1 P1_0 // P1_0定義為P1.0
unsigned int counter=0; //統計定時器溢出次數
void initUART0(void)
{
PERCFG = 0x00;
P0SEL = 0x3c;
U0CSR |= 0x80;
U0BAUD = 216;
U0GCR = 10;
U0UCR |= 0x80;
UTX0IF = 0; // 清零UART0 TX中斷標志
EA = 1; //使能全局中斷
}
/************************************************************
* 函數名稱:inittTimer1
* 功 能:初始化定時器T1控制狀態寄存器
*************************************************************/
void inittTimer1()
{
CLKCONCMD &= 0x80; //時鐘速度設置為32MHz
T1CTL = 0x0E; // 配置128分頻,模比較計數工作模式,并開始啟動
T1CCTL0 |= 0x04; //設定timer1通道0比較模式
T1CC0L =50000 & 0xFF; // 把50000的低8位寫入T1CC0L
T1CC0H = ((50000 & 0xFF00) 》》 8); // 把50000的高8位寫入T1CC0H
T1IF=0; //清除timer1中斷標志
T1STAT &= ~0x01; //清除通道0中斷標志
TIMIF &= ~0x40; //不產生定時器1的溢出中斷
//定時器1的通道0的中斷使能T1CCTL0.IM默認使能
IEN1 |= 0x02; //使能定時器1的中斷
EA = 1; //使能全局中斷
}
void UART0SendByte(unsigned char c)
{
U0DBUF = c;
while (!UTX0IF); // 等待TX中斷標志,即U0DBUF就緒
UTX0IF = 0; // 清零TX中斷標志
}
/**************************************************************
* 函數名稱:UART0SendString
* 功 能:UART0發送一個字符串
**************************************************************/
void UART0SendString(unsigned char *str)
{
while(*str != ‘\0’)
{
UART0SendByte(*str++); // 發送一字節
}
}
/************************************************************
* 功 能:定時器T1中斷服務子程序
************************************************************/
#pragma vector = T1_VECTOR //中斷服務子程序
__interrupt void T1_ISR(void)
{
EA = 0; //禁止全局中斷
counter++; //統計T1的溢出次數
T1STAT &= ~0x01; //清除通道0中斷標志
EA = 1; //使能全局中斷
}
/************************************************************
* 函數名稱:main
* 功 能:main函數入口
*******************************************************/
void main(void)
{
P1DIR |= 0x01; /* 配置P1.0的方向為輸出 */
LED1 = 0;
inittTimer1(); //初始化Timer1
initUART0(); // UART0初始化
while(1)
{
if(counter》=15)
{
counter=0;
LED1 = 1;
UART0SendString(“Hello ! I am CC2530 。\n”);
LED1 = 0;
}
}
}
非常好我支持^.^
(29) 8.6%
不好我反對
(308) 91.4%
相關閱讀:
- [電子說] 洲明UCine LED全系列產品獲TüV南德、美國UL“雙認證” 2023-10-24
- [電子說] STM32速成筆記(12)—Flash閃存 2023-10-24
- [電子說] 耐壓100V10A LED降壓恒流PWM調光芯片在汽車車燈調光電源的應用 2023-10-24
- [電子說] 三星宣布正開發RGB OLEDoS 蘋果考慮采用 2023-10-24
- [電子說] 簡易LED恒流電路分析 2023-10-24
- [電子說] 單電池點亮白光LED電路分析 2023-10-24
- [電子說] 低電壓光控LED閃光燈電路原理圖講解 2023-10-24
- [電子說] LED三色流水燈(1亮2滅)電路原理圖講解 2023-10-24
( 發表人:龔婷 )