CC2530的串行接口原理與應用

網址:https://www.cnblogs.com/ALittleBee/p/7094794.html

一、並行通信與串行通信

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

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

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

 

二、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芯片。




【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();    //解析並執行指令
    }
  }
}


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