官术网_书友最值得收藏!

4.4 異步串行口

S3C2410自帶3個異步串行口控制器,每個控制器有16個字節(jié)的FIFO,最大波特率115.2Kbit/s, UART行控制寄存器ULCONn、控制數(shù)寄存器UCONn、讀寫狀態(tài)寄存器UTRSTAT、FIFO控制寄存器UFCONn、UART MODEM控制寄存器UMCONn、讀寫狀態(tài)寄存器UTRSTATn、FIFO狀態(tài)寄存器UFSTATn、波特率分頻寄存器UBRDIVn。

(1)端口H控制寄存器功能如表4.19所示,端口H控制寄存器共有引腳21個,0~20腳,每2個位控制1個引腳。如果控制位為00時引腳為輸入,控制位為01時引腳為輸出,控制位為10時引腳為特殊功能,控制位為11時引腳為保留功能。

表4.19 端口H控制寄存器及功能

(2)端口上拉寄存器(GPBUP-GPHUP)

0接上拉電阻,1不接上拉電阻

(3)S3C2410中UART行控制寄存器ULCONn如表4.20所示。

表4.20 UART行控制寄存器VLCONn

(4)S3C2410中FIFO控制寄存器UFCONn如表4.21所示。

表4.21 FIFO控制寄存器UFCONn

(5)S3C2410中UART MODED控制寄存器UMCONn如表4.22所示。

表4.22 UARTMODED控制寄存器UMCONn

S3C2410中每個UART的寄存器有11個之多(共有3個UART),考慮比較簡單的情況,用到的寄存器也有8個。不過初始化就用去了5個寄存器,剩下的3個用于接收、發(fā)送數(shù)據(jù)。下面應(yīng)用實例說明串行通信的應(yīng)用。

例1:假設(shè)在數(shù)據(jù)傳送中設(shè)置傳送8個數(shù)據(jù)位,1個停止位,無校驗,正常操作模式,發(fā)送、接收都使用中斷或查詢方式,請根據(jù)實際需求設(shè)置異步通信寄存器,實際操作過程如下:

(1)初始化

① 把使用到的引腳GPH2、GPH3定義為TXD0、RXD0。

      GPHCON |= 0xa0   //10100000
      GPHUP  |= 0x0c   //上拉

② 設(shè)置ULCON0

如把ULCON0(UART channel 0 line control register)設(shè)定為:8個數(shù)據(jù)位,1個停止位,無校驗,正常操作模式(與之相對的是Infra-Red Mode,此模式表示0、1的方式比較特殊)。則ULCON0值為0x03。

③ 設(shè)置UCON0

如把UCON0設(shè)定為除了位[3:0],其他位都使用默認(rèn)值。位[3:0]=0b0101表示:發(fā)送、接收都使用“中斷或查詢方式”,則把UCON0值賦為0x05。

④ 設(shè)置UFCON0

如把UFCON0的功能設(shè)定為不使用FIFO,則設(shè)為默認(rèn)值0。

⑤ 設(shè)置UMCON0

如果把UMCON0設(shè)定為不使用流控,則設(shè)為默認(rèn)值0x00。

⑥ 設(shè)置UBRDIV0

UBRDIV0未使用PLL,采用PCLK=12MHz,設(shè)置波特率為57600Bd,則由公式:

      UBRDIVn = (int)(PCLK / (bps x 16))-1

可以計算得UBRDIV0 = 12,根據(jù)S3C2410數(shù)據(jù)手冊的誤差公式,驗算此波特率是否在可容忍的誤差范圍之內(nèi),如果不在,則需要更換另一個波特率。經(jīng)驗算UBRDIV0可設(shè)為12。

(2)發(fā)送數(shù)據(jù)

① 設(shè)置UTRSTAT0

如果把UTRSTAT0功能設(shè)置如下:

位[2]:無數(shù)據(jù)發(fā)送時,自動設(shè)為1。當(dāng)使用串口發(fā)送數(shù)據(jù)時,先讀此位以判斷是否有數(shù)據(jù)正在占用發(fā)送口。

位[1]:發(fā)送FIFO是否為空。

位[0]:接收緩沖區(qū)是否有數(shù)據(jù),若有,此位設(shè)為1。實驗中需要不斷查詢此位,判斷是否有數(shù)據(jù)已經(jīng)被接收。

② 給UTXH0寄存器賦值

實驗中要把發(fā)送的數(shù)據(jù)寫入UTXH0(UART channel 0 transmit buffer register )此寄存器。

(3)接收數(shù)據(jù)

① 根據(jù)位[0],先判斷寄存器UTRSTAT0的緩沖區(qū)是否有數(shù)據(jù)。

② 當(dāng)查詢到UTRSTAT0位[0]=1時,讀此寄存器獲得串口接收到的數(shù)據(jù)。

串口數(shù)據(jù)傳送的三個函數(shù):init_uart、putc、getc分別表示串口初始化、發(fā)送數(shù)據(jù)與接收數(shù)據(jù)。

      void init_uart( ) //初始化UART
      {
          GPHCON|= 0xa0;      //GPH2, GPH3 used as TXD0, RXD0
          GPHUP  = 0x0c;      //GPH2, GPH3內(nèi)部上拉
          ULCON0 = 0x03;      //8N1(8個數(shù)據(jù)位,無校驗位,1個停止位)
          UCON0  = 0x05;      //查詢方式
          UFCON0 = 0x00;       //不使用FIFO
          UMCON0 = 0x00;       //不使用流控
          UBRDIV0= 12;      //波特率為57600
      }
      void putc(unsigned char c)
      {
        while( ! (UTRSTAT0 & TXD0READY) ); //不斷查詢,直到可以發(fā)送數(shù)據(jù)
        UTXH0 = c;                        //發(fā)送數(shù)據(jù)
      }
      unsigned char getc( )
      {
        while( ! (UTRSTAT0 & RXD0READY) ); //不斷查詢,直到接收到了數(shù)據(jù)
        return URXH0;                     //返回接收到的數(shù)據(jù)
      }

4.5 IIC總線接口

IIC中有一條串行數(shù)據(jù)線(SDA),一條串行時鐘線(SCL)。數(shù)據(jù)傳送時,主機先發(fā)出開始S信號,然后發(fā)出8位數(shù)據(jù),這8位數(shù)據(jù)中的前7位為從機的地址,第8位表示傳輸?shù)姆较颍?表示寫操作,1表示讀操作)。在S3C2410中IIC總線控制寄存器有4個,分別是IICCON、IICSTAT、IICADD、IICDS。SDA線上的數(shù)據(jù)從IICDS寄存器發(fā)出(或傳入IICDS); IICADD寄存器中保存S3C2410當(dāng)作從機時的地址;IICCON、IICSTAT兩個寄存器用來控制或標(biāo)識各種狀態(tài),如選擇工作模式、發(fā)出S或P信號、接收ACK信號、檢測是否收到ACK信號。

(1)IICCON寄存器

IICCON寄存器各位功能及描述如表4.23所示。

表4.23 IICCON寄存器各位的功能描述

(2)IICSTAT寄存器

IICSTAT寄存器各位功能及描述如表4.24所示。

表4.24 IICSTAT寄存器各位的功能描述

(3)IICADD寄存器

[7:1]表示從機地址,當(dāng)IICSTAT[4]為0時才可寫入,在任何時間都可以讀出。

(4)IICDS寄存器

[7:0]保存的是要發(fā)送或已經(jīng)接收的數(shù)據(jù),當(dāng)IICSTAT[4]為1時,才可以寫入,在任何時間都可讀出。

例:分析下列函數(shù)IIC_init

      void IIC_init(void)
      {
        GPEUP |=0xc000 ;
      GPECON |=0xa0000000 ;

      INTMSK &= ~(BIT_IIC);
        IICCON=( 1<<7) | (0<<6) | (1<<5) |(0xf) ;
      IICADD = 0x10;   //S3C2410 slave address = [7:1]
      IICSTAT =0x10;
      }

分析:語句GPEUP |=0xc000;表示禁止內(nèi)部上拉,語句GPECON |=0xa0000000;表示選擇引腳GPE15到IICSDA, GPE14到IICSCL, Bit[7]=1,使能ACK, bit[6]=0, IICCLK=PCLK/16, bit[5]=1,使能中斷,Bit[3:0]=0xf, Tx_clock=IICCLK/16,如PCLK=50MHz, IICCLK=3.125MHz, Tx_clock=0.195MHz, IIC串行輸出使能Rx/Tx。

主站蜘蛛池模板: 赞皇县| 牡丹江市| 安溪县| 富平县| 合阳县| 嘉荫县| 澎湖县| 卫辉市| 黎平县| 温宿县| 迭部县| 延寿县| 海伦市| 泰州市| 治县。| 得荣县| 黔西县| 浦城县| 安乡县| 天柱县| 通山县| 丰都县| 恩平市| 福安市| 永年县| 剑阁县| 扶沟县| 东乌珠穆沁旗| 永修县| 无锡市| 吉林省| 平潭县| 钦州市| 三明市| 中西区| 平舆县| 昌江| 东源县| 鹤岗市| 旺苍县| 新和县|