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

4.4 異步串行口

S3C2410自帶3個異步串行口控制器,每個控制器有16個字節的FIFO,最大波特率115.2Kbit/s, UART行控制寄存器ULCONn、控制數寄存器UCONn、讀寫狀態寄存器UTRSTAT、FIFO控制寄存器UFCONn、UART MODEM控制寄存器UMCONn、讀寫狀態寄存器UTRSTATn、FIFO狀態寄存器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個用于接收、發送數據。下面應用實例說明串行通信的應用。

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

(1)初始化

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

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

② 設置ULCON0

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

③ 設置UCON0

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

④ 設置UFCON0

如把UFCON0的功能設定為不使用FIFO,則設為默認值0。

⑤ 設置UMCON0

如果把UMCON0設定為不使用流控,則設為默認值0x00。

⑥ 設置UBRDIV0

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

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

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

(2)發送數據

① 設置UTRSTAT0

如果把UTRSTAT0功能設置如下:

位[2]:無數據發送時,自動設為1。當使用串口發送數據時,先讀此位以判斷是否有數據正在占用發送口。

位[1]:發送FIFO是否為空。

位[0]:接收緩沖區是否有數據,若有,此位設為1。實驗中需要不斷查詢此位,判斷是否有數據已經被接收。

② 給UTXH0寄存器賦值

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

(3)接收數據

① 根據位[0],先判斷寄存器UTRSTAT0的緩沖區是否有數據。

② 當查詢到UTRSTAT0位[0]=1時,讀此寄存器獲得串口接收到的數據。

串口數據傳送的三個函數:init_uart、putc、getc分別表示串口初始化、發送數據與接收數據。

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

4.5 IIC總線接口

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

(1)IICCON寄存器

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

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

(2)IICSTAT寄存器

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

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

(3)IICADD寄存器

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

(4)IICDS寄存器

[7:0]保存的是要發送或已經接收的數據,當IICSTAT[4]為1時,才可以寫入,在任何時間都可讀出。

例:分析下列函數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;表示禁止內部上拉,語句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。

主站蜘蛛池模板: 南昌县| 兴海县| 衡阳县| 泾源县| 舒兰市| 双鸭山市| 诸暨市| 抚远县| 阿拉善右旗| 上虞市| 鹿泉市| SHOW| 富川| 延边| 青海省| 天全县| 武城县| 乳山市| 精河县| 惠水县| 凌云县| 法库县| 商洛市| 隆安县| 阿拉善盟| 西藏| 全椒县| 波密县| 昌邑市| 甘德县| 任丘市| 洞口县| 和硕县| 通海县| 高台县| 枞阳县| 漳州市| 宁海县| 安阳县| 巴南区| 新疆|