天天看點

CC2530學習(四)CC2530串行接口并行通信與串行通信CC2530的序列槽通信子產品相關寄存器介紹UART口與計算機的COM口連接配接序列槽小實驗

并行通信與串行通信

微控制器與外設之間的資料通信,根據連線結構和傳送方式的不同,可以分為兩種:并行通信和串行通信。

并行通信:指資料的各位同時發送或接收,每個資料位使用單獨的一條導線。傳輸速度快、效率高,但需要的資料線較多,成本高。

串行通信:指資料一位接一位地順 序發送或接收。需要的資料線少,成本低,但傳輸速度慢,效率低。

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

CC2530的序列槽通信子產品

CC2530有兩個串行通信接口USART0和USART1,并且它們都能夠分别運作于異步UART模式或者同步SPI模式。具體用于那種模式通過設定U0CSR寄存器來選擇。

兩個USART接口具有相同的功能,且它們有對應的外部I/O引腳映射關系。通過

PERCFG寄存器設定。

映射關系:

位置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的接收/發送資料緩沖寄存器。

<5> UxBAUD:USARTx的波特率控制寄存器。

相關寄存器介紹

接下來的代碼部分會涉及到一些寄存器的各個位作用

CLKCONCMD:時鐘頻率控制寄存器。

CC2530學習(四)CC2530串行接口并行通信與串行通信CC2530的序列槽通信子產品相關寄存器介紹UART口與計算機的COM口連接配接序列槽小實驗

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:時間頻率狀态寄存器。

CC2530學習(四)CC2530串行接口并行通信與串行通信CC2530的序列槽通信子產品相關寄存器介紹UART口與計算機的COM口連接配接序列槽小實驗

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

CC2530學習(四)CC2530串行接口并行通信與串行通信CC2530的序列槽通信子產品相關寄存器介紹UART口與計算機的COM口連接配接序列槽小實驗

U0CSR:USART0控制與狀态;

CC2530學習(四)CC2530串行接口并行通信與串行通信CC2530的序列槽通信子產品相關寄存器介紹UART口與計算機的COM口連接配接序列槽小實驗

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通用控制寄存器;

CC2530學習(四)CC2530串行接口并行通信與串行通信CC2530的序列槽通信子產品相關寄存器介紹UART口與計算機的COM口連接配接序列槽小實驗

D7為SPI時鐘極性:0為負時鐘極性,1為正時鐘極性;

D6為SPI時鐘相位:

D5為傳送為順序:0為最低有效位先傳送,1為最高有效位先傳送。

D4~D0為波特率設定:

對于波特率設定我們這還有介紹:

CC2530的波特率由BAUD_E和BAUD_M共同決定:

CC2530學習(四)CC2530串行接口并行通信與串行通信CC2530的序列槽通信子產品相關寄存器介紹UART口與計算機的COM口連接配接序列槽小實驗

F為微控制器的系統時鐘頻率:16MHz或32MHz。

在TI公司提供的資料手冊中,給出了32MHz系統時鐘下各常用波特率的參數值,由計算公式亦不難得出16MHz系統時鐘下對應的參數值。

CC2530學習(四)CC2530串行接口并行通信與串行通信CC2530的序列槽通信子產品相關寄存器介紹UART口與計算機的COM口連接配接序列槽小實驗

UART口與計算機的COM口連接配接

先認識兩種電平:TTL電平和RS232電平。

TTL電平: 邏輯0----小于0.8V 邏輯1----大于2.4V。

RS232電平: 邏輯0----5~15V 邏輯1---- -5~-15V。

計算機的串行通信接口是RS-232的标準接口,而CC2530單片機的UART接口則是TTL電平,兩者的電氣規範不一緻,是以要完成兩者之間的資料通信,就需要借助接口晶片在兩者之間進行電平轉換,常用的有MAX232晶片。

CC2530學習(四)CC2530串行接口并行通信與串行通信CC2530的序列槽通信子產品相關寄存器介紹UART口與計算機的COM口連接配接序列槽小實驗

注意: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;
    }
  }
}
           

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

繼續閱讀