1. 程式人生 > >【CC2530入門教程-05】CC2530的串行接口原理與應用

【CC2530入門教程-05】CC2530的串行接口原理與應用

max blog 模式 指數 open != tab bre 就會

第5課 CC2530的串行接口原理與應用

廣東職業技術學院 歐浩源

一、並行通信與串行通信

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

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

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

二、CC2530的串口通信模塊

CC2530有兩個串行通信接口USART0USART1,它們能夠分別運行於異步UART模式或者同步SPI模式

兩個USART接口具有相同的功能,通過PERCFG寄存器可以設置兩個USART接口對應外部I/O引腳的映射關系:

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

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

三、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接口中,公頭和母頭的排列順序是不同的

四、實訓項目:上位機通過串口控制LED燈的開關

技術分享

【1】計算波特率

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

技術分享

F為微控制器的系統時鐘頻率:16MHz32MHz

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

技術分享

【2】串口0的初始化函數

選擇外設的引腳映射位置,並將對應的引腳設置為外設功能 ,然後對波特率、控制寄存器和中斷的相關控制位進行設置。

【3】數據接收中斷服務函數

USART0發送完成的中斷向量是:0x3B ,也可以使用宏定義:URX0_VEXTOR 。在該中斷服務函數中,要手工清除接收中斷標誌位URX0IF

當數據接收完畢後,通過將一個自定義的變量Flag設置為1,告訴主函數,已經成 功接收到所需要的數據,主函數可以對其進行解析和執行指令。

【4】發送字節及發送字符串函數

當USART 的發送/接收數據緩沖寄存器UxDBUF被寫入數據時,該字節就會發送到TXD引腳,開始數據的傳輸。由於UxDBUF是雙緩沖的,所以在發送開始後會立即觸發TX完成中斷標誌UTX0IF,並且數據緩沖器被卸載,也就是說,當字節正在發送時,新 的字節能夠裝入數據緩沖器UxDBUF

在單字節的發送函數中,把要發送的數據寫入UxDBUF後,查詢TX完成標誌UTX0IF,當該標誌被置1時,表示數據發送完成,然後清除該標誌。

【5】項目源代碼

#include "ioCC2530.h"
#define  LED5   P1_3
#define  LED6   P1_4
unsigned char dataRecv;
unsigned char Flag = 0;
/*===================UR0初始化函數====================*/
void Init_Uart0()
{
  PERCFG = 0x00;    //串口0的引腳映射到位置1,即P0_2和P0_3
  P0SEL = 0x0C;     //將P0_2和P0_3端口設置成外設功能
  U0BAUD = 59;      //16MHz的系統時鐘產生9600BPS的波特率
  U0GCR = 9;
  U0UCR |= 0x80;    //禁止流控,8位數據,清除緩沖器
  U0CSR |= 0xC0;    //選擇UART模式,使能接收器
  UTX0IF = 0;       //清除TX發送中斷標誌
  URX0IF = 0;       //清除RX接收中斷標誌
  URX0IE = 1;       //使能URAT0的接收中斷
  EA = 1;           //使能總中斷
}
/*================UR0接收中斷服務函數================*/
#pragma vector = URX0_VECTOR
__interrupt void UR0_RecvInt()
{
  URX0IF = 0;           //清除RX接收中斷標誌
  dataRecv =  U0DBUF;   //將數據從接收緩沖區讀出
  Flag = 1;             //設置接收指令標誌
}
/*=================UR0發送單字節函數=================*/
void UR0SendByte(unsigned char dat)
{
  U0DBUF = dat;         //將要發送的1字節數據寫入U0DBUF
  while(!UTX0IF);       //等待TX中斷標誌,即數據發送完成
  UTX0IF = 0;           //清除TX中斷標誌,準備下一次發送
}
/*=================UR0發送字符串函數===============*/
void UR0SendString(unsigned char *str)
{
  while(*str != \0)       //發送一個字符串
  {
    UR0SendByte(*str++);    //逐個發送字符串中的字節
  }
}
/*================執行上位機的指令=================*/
void ExecuteTheOrder()
{
  Flag = 0 ;            //清除接收指令標誌
  switch(dataRecv)
  {
    case 0xa1:
      LED5 = 1;
      UR0SendString("The LED5 is Open!\r\n");
    break;
    case 0xa2:
      LED5 = 0;
      UR0SendString("The LED5 is Closed!\r\n");
    break;
    case 0xb1:
      LED6 = 1;
      UR0SendString("The LED6 is Open!\r\n");
    break;
    case 0xb2:
      LED6 = 0;
      UR0SendString("The LED6 is Closed!\r\n");
    break;
  }
}
/*=================端口初始化函數====================*/
void Init_Port()
{
  P1SEL &= ~0x18;       //將P1_3和P1_4設置為通用I/O端口功能
  P1DIR |= 0x18;        //將P1_3和P1_4的端口設置為輸出
  LED5 = 0;             //關閉LED5燈
  LED6 = 0;             //關閉LED6燈
} 
/*===================主函數=========================*/
void main()
{
  Init_Port();         //初始化端口
  Init_Uart0();        //初始化串口0
  //先發送一個字符串,測試串口0數據傳輸是否正確
  UR0SendString("*廣東職業技術學院--歐浩源*\r\n");
  while(1)
  {
    if(Flag == 1)      //查詢是否收到上位機指令
    {
      ExecuteTheOrder();    //解析並執行指令
    }
  }
}

【CC2530入門教程-05】CC2530的串行接口原理與應用