CC2530學習(四)CC2530串行接口

並行通信與串行通信

微控制器與外設之間的數據通信,根據連線結構和傳送方式的不同,可以分爲兩種:並行通信和串行通信。
並行通信:指數據的各位同時發送或接收,每個數據位使用單獨的一條導線。傳輸速度快、效率高,但需要的數據線較多,成本高。
串行通信:指數據一位接一位地順 序發送或接收。需要的數據線少,成本低,但傳輸速度慢,效率低。

從中我們可以瞭解到兩種通信方式各有各自的優缺點,在實際應用中根據不同情況而定。

CC2530的串口通信模塊

CC2530有兩個串行通信接口USART0USART1,並且它們都能夠分別運行於異步UART模式或者同步SPI模式。具體用於那種模式通過設置U0CSR寄存器來選擇。
兩個USART接口具有相同的功能,且它們有對應的外部I/O引腳映射關係。通過
PERCFG寄存器設置。
映射關係:
位置1RX0 — P0_2 TX0 — P0_3 RX1 — P0_5 TX1 — P0_4
位置2RX0 — 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;
    }
  }
}

本次介紹就到這了,謝謝大家的觀看!

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