1. 程式人生 > >串列埠收發資料實驗

串列埠收發資料實驗

一、實驗目的

     利用CC2530的串列埠0不停的列印資訊到電腦上,同時接收從串列埠發過來了的資料,把傳送過來的資料直接送回給電腦。

二、實驗環境

     1.硬體:通用節點或任意感測器節點一個、USB模擬器、USB電纜、PC機;
     2.軟體:IAR Embedded Workbench for MCS-51、串列埠除錯工具。

三、實驗內容
     1、瞭解有關實驗內容及知識點:
           使用協議:RS232 RS480
                             RS232通訊協議:
                                                        R:接收-預設高電平(起始位-八位資料-接受位)。
                                                              1:傳送速率:波特率(115200bp)
                                                              2:奇偶校驗(電平轉換晶片:低的放更低,高的更高)
                                                        T:傳送
           微介面:HPML、USB、TYPE-C、雷電3介面-3G速度、可擴充套件10介面等。
           非同步接收發送器:RX引腳
                                        TX引腳
          晶片時鐘配置:32HZ XOSC(外部時鐘)16HZ RXOSC(內部時鐘)
          TIMER TICKS:低拉鬧鐘(頻率:250KHZ-過1s)
          U0BUF暫存器:8位
     2、使用IAR 開發環境設計程式,利用CC2530 的串列埠0 進行資料收發通訊。
        (1)硬體設計
             在CC2530中,此次我們使用USART0,並且工作在UART標準串列埠模式下。

                                                          此圖為部分外設複用IO對應圖;

            接下來我們瞭解了有關CC2530相關暫存器:

                                                           P0暫存器(IO資料暫存器);

                                                           POSEL暫存器(外設功能選擇暫存器);

                                                           PODIR暫存器(IO輸入輸出選擇暫存器);

             接下來我們瞭解了晶片的時鐘操作及配置:

                                                                 此圖為CLKCONCMD 暫存器;

                                                                此圖為CLKCONSTA 暫存器;


             此圖為CH340晶片完成了USB轉串列埠。(通過USB電纜連線節點和計算機後,CH340晶片會在計算機中虛擬一個串列埠,這個串列埠訊號對於圖中的CH340_TXD和CH340_RXD,通過J2上的跳線帽與CC2530的P0.2和P0.3引腳相連。)

             (2)軟體設計(串列埠函式)

#define uint unsigned int
#define uchar unsigned char

//定義控制燈的埠
#define led1 P1_0
#define led2 P1_1

void InitIO(void);                          //IO初始化
void InitUart(void);                        //串列埠初始化
void SendString(char*string,uint legth);    //傳送字串

uchar temp;               // 存放接受的資料

char wch[] = "2#155 hello!\n";
/*****************************************************************************
  功能描述: 延時
  Count:    延時單位數量
*****************************************************************************/
void DelayXms(unsigned int Count)
{
 unsigned int i;
 unsigned int j;
 for(i = 0; i < Count; i++)
 {
    for( j=10000; j>0; j--);
 }
}
/*****************************************************************************
  功能描述: IO初始化
*****************************************************************************/
void InitIO(void)
{
    SLEEPCMD &= ~0X04;
    CLKCONCMD = 0X10;           //32k和32M時鐘使用外部晶體,timer分頻8M
    while(CLKCONSTA!=0X10);     //等待時鐘切換
    SLEEPCMD = 0X04; 
   
    P2DIR = 0x00;              //高兩位零   若設則最高優先USART0
    P1DIR|= 0X03;              //P1.0 P1.1 LEDs 燈埠配置
    P0DIR|= 0X00;              //input
   
    PERCFG = 0x00;              //UART0 預設埠
    P1SEL = 0X00;
    P0SEL = 0X0c;               //P0<3:2>設定成外圍應用

}
/*****************************************************************************
  功能描述: 串列埠初始化
*****************************************************************************/
void InitUart(void)
{
    U0CSR |= 0x80;    //UART方式
    U0GCR = 11;            //baud_e 波特率設為115200
    U0BAUD |= 216;    //baud_m = BaudRate*2^(28-buad_e)/32M-256
                                                //BaudRate=(256+baud_m)/2^(28-buad_e)x32MHz
    UTX0IF = 1;                                 //接收中斷標記
    U0CSR |= 0X40;    //允許接收
    URX0IE = 1;                                 //接收中斷使能
    EA =1;                                      //總中斷開關開啟
}
/*****************************************************************************
  功能描述: 串列埠傳送字串
  string:   字串指標
  lenth:   長度
*****************************************************************************/
void SendString(char*string,uint lenth)
{
    uint j;
    for (j=0; j<lenth; j++)
    {
      U0DBUF = *string++;         //將要傳送字元送入U0DBUF傳送暫存器
      while(UTX0IF == 0);         //等待發送完成
      UTX0IF = 0;                 //清0標誌位
    }
}
/*****************************************************************************
  功能描述:    主函式
*****************************************************************************/
 void main(void)
 {
    InitIO();
    InitUart();
    DelayXms(10);
  
    led1=1;                         //點亮2個LED燈
    led2=1;
    SendString(wch,sizeof(wch));
   
    while(1)
    {
      ; //進入無限迴圈等待中斷函式被處觸發
    }
 }
/*****************************************************************************
  功能描述: 串列埠中斷函式
*****************************************************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
  URX0IF = 0;           //清中斷標誌
 temp = U0DBUF;
        U0DBUF = temp;                         //將收到的字元傳送回去
        while(UTX0IF == 0);                    //等待發送
        UTX0IF = 0;                            //清發送標誌
        led1 = ~led1;                          //指示中斷活動
        led2 = ~led2;
}

四、實驗結果