CANTUS-CAN - UART - 32bits EISC Microprocessor CANTUS Ver 1.1 April 24, 213 Advanced Digital Chips Inc.
Ver 1.1 CANTUS Application Note History 213-2-19 Released 213-4-24 Modified CANTUS-CAN CANTUS-CAN Application Note : #5B UART cadvanced Digital Chips Inc. All right reserved. No part of this document may be reproduced in any form without written permission from Advanced Digital Chips Inc. Advanced Digital Chips Inc. reserves the right to change in its products or product specification to improve function or design at any time, without notice. Office (Gwanyang-dong, Keumkang Penterium IT Tower) 22F, A-Tower, 282, Hagui-ro, Dongan-gu, Anyang-si, Gyeonggi-do, SEOUL 431-81 Rep. of KOREA Tel : +82-31-463-75 Fax : +82-31-463-7588 URL : http://www.adc.co.kr 2 AN_5B_UART Advanced Digital Chips Inc.
CANTUS Application Note Ver 1.1 Table of Contents 1 SUMMARY... 6 2 UART INITIALIZE... 7 2.1 REGISTER SET... 7 2.2 FUNCTION SET... 11 3 UART TRANSMIT... 15 3.1 REGISTER SET... 15 3.2 FUNCTION SET 1... 2 3.3 FUNCTION SET 2... 22 4 UART RECEIVE... 24 4.1 REGISTER SET... 24 4.2 FUNCTION SET 1... 25 4.3 FUNCTION SET 2... 27 Advanced Digital Chips Inc. AN_5B_UART 3
Ver 1.1 CANTUS Application Note List of Figures 그림 2-1 UART Initialize Register Set... 7 그림 3-1 UART Data Transmission Register Set... 15 그림 4-1 UART Data Receiving Register Set... 24 4 AN_5B_UART Advanced Digital Chips Inc.
CANTUS Application Note Ver 1.1 List of Tables 표 2-1 Port Alternate Function 4 Register... 8 표 2-2 UART Channel Line Control Register (UxLC)... 8 표 2-3 UART Channel Divisor latch LSB Register (UxDLL)... 9 표 2-4 UART Channel Divisor Latch MSB Register (UxDLM)... 9 표 2-5 UART Baud Rate... 9 표 2-6 UART Channel FIFO Control Register (UxFC)...1 표 2-7 UART Channel Interrupt Enable Register (UxIE)...1 표 3-1 UART Channel Transmitter Holding Register (UxTH)...16 표 3-2 UART Channel Line Status Register (UxLS)...17 표 3-3 Interrupt Pending Register (INTPEND)...18 표 3-4 Interrupt Pending Register (PENDCLR)...19 표 4-1 UART Channel Receiver Buffer Register (UxRB)...24 Advanced Digital Chips Inc. AN_5B_UART 5
Ver 1.1 CANTUS Application Note 1 Summary 이문서는 CANTUS 의 UART 에대한 Application Note 이다. CANTUS 는독립적인송 / 수신이가능한 16Bytes 의 FIFO 가포함된 8 채널의 UART 를가지고있다. FIFO Mode 는 선택적으로사용할수있으며, UART 는수신상태 (Receiver Line Status), 수신 (Received Data Available), 송신가능 (Transmit Holding Empty) 에따라 Core 에 Interrupt Request 를발생한다. 이문서는 CANTUS 의 UART 로 Data 를송 / 수신하기위한방법을기술한다. CANTUS 의 UART 는 CANTUS Datasheet 13 UART 를참조하라. 6 AN_5B_UART Advanced Digital Chips Inc.
CANTUS Application Note Ver 1.1 2 UART Initialize 2.1 Register Set CANTUS 의 UART 를송 / 수신으로사용하기위해먼저다음과같은순서로 Register 를설정한다. 그림 2-1 UART Initialize Register Set START Write PAFx Write UxLC Write UxDLL Write UxDLM Write UxLC Write UxFC Write UxIE END Advanced Digital Chips Inc. AN_5B_UART 7
Ver 1.1 CANTUS Application Note PAFx 해당 Port 의 Pin 을 UART 로사용하기위해 b 을쓴다. Port 의 Pin 의 Alternation 은해당 bit(2) 에쓰는 값으로설정된다. 표 2-1 Port Alternate Function 4 Register Group Index Pin 1 st 2 nd 3 rd 4 th (default) 1 1 11 26 TX[] I2S_SDO P4. 1 27 RX[] I2S_SDI P4.1 2 28 TX[1] SPI_MOSI SDCD_DATA[3] P4.2 PAF4 3 29 RX[1] SPI_MISO SDCD_DATA[2] P4.3 x823 4 3 TX[2] SPI_SCK SDCD_CLK P4.4 5 31 RX[2] SDCD_CMD P4.5 6 32 TX[3] TWI_SCL P4.6 7 33 RX[3] TWI_SDA P4.7 UxLC (UART Channel Line Control Register) Parity, Stop bit, Data length를설정한다. 또한 UxDLL/DLM을설정하기위해 DLAB를 1b 로쓰며, 설정후 반드시 b 로써야한다. 표 2-2 UART Channel Line Control Register (UxLC) Bit R/W Description Default Value 31 : 8 R Reserved. - 7 RW DLAB : Divisor Latch Access Bit DLAB이 1 일때, Divisor Latch Registers의 Read/Write와 FIFO Control Register의 Read가가능하다. 6 RW SB : Set Break SB가 1 일때, Serial Data Output에 Logic 이출력된다. SB는내부 Transmitter Logic에는영향을미치지않으며, 단지 Serial Output에만영향을미친다. 5 RW SP : Stick Parity : Disables Stick Parity 1 : PEN, EPS, SP가 1 일때, Parity Bit PEN, SP가 1 이고, EPS가 일때, Parity Bit 1 4 RW EPS : Even Parity Select : Select Odd Parity 1 : Select Even Parity 3 RW PEN : Parity Enable Bit : Disables Parity 1 : Enables Parity 2 RW STB : Number of Stop Bit : 1 Stop bit 1 : 2 Stop bits( 만약, WLS Bit에서 5 Bits/Character를선택했다면, 1.5 Stop bits 을갖는다.) 1 : RW WLS : Word Length Select : 5 Bits/Character 1 : 6 Bits/Character 1 : 7 Bits/Character 11 : 8 Bits/Character 8 AN_5B_UART Advanced Digital Chips Inc.
CANTUS Application Note Ver 1.1 UxDLL (UART Channel Divisor Latch LSB Register) UART Divisor Latch Value 의하위 8bit 값으로 UART Baud Rate 를설정한다. 표 2-3 UART Channel Divisor latch LSB Register (UxDLL) Bit R/W Description Default Value 31: 8 R Reserved. - 7 : RW Divisor Latch Least Significant Byte x *** DLAB가 1 일때 Access 가능하다. UxDLM (UART Channel Divisor Latch MSB Register) UART Divisor Latch Value 의상위 8bit 값으로 UART Baud Rate 를설정한다. 표 2-4 UART Channel Divisor Latch MSB Register (UxDLM) Bit R/W Description Default Value 31: 8 R Reserved. - 7 : RW Divisor Latch Most Significant Byte x *** DLAB 가 1 일때 Access 가능하다. UART Baud Rate UART의 Baud Rate는아래와같은식을따른다. UART Baud Rate 16 f PCLK UDL UART Divisor Latch Value (UDL) = UDLM[7:] << 8 + UDLL[7:] 표 2-5 UART Baud Rate f PCLK (MHz) 1.24 2.48 5.6448 11.2896 24. 48. 24 bps UDL 27 53 147 294 625 125 ERR(%) 1.23.63.... 48 bps UDL - 27 74 147 313 625 ERR(%) - 1.23.68..16. 96 bps UDL - - 37 74 156 313 ERR(%) - -.68.68.16.16 144 bps UDL - 9 25 49 14 28 ERR(%) - 1.23 2...16.16 192 bps UDL - - 18 37 78 156 ERR(%) - - 2.8.68.16.16 384 bps UDL - - 9 18 39 78 ERR(%) - - 2.8 2.8.16.16 576 bps UDL - - 6 12 26 52 ERR(%) - - 2.8 2.8.16.16 1152bp s UDL - - 3 6 13 26 ERR(%) - - 2.8 2.8.16.16 *** ERR 이 2.2% 이상에서는 UART 동작의안정성을보장받을수없다. ƒ PCLK APB영역에공급되는 Clock이다. CANTUS Datasheet 4 CLOCKS AND POWER MANAGEMENT 을참조 하라. Advanced Digital Chips Inc. AN_5B_UART 9
Ver 1.1 CANTUS Application Note UxFC (UART Channel FIFO Control Register) FIFO Mode 에서 Receiver FIFO Trigger Level 을설정하며, 필요에따라 FIFO 를사용하지않고, 1645 UART Mode 로설정한다. 표 2-6 UART Channel FIFO Control Register (UxFC) Bit R/W Description Default Value 31 : 8 R Reserved. - 7 : 6 RW RFTL : Receiver FIFO Trigger Level : 1 Byte 1 : 4 Byte 1: 8 Byte 11 : 14 Byte 5 : 3 R Reserved - 2 RW XFR : XMIT FIFO Reset XFR가 1 일때, XMIT FIFO 내의모든데이터는 Reset 된다. 그러나 Shift Register 내의데이터는 Reset 되지않는다. 1 RW RFR : RCVR FIFO Reset RFR가 1 일때, RCVR FIFO 내의모든데이터는 Reset 된다, 그러나 Shift Register 내의데이터는 Reset 되지않는다. RW FIFOEN : FIFO Enable Bit : 1645 UART Mode 1 : Enables FIFO *** DLAB가 일때는 Write Mode 이고, DLAB가 1 일때는 Read Mode 이다. UxIE (UART Channel Interrupt Enable Register) UART Interrupt 를사용하기위해서 UxIE 를설정한다. 표 2-7 UART Channel Interrupt Enable Register (UxIE) Bit R/W Description Default Value 31: 3 R Reserved. - 2 RW RLSIEN : Receiver Line Status Interrupt Enable bit : Disable 1 : Enable 1 RW THEIEN : Transmitter Holding Empty Interrupt Enable bit : Disable 1 : Enable RW RDAIEN : Received Data Available Interrupt Enable bit : Disable 1 : Enable 1 AN_5B_UART Advanced Digital Chips Inc.
CANTUS Application Note Ver 1.1 2.2 Function Set 아래는 CANTUS 의 Port 4 의, 1 Pin 을 UART TX/RX 로설정하고, UART 는 None Parity, 1 Stop bit, 8 bits/character 로 설정한예이다. APB Clock 48MHz 에서 1152 Bps 이다. // #define UART_FIFO_USE // #define UART_INTERRUPT_ENABLE void UART_ISR(void) main() *R_PAF4 = F_PAF4 TX F_PAF4_1_RX; *R_ULC = F_ULC_DLAB F_ULC_WLS_8; *R_UDLL = x1a; *R_UDLM = ; *R_ULC &= ~(F_ULC_DLAB); #ifdef UART_FIFO_USE *R_UFC = F_UFC_XFR F_UFC_RFR F_UFC_FIFOEN; #else *R_UFC = F_UFC_XFR F_UFC_RFR; #endif #ifdef UART_INTERRUPT_ENABLE *R_UIE = (F_UIE_RLSIEN F_UIE_THEIEN F_UIE_RDAIEN); setinterrupt(intnum_uart, UART_ISR); EnableInterrupt(INTNUM_UART, TRUE); #else *R_UIE &= ~(F_UIE_RLSIEN F_UIE_THEIEN F_UIE_RDAIEN); #endif *R_PAF4 Port Alternate Function Register 는 SDK/include/CANTUS/paf.h 에 #define R_PAF4 ((volatile unsigned int*)x823) #define F_PAF4 TX ( << ) #define F_PAF4_1_RX ( << 2) 로정의되어있다. 여기서는 Port Alternate Function Register 4 에 F_PAF4 TX, F_PAF4_1_RX 를대입하여 Port 4 의 번을 TX 로 1 번을 RX 로설정한다. Advanced Digital Chips Inc. AN_5B_UART 11
Ver 1.1 CANTUS Application Note *R_ULC UART Channel Line Control Register 는 SDK/include/CANTUS/uart.h 에 #define R_ULC ((volatile unsigned int*)x8214c) #define F_ULC_DLAB ( 1<< 7) #define F_ULC_WLS_8 ( 3<< ) 로정의되어있다. 여기서는 UART Channel Line Control Register 에 (F_ULC_DLAB F_ULC_WLS_8) 을대입하여 R_UDLL 과 R_UDLM 에접근가능토록설정하고, UART 를 None Parity, 1 Stop bit, 8 bits/character 로설정 한다. R_UDLL 과 R_UDLM 에접근이끝나면 R_ULC 의 DLAB 를 로써야이후 R_UFC, R_UIE, R_UII, R_URB, R_UTH 에접근할수있다. *R_UDLL UART Channel Divisor Latch LSB Register 는 SDK/include/CANTUS/uart.h 에 #define R_UDLL ((volatile unsigned int*)x8214) 로정의되어있다. 여기서는 UART Channel Divisor Latch LSB Register 에 UART Baud Rate 설정을위한 UDL 의하위 8 bits 를 쓴다. *R_UDLM UART Channel Divisor Latch MSB Register 는 SDK/include/CANTUS/uart.h 에 #define R_UDLM ((volatile unsigned int*)x82144) 로정의되어있다. 여기서는 UART Channel Divisor Latch MSB Register 에 UART Baud Rate 설정을위한 UDL 의상위 8 bits 를쓴다. *R_UFC UART Channel FIFO Control Register 는 SDK/include/CANTUS/uart.h 에 #define R_UART_FC7 ((volatile unsigned int*)x82148) #define F_UFC_XFR ( 1<< 2) #define F_UFC_RFR ( 1<< 1) #define F_UFC_FIFOEN ( 1<< ) 로정의되어있다. 여기서는 UART Channel FIFO Control Register 에 (F_UFC_XFR F_UFC_RFR F_UFC_FIFOEN) 을 대입하여 RCVR FIFO 와 XMIT FIFO 를 Reset 시키고 FIFO Enable Mode 로설정한다. 12 AN_5B_UART Advanced Digital Chips Inc.
CANTUS Application Note Ver 1.1 *R_UIE UART Channel Interrupt Enable Register 는 SDK/include/CANTUS/uart.h 에 #define R_UIE ((volatile unsigned int*)x82144) #define F_UIE_RLSIEN ( 1<< 2) #define F_UIE_THEIEN ( 1<< 1) #define F_UIE_RDAIEN ( 1<< ) 로정의되어있다. 여기서는 UART Channel Interrupt Enable Register 에 (F_UIE_RLSIEN F_UIE_THEIEN F_UIE_RDAIEN) 를대입하여 Receiver Line Status Interrupt, Transmitter Holding Empty Interrupt, Received Data Available Interrupt 를 Enable 로설정하거나 ~(F_UIE_RLSIEN F_UIE_THEIEN F_UIE_RDAIEN) 를대입하여 Disable 로설정한다. UART Interrupt 가발생하면 UxII 를읽어 Interrupt Type 을판단할수있다. setinterrupt() setinterrupt() 는 SDK/include/CANTUS /interrupt.h 에 BOOL setinterrupt(interrupt_type intnum, void (*fp)()); 로선언되어있고, SDK/Library/interrupt.c 에 BOOL setinterrupt (INTERRUPT_TYPE intnum, void (*fp)()) if (intnum >= INTNUM_MAX) return FALSE; UserVector_table[intnum]=fp; return TRUE; 로정의되어있다. interrupt 에관련된내용은 AN_24_INTERRUPT 를참조하라. Advanced Digital Chips Inc. AN_5B_UART 13
Ver 1.1 CANTUS Application Note EnableInterrupt() EnableInterrupt() 는 SDK/include/CANTUS/interrupt.h에 void EnableInterrupt(INTERRUPT_TYPE num, BOOL b); 로선언되어있고, SDK/Library/interrupt.c 에 void EnableInterrupt(INTERRUPT_TYPE num, BOOL b) CRITICAL_ENTER(); if (!b) //disable *R_INTEN &= (~(1 << num)); *R_INTMASKCLR = ( 1 << num); else *R_INTMASKSET = (1 << num); *R_INTEN = ( 1 << num); CRITICAL_EXIT(); 로정의되어있다. interrupt 에관련된내용은 AN_14_INTERRUPT 를참조한다. 14 AN_5B_UART Advanced Digital Chips Inc.
CANTUS Application Note Ver 1.1 3 UART Transmit 3.1 Register Set CANTUS 의 UART 전송은 UxLS 의 THRE 가 Set 되어있는상태에서, UxTH 에 Data 를씀으로써이루어진다. UxIE.THEIEN 이설정되어있다면 Interrupt 를사용할수있다. 이를위한 Register 설정은다음과같다. 그림 3-1 UART Data Transmission Register Set START START Read UxLS Read UxLS 1 == THRE 1 == THRE Write UxTH Write UxTH Read UxLS Read INTPEND 1 == TEMP == UARTx Vector END Write UxTH Write PENDCLR END Advanced Digital Chips Inc. AN_5B_UART 15
Ver 1.1 CANTUS Application Note UxLS (UART Channel Line Status Register) UxLS를읽어 UART의상태를판단한다. THRE는 FIFO Mode가아닌경우 THR의 Data가 TSR로전송되어비어있음을의미한다. THRE가 Set되어있을때송신할 Data를 UxTH에쓴다. FIFO Mode에서는 Transmitter FIFO의마지막 Data가 TSR로옮겨져비어있음을나타낸다. TEMP는 FIFO Mode가아닌경우 THR의 Data가 TSR을통해상대방에송신되어 THR과 TSR이비어있음을나타낸다. FIFO Mode에서는 Transmitter FIFO의 Data가 TSR을통해상대방에송신되어 Transmitter FIFO와 TSR이비어있음을나타낸다. UxTH (UART Channel Transmitter Holding Register) UART로전송할 Data를쓴다. FIFO Enable이면 Transmitter FIFO에써지며, 이 Data는 TSR을통해전송된다. UART 전송에 Interrupt를사용할경우, Interrupt Request가발생하면 FIFO Size만큼 UxTH에전송할 Data를쓴다. 표 3-1 UART Channel Transmitter Holding Register (UxTH) Bit R/W Description Default Value 31: 8 R Reserved. - 7 : R Transmit Holding Data - *** DLAB가 일때 Access 가능하다. 16 AN_5B_UART Advanced Digital Chips Inc.
CANTUS Application Note Ver 1.1 표 3-2 UART Channel Line Status Register (UxLS) Bit R/W Description Default Value 31 : 8 R Reserved. - 7 R EIRF : Error in RCVR FIFO FIFO 모드가아닌경우 EIRF는항상 이다. FIFO 모드에서 EIRF는 RCVR FIFO 내에서 OE, PE, FE, BI 중어느하나라도 1 이설정되면, 1 이된다. EIRF는만약 FIFO 내에연속적인에러가없다면, LSR 레지스터를읽었을때 Clear( ) 된다. 6 R TEMP : Transmitter Empty 1 FIFO 모드가아닌경우 TEMP는 Transmitter Holding Register (THR) 와 Transmitter Shift Register(TSR) 이모두 Empty일때 1 이된다. THR 또는 TSR에데이터가있으면 Clear된다. FIFO 모드에서는, TEMP는 Transmitter FIFO와 TSR이모두 Empty일때 1 이된다. 5 R THRE : Transmitter Holding Register Empty 1 FIFO 모드가아닌경우 THRE는 THR의데이터가 TSR로전송되어 Empty가되었을때 1 이되며, THR에전송을위한새로운데이터를쓸수있다. FIFO 모드에서는 Transmit FIFO가 Empty일때 THRE가 1 이되며, 적어도하나의 Byte라도 Transmit FIFO에써지면 Clear된다. 만약 THRE interrupt(ethrei) 가 1 이고 THRE가 1 이라면 Interrupt가발생한다. 4 R BINT : Break Interrupt : 수신되는입력데이터가 Full-word 전송시간동안 일때 BI는 1 이된다. Full-word 전송시간은 Start, Data, Parity 그리고 Stop 비트전송을위한전체시간을의미한다. FIFO 모드에서이에러는 FIFO 내의각각의 Byte에적용되며, BI가발생했을때 FIFO에는 이써진다. CPU가 LSR을읽어을때 Clear 된다. 3 R FERR : Framing Error FE는수신되는입력데이터가유효한 Stop 비트를가지지않았을때 1 이된다. FIFO 모드에서이에러는 FIFO 내의각각의 Byte에적용된다. CPU가 LSR을읽어을때 Clear 된다. 2 R PERR : Parity Error PE는수신되는입력데이터가 LCR 레지스터에의해선택된 Parity 비트와같지않을때 1 이된다. FIFO 모드에서이에러는 FIFO 내의각각의 Byte에적용된다. CPU가 LSR을읽어을때 Clear 된다. 1 R OERR : Overrun Error OE는, FIFO 모드가아닌경우, RBR 내의데이터를읽어가기전에새로운데이터가써진경우 1 이된다. FIFO 모드에서는 FIFO가 Full 상태에서 Receiver Shift Register(RSR) 에새로운 Full-word가들어왔을때 1 이된다. 이경우 RSR은새로운데이터로계속갱신이되지만, FIFO로전송은되지않는다. CPU가 LSR을읽어을때 Clear 된다. R DRDY : Data Ready DR은수신된데이터가 RBR 또는 FIFO에써졌을때 1 이된다. RBR 또는 FIFO 내의모든데이터가 CPU에의해읽혀졌을때 Clear된다. Advanced Digital Chips Inc. AN_5B_UART 17
Ver 1.1 CANTUS Application Note INTPEND (Interrupt Pending Register) INTEN 에설정된 Interrupt Vector 의 Interrupt Event 를기록한다. 표 3-3 Interrupt Pending Register (INTPEND) Bit R/W Description Default Value 31 R Vector No. x3f Interrupt Pending bit - 3 R Vector No. x3e Interrupt Pending bit - 29 R Vector No. x3d Interrupt Pending bit - 28 R Vector No. x3c Interrupt Pending bit - 27 R Vector No. x3b Interrupt Pending bit - 26 R Vector No. x3a Interrupt Pending bit - 25 R Vector No. x39 Interrupt Pending bit - 24 R Vector No. x38 Interrupt Pending bit - 23 R Vector No. x37 Interrupt Pending bit - 22 R Vector No. x36 Interrupt Pending bit - 21 R Vector No. x35 Interrupt Pending bit - 2 R Vector No. x34 Interrupt Pending bit - 19 R Vector No. x33 Interrupt Pending bit - 18 R Vector No. x32 Interrupt Pending bit - 17 R Vector No. x31 Interrupt Pending bit - 16 R Vector No. x3 Interrupt Pending bit - 15 R Vector No. x2f Interrupt Pending bit - 14 R Vector No. x2e Interrupt Pending bit - 13 R Vector No. x2d Interrupt Pending bit - 12 R Vector No. x2c Interrupt Pending bit - 11 R Vector No. x2b Interrupt Pending bit - 1 R Vector No. x2a Interrupt Pending bit - 9 R Vector No. x29 Interrupt Pending bit - 8 R Vector No. x28 Interrupt Pending bit - 7 R Vector No. x27 Interrupt Pending bit - 6 R Vector No. x26 Interrupt Pending bit - 5 R Vector No. x25 Interrupt Pending bit - 4 R Vector No. x24 Interrupt Pending bit - 3 R Vector No. x23 Interrupt Pending bit - 2 R Vector No. x22 Interrupt Pending bit - 1 R Vector No. x21 Interrupt Pending bit - R Vector No. x2 Interrupt Pending bit - *** Interrupt Pending Register 의각비트의값은해당인터럽트가발생하였음을나타낸다. Interrupt Pending Register 의값은 Interrupt Pending Clear 레지스터에의해 Clear 된다. 일반적으로해당 Interrupt 가끝날때 Clear 한다. 18 AN_5B_UART Advanced Digital Chips Inc.
CANTUS Application Note Ver 1.1 PENDCLR (Interrupt Pending Clear Register) Interrupt Vector Number 값으로 Write 하여 INTPEND 의 Event 를 Clear 한다. INTPEND 를 Clear 하지않으면더 이상 Core 에 Interrupt Request 를발생하지않는다. 표 3-4 Interrupt Pending Register (PENDCLR) Bit R/W Description Default Value 31 : 8 R Reserved - 7 : W Interrupt Pending Register Clear Value (x2 ~ x3f) xff *** Interrupt Pending Register 를 Clear 하기위해서는 Interrupt Vector No. 값으로 Write 한다. Advanced Digital Chips Inc. AN_5B_UART 19
Ver 1.1 CANTUS Application Note 3.2 Function Set 1 아래는 UART Data 전송의예이다. ULS.THRE 가 Set 되면 UTH 에전송할 Data 를쓴다. Data 전송이완료되면 ULS.TEMP 가 Set 된다. // #define UART_FIFO_USE main() *R_PAF4 = F_PAF4 TX F_PAF4_1_RX; *R_ULC = F_ULC_DLAB F_ULC_WLS_8; *R_UDLL = x1a; *R_UDLM = ; *R_ULC &= ~(F_ULC_DLAB); #ifdef UART_FIFO_USE *R_UFC = F_UFC_XFR F_UFC_RFR F_UFC_FIFOEN; #else *R_UFC = F_UFC_XFR F_UFC_RFR; #endif *R_UIE &= ~(F_UIE_RLSIEN F_UIE_THEIEN F_UIE_RDAIEN); U8 uart_data_tx[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n"; U32 i=,j; U32 data_tx_length; while(1) if(*r_uls & F_ULS_THRE) #ifdef UART_FIFO_USE if(sizeof(uart_data_tx) < UART_FIFO_DEPTH) for(i=;i<sizeof(uart_data_tx);i++) *R_UTH = uart_data_tx[i]; while(!(*r_uls & F_ULS_TEMP)); else data_tx_length = sizeof(uart_data_tx); i=; do if(data_tx_length > UART_FIFO_DEPTH) for(j=;j<uart_fifo_depth;j++) *R_UTH = uart_data_tx[i++]; data_tx_length -= UART_FIFO_DEPTH; else 2 AN_5B_UART Advanced Digital Chips Inc.
CANTUS Application Note Ver 1.1 for(j=;j<data_tx_length;j++) *R_UTH = uart_data_tx[i++]; data_tx_length = ; while(!(*r_uls & F_ULS_TEMP)); while(data_tx_length!=); #else // 1645 UART Mode i=; do *R_UTH = uart_data_tx[i++]; while(!(*r_uls & F_ULS_TEMP)); while(i<sizeof(uart_data_tx)); #endif delayms(5); *R_ULS UART Channel Line Status Register 는 SDK/include/CANTUS/uart.h 에 #define R_ULS ((volatile unsigned int*)x821414) #define F_ULS_THRE ( 1<< 5) #define F_ULS_TEMP ( 1<< 6) 로정의되어있다. 여기서는 R_ULS 를 F_ULS_THRE 와비교하여 Transmitter Holding Register Empty 일때전송할 Data 를 쓰고, F_ULS_TEMP 와비교하여 Transmitter Empty 일때까지기다린다. *R_UTH UART Channel Transmitter Holding Register 는 SDK/include/CANTUS/uart.h 에 #define R_UTH ((volatile unsigned int*)x8214) 로정의되어있다. 여기서는 R_UTH 에전송할 Data 를쓴다. FIFO Enable Mode 에서는 FIFO Size 만큰 Data 를쓴다. Advanced Digital Chips Inc. AN_5B_UART 21
Ver 1.1 CANTUS Application Note 3.3 Function Set 2 아래는 Interrupt 를사용한 UART Data 전송의예이다. ULS.THRE 가 Set 되면 UART Interrupt 를 Enable 하여 Interrupt Request 가발생하면 UTH 에전송할 Data 를쓴다. // #define UART_FIFO_USE volatile U8 uart_data_tx[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n"; volatile U32 i=,j; volatile U32 data_tx_length; void UART_ISR() U32 status; status = (*R_UII & F_UII_INTID); if((f_uii_intid_thr & status) == F_UII_INTID_THR ) #ifdef UART_FIFO_USE if(sizeof(uart_data_tx) < UART_FIFO_DEPTH) for(i=;i<sizeof(uart_data_tx);i++) *R_UTH = uart_data_tx[i]; else if(data_tx_length > UART_FIFO_DEPTH) for(j=;j<uart_fifo_depth;j++) *R_UTH = uart_data_tx[i++]; data_tx_length -= UART_FIFO_DEPTH; else for(j=;j<data_tx_length;j++) *R_UTH = uart_data_tx[i++]; data_tx_length = ; EnableInterrupt(INTNUM_UART,FALSE); #else *R_UTH = uart_data_tx[i++]; if(i==sizeof(uart_data_tx)) i=; EnableInterrupt(INTNUM_UART,FALSE); #endif 22 AN_5B_UART Advanced Digital Chips Inc.
CANTUS Application Note Ver 1.1 main() *R_PAF4 = F_PAF4 TX F_PAF4_1_RX; *R_ULC = F_ULC_DLAB F_ULC_WLS_8; *R_UDLL = x1a; *R_UDLM = ; *R_ULC &= ~(F_ULC_DLAB); #ifdef UART_FIFO_USE *R_UFC = F_UFC_XFR F_UFC_RFR F_UFC_FIFOEN; #else *R_UFC = F_UFC_XFR F_UFC_RFR; #endif *R_UIE = (F_UIE_RLSIEN F_UIE_THEIEN); setinterrupt(intnum_uart, UART_ISR); while(1) if(*r_uls & F_ULS_THRE) #ifdef UART_FIFO_USE i=; data_tx_length = sizeof(uart_data_tx); EnableInterrupt(INTNUM_UART,TRUE); #else // 1645 UART Mode i=; EnableInterrupt(INTNUM_UART,TRUE); #endif *R_UII UART Channel Interrupt Identification Register 는 SDK/include/CANTUS/uart.h 에 #define R_UII ((volatile unsigned int*)x82148) #define F_UII_INTID (15<< ) #define F_UII_INTID_THR ( 2<< ) 로정의되어있다. 여기서는 R_UII 를 F_UII_INTID_THR 과비교하여 Transmitter Holding Register Empty 일때전송할 Data 를쓴다. FIFO Enable 이면 Transmitter FIFO 에써지며, FIFO Size 만큼 UxTH 에전송할 Data 를쓴다 Advanced Digital Chips Inc. AN_5B_UART 23
Ver 1.1 CANTUS Application Note 4 UART Receive 4.1 Register Set CANTUS 의 UART Data 수신은 UxLS 의 DRDY 가 Set 되어있는상태에서, UxRB 를읽음으로써이루어진다. UxIE.RDAIEN 이설정되어있다면 Interrupt 를사용할수있다. 이를위한 Register 설정은다음과같다. 그림 4-1 UART Data Receiving Register Set START START Read UxLS Read INTPEND 1 == DRDY == UARTx Vector Read UxRB Read UxRB END Write PENDCLR END UxLS (UART Channel Line Status Register) UxLS를읽어 UART의상태를판단한다. DRDY는수신된데이터가 UxRB에있음을의미한다. FIFO mode에서는 Receiver FIFO의모든 Data를읽으면 Clear 된다. UxRB (UART Channel Receiver Buffer Register) UART로수신한 Data를읽는다. FIFO Enable이면 Receiver FIFO에서읽게되며, UxLS.DRDY가 Clear될때까지읽는다. 표 4-1 UART Channel Receiver Buffer Register (UxRB) Bit R/W Description Default Value 31: 8 R Reserved. - 7 : R Receive Buffer Data - *** DLAB가 일때 Access 가능하다. 24 AN_5B_UART Advanced Digital Chips Inc.
CANTUS Application Note Ver 1.1 4.2 Function Set 1 아래는 UART Data 수신의예이다. UxLS.DRDY 가 Set 되면 UxRB 를읽는다. // #define UART_FIFO_USE main() *R_PAF4 = F_PAF4 TX F_PAF4_1_RX; *R_ULC = F_ULC_DLAB F_ULC_WLS_8; *R_UDLL = x1a; *R_UDLM = ; *R_ULC &= ~(F_ULC_DLAB); #ifdef UART_FIFO_USE *R_UFC = F_UFC_XFR F_UFC_RFR F_UFC_FIFOEN; #else *R_UFC = F_UFC_XFR F_UFC_RFR; #endif *R_UIE &= ~(F_UIE_RLSIEN F_UIE_THEIEN F_UIE_RDAIEN); U8 uart_data_rx[255]; U8 uart_data_rx_wptr; U8 uart_data_rx_rptr; while(1) if(*r_uls & F_ULS_DRDY) #ifdef UART_FIFO_USE uart_data_rx_wptr=; uart_data_rx_rptr=; do uart_data_rx[uart_data_rx_wptr++] = *R_URB; while(*r_uls & F_ULS_DRDY); if(*r_uls & F_ULS_THRE) do *R_UTH = uart_data_rx[uart_data_rx_rptr++]; while(!(*r_uls & F_ULS_TEMP)); while(uart_data_rx_rptr<uart_data_rx_wptr); #else // 1645 UART Mode uart_data_rx[] = *R_URB; if(*r_uls & F_ULS_THRE) *R_UTH = uart_data_rx[]; while(!(*r_uls & F_ULS_TEMP)); Advanced Digital Chips Inc. AN_5B_UART 25
Ver 1.1 CANTUS Application Note #endif *R_ULS UART Channel Line Status Register 는 SDK/include/CANTUS/uart.h 에 #define R_ULS ((volatile unsigned int*)x821414) #define F_ULS_DRDY ( 1<< ) 로정의되어있다. 여기서는 UART Channel Line Status Register 를 F_ULS_DRDY 와비교하여 Data Ready 인지판단한다. *R_URB UART Channel Receiver Buffer Register 는 SDK/include/CANTUS/uart.h 에 #define R_URB ((volatile unsigned int*)x8214) 로정의되어있다. 여기서는 UART Channel Receiver Buffer Register 에수신된 Data 를읽는다. FIFO Enable 이면 UxLS.DRDY 가 (b) 가될때까지 Data 를읽는다. 26 AN_5B_UART Advanced Digital Chips Inc.
CANTUS Application Note Ver 1.1 4.3 Function Set 2 아래는 Interrupt 를사용한 UART Data 수신의예이다. Interrupt Request 가발생하면 URB 를읽는다. // #define UART_FIFO_USE volatile U8 uart_data_rx[255]; volatile U8 uart_data_rx_wptr=; volatile U8 uart_data_rx_rptr=; void UART_ISR() U32 status; status = (*R_UII & F_UII_INTID); if((f_uii_intid_rda & status) == F_UII_INTID_RDA ) #ifdef UART_FIFO_USE do uart_data_rx[uart_data_rx_wptr++] = *R_URB; while(*r_uls & F_ULS_DRDY); #else // 1645 UART Mode uart_data_rx[uart_data_rx_wptr++] = *R_URB; #endif main() *R_PAF4 = F_PAF4 TX F_PAF4_1_RX; *R_ULC = F_ULC_DLAB F_ULC_WLS_8; *R_UDLL = x1a; *R_UDLM = ; *R_ULC &= ~(F_ULC_DLAB); #ifdef UART_FIFO_USE *R_UFC = F_UFC_XFR F_UFC_RFR F_UFC_FIFOEN; #else *R_UFC = F_UFC_XFR F_UFC_RFR; #endif *R_UIE = (F_UIE_RLSIEN F_UIE_RDAIEN); setinterrupt(intnum_uart, UART_ISR); EnableInterrupt(INTNUM_UART, TRUE); while(1) if(*r_uls & F_ULS_THRE) while(uart_data_rx_rptr!=uart_data_rx_wptr) *R_UTH = uart_data_rx[uart_data_rx_rptr++]; while(!(*r_uls & F_ULS_TEMP)); Advanced Digital Chips Inc. AN_5B_UART 27
Ver 1.1 CANTUS Application Note *R_UII UART Channel Interrupt Identification Register 는 SDK/include/CANTUS/uart.h 에 #define R_UII ((volatile unsigned int*)x82148) #define F_UII_INTID (15<< ) #define F_UII_INTID_RDA ( 4<< ) 로정의되어있다. 여기서는 R_UII 를 F_UII_INTID_RDA 와비교하여 Receiver Data Available 일때수신된 Data 를읽는다. *R_URB 여기서는 UART Interrupt Request 가발생하면 UART Channel Receiver Buffer Register 에수신된 Data 를 읽는다. FIFO Enable 이면 UxLS.DRDY 가 (b) 가될때까지 Data 를읽는다. 28 AN_5B_UART Advanced Digital Chips Inc.