Nguyên lý của Lab

Một phần của tài liệu Hệ thống nhúng và các Lab cho ARM bản dịch thuật sang tiếng việt (Trang 155 - 161)

Chương 4 Các Lab giao diện cơ bản

3. Chương trình con phục vụ ngắt

4.4 Lab truyền thông cổng nối tiếp

4.4.4 Nguyên lý của Lab

1.ðơn vị truyền thông nối tiếp S3C44BOX UART

ðơn vị S3C44BOX UART ( Universal Asynchronous Reciever and Transmitter) cung cấp hai cổng I/O nối tiếp khụng ủồng bộ ủộc lập, mỗi cổng cú thể hoạt ủộng trong chế ủộ dựa trờn ngắt hoặc DMA. Trong những khối thụng tin khỏc, UART cú thể thực hiện 1 ngắt hoặc yờu cầu DMA ủể chuyển dữ liệu giữa CPU và UART. Nú cú thể hỗ trợ chế ủộ bit lờn ủến 115,2 Kbps. Mỗi kờnh UART bao gồm 2 FIFO 10 byte cho việc truyền và nhận dữ liệu. UART S3C44BOX bao gồm: tốc ủộ truyền thụng cú thể lập trỡnh ủược, miền hồng ngoại truyền/ nhận, một hoặc hai bit stop chốn thờm, ủộ rộng bit dữ liệu 5 bit, 6 bit, 7 bit hoặc 8 bit và kiểm tra chẵn lẻ.

Mỗi UART bao gồm một bộ phỏt súng tốc ủộ truyền thụng bộ, mỏy phỏt, mỏy thu và ủơn vị ủiều khiển như hỡnh 10-1. Mỏy phỏt súng tốc ủộ truyền thụng cú thể bị khúa bởi

MCLK. Máy phát và thu bao gồm FIFOs 16byte và bộ dịch chuyển dữ liệu. Dữ liệu ủược phỏt ủi thỡ ủược viết tới FIFO và sau ủú ủược copy tới bộ dịch chuyển dữ liệu. Sau ủú nú ủược chuyển ra bởi chõn truyền dữ liệu ( TxDn). Dữ liệu ủược nhận dịch chuyển từ chõn nhận dữ liệu ( RxDn) và sau ủú ủược copy tới FIFO từ bộ dịch chuyển.

Hoạt ủộng UART

ðoạn dưới ủõy mụ tả hoạt ủộng UART bao gồm việc truyền dữ liệu, nhận dữ liệu, phỏt sinh ngắt, phỏt sinh tốc ủộ truyền thụng, chế ủộ vũng ngược, chế ủộ miền hồng ngoại và ủiều khiển dũng tự ủộng.

Truyền dữ liệu

Khung truyền dữ liệu cú thể lập trỡnh ủược. Nú bao gồm 1 bit Start, 5 ủến 8 bit dữ liệu , 1 bit lựa chọn chẵn lẻ và 1 ủến 2 bit stop cú thể ủược thiết lập bởi thanh ghi ủiều khiển, ủường dõy ( MCONn). Bộ truyền cú thể cũng tạo ra chế ủộ ngắt. Chế ủộ ngắt cưỡng bức ủầu ra kết nối ủến mức trạng thỏi cho logic O một khoảng thời gian lõu hơn thời gian khung truyền. Tín hiệu ngắt khối truyền này sau khi hệ số truyền hiện tại truyền ủầy ủủ. Sau khi gửi tớn hiệu ngắt, truyền dữ liệu liờn tục tới TXFIFO\

Nhận dữ liệu

Giống như việc truyền, khung nhận dữ liệu cũng cú thể lập trỡnh ủược. Nú bao gồm 1 bit Start, 5 ủến 8 bit dữ liệu,, 1 bit lựa chọn chẵn lẻ, và 1 ủến 2 bit dừng trờn thanh ghi ủiều khiển dũng. Người nhận cú thể phỏt hiện lỗi khởi ủộng quỏ, lỗi chẵn lẻ, lỗi khung và chế ủộ ngắt, mỗi lỗi trong số ủú cú thể tạo một cờ lỗi.

• Lỗi khởi ủộng quỏ chỉ ra rằng dữ liệu mới viết qua dữ liệu cũ trước khi dữ liệu cũ ủược ủọc.

• Lỗi chẵn lẻ chỉ ra rằng người nhận ủó phỏt hiện một chế ủộ chẵn lẻ khụng mong ủợi.

• Lỗi khung truyền chỉ ra rằng dữ liệu ủược nhận khụng cú 1 bit stop hợp lệ.

• Chế ủộ ngắt chỉ ra rằng ủầu vào RxDn giữ ở trạng thỏi logic O trong khoảng thời gian lâu hơn thời gian truyền khung.

Nhận chế ủộ quỏ giờ xảy ra khi nú khụng nhận dữ liệu trong suốt thời gian 3 khối thụng tin và RxFIFO khụng trống trong chế ủộ FIFO

ðiều khiển dũng tự ủộng ( ACF)

S3C44BOX UARTs hỗ trợ ủiều khiển dũng tự ủộng với tớn hiệu n RTs và n CTC, trong trường hợp nó sẽ cần kết nối UART tới UART. Nếu người sử dụng kết nối UART tới

một Modem ,bit ủiều khiển tự ủộng khụng cú tỏc dụng trong thanh ghi UMCONn và ủiều khiển tớn hiệu của nRTs bởi phần mềm.

Sự hỡnh thành tốc ủộ Band:

Thanh ghi bị chia tốc ủộ band (UB, RDIVn), ủiều khiển tốc ủộ band. Tốc ủộ clock Tx/Rx nối tiếp ( tốc ủộ band) ủược tớnh toỏn như sau:

UBRDIVn = ( làm tròn) ( MCLK/( bps x 6))-1

Bộ chia từ 1 ủến ( 216-1). Vớ dụ nếu tốc ủộ Band là 115200 bps và MCLK là 40 MHz, UBRDIVn là:

UBRDIVn= ( phần nguyên) ( 4.107)( 11500x16)+ 0,5)-1

= ( phần n guyên) ( 21,7+ 0,5)-1

= 22-1=21

Chế ủộ loop-back

UART S3C44BOX cung cấp chế ủộ kiểm tra tham chiếu chế ủộ loopback, ủể hỗ trợ trong những lỗi phõn tớch ở link truyền thụng. Trong chế ủộ này, dữ liệu ủược truyền ủi ủược nhận ngay lập tức. ðặc ủiểm này chụ phộp bộ xử lý kiểm tra, truyền và nhận dữ liệu bờn trong mỗi bước kờnh SIO. Chế ủộ này cú thể ủược lựa chọn bởi việc cài ủặt bit loopback trong thanh ghi ủiều khiển UART( UCNONn)

Chế ủộ ngắt

Chế ủộ ngắt ủược ủịnh nghĩa như một tớn hiệu mức thấp liờn tục cho nhiều hơn một thời gian khung truyền trờn ủầu ra dữ liệu truyền

Những thanh ghi ủặc biệt UART ( xem phương thức người sử dụng S3C44BOX) Thanh ghi chính của UART theo như:

( 1) Thanh ghi ủiều khiển lện UART ULCONn. Cú hai thanh ghi ủiều khiển lệnh UART và khối UART. Bit 6 của những thanh ghi này phát hiện dù sử dụng hay không sử dụng chế ủộ miền hồng ngoại. Bit 5-3 phỏt hiện chế ủộ chẵn lẻ. Bit 2 phỏt hiện chiều dài của cỏc bit. Bit 1 và 0 bỏo số lượng bit dữ liệu ủược truyền hoặc nhận trờn 1 khung.

( 2) Thanh ghi ủiều khiển UART ULCONn. Cú hai thanh ghi ủiều khiển UART trong khối UAR ủiều khiển hai kờnh UART. Những thanh ghi này phỏt hiện những chế ủộ UART.

( 3) Thanh ghi ủiều khiển UART FIFO UFCONn và thanh ghi ủiều khiển UART MODEM UMCONn phỏt hiện chế ủộ UART FIFO và chế ủộ Modem. Bit 0 của

UFCONn phỏt hiện dự cho FIFO cú ủược sử dụng hay khụng. Bit 0 của UMCONn ủược gửi bit yêu cầu.

( 4) Những thanh ghi trạng thái Tx/Rx UART UTRSTATn và những thanh ghi trạng thỏi lỗi UART Rx UERSTATn cú thể chỉ ra trạng thỏi ủọc/ viết và cỏc lỗi riờng biệt.

( 5) Thanh ghi trạng thái UART FIFO UFSTATn có thể chỉ ra số lượng byte và FIFO nếu FIFOs ủầy ủủ

(6) Thanh ghi trạng thá Modem UART UMATATn có thể chỉ ra trạng thái CTS hiện tại của MODEM

( 7) Bộ ghi thời gian chiếm kênh phát UART UTXHn và bộ ghi thời gian chiếm kênh thu UART URXHn có thể tổ chức/ chiếm kênh phát/ thu 8 bit dữ liệu

Chỳ ý: Khi lỗi chạy quỏ xảy ra, URXHn phải ủược ủọc. Nếu khụng dữ liệu nhạn tiếp theo cũng sẽ thực hiện một lỗi chạy quỏ mặc dự bit chạy quỏ của USTATn ủó ủược xúa .

(8) Thanh ghi phõn chia tốc ủộ Band UART UBRDIV

Thanh ghi bộ chia tốc ủộ Band ( UBRDIVn) ủiều khiển tốc ủộ Band. Tốc ủộ clock Tx/Rx nối tiếp ( tốc ủộ Band) ủược tớnh toỏn như dưới ủõy:

UBRDIVn= ( làm tròn) ( MCLK/ ( bpsx16)-1 Bộ chia từ 1 ủến ( 216-1)

Vớ dụ nếu tốc ủộ Band là 115200bps và MCLK là 40 MHz thỡ UBRDIVn là:

UBRDIVn= ( Phần nguyên) ( 4.107/115200x16)+ 0,5)-1

= ( Phần nguyên) ( 21,7+ 0,5)-1

= 22-1

= 21

Dưới ủõy giới thiệu thanh ghi ủược ủịnh nghĩa sử dụng trong ...\ common\ 44b.h

#ifdef __BIG_ENDIAN

#define rUTXH0 (*(volatile unsigned char *)0x1d00023)

#define rUTXH1 (*(volatile unsigned char *)0x1d04023)

#define rURXH0 (*(volatile unsigned char *)0x1d00027)

#define rURXH1 (*(volatile unsigned char *)0x1d04027)

#define WrUTXH0(ch) (*(volatile unsigned char *)(0x1d00023))=(unsigned char)(ch)

#define WrUTXH1(ch) (*(volatile unsigned char *)(0x1d04023))=(unsigned char)(ch)

#define RdURXH0() (*(volatile unsigned char *)(0x1d00027))

#define RdURXH1() (*(volatile unsigned char *)(0x1d04027))

#define UTXH0 (0x1d00020+3) //byte_access address by BDMA

#define UTXH1 (0x1d04020+3)

#define URXH0 (0x1d00024+3)

#define URXH1 (0x1d04024+3)

#else //Little Endian

#define rUTXH0 (*(volatile unsigned char *)0x1d00020)

#define rUTXH1 (*(volatile unsigned char *)0x1d04020

#define rURXH0 (*(volatile unsigned char *)0x1d00024)

#define rURXH1 (*(volatile unsigned char *)0x1d04024)

#define WrUTXH0(ch) (*(volatile unsigned char *)0x1d00020)=(unsigned char)(ch)

#define WrUTXH1(ch) (*(volatile unsigned char *)0x1d04020)=(unsigned char)(ch)

#define RdURXH0() (*(volatile unsigned char *)0x1d00024)

#define RdURXH1() (*(volatile unsigned char *)0x1d04024)

#define UTXH0 (0x1d00020) //byte_access address by BDMA

#define UTXH1 (0x1d04020)

#define URXH0 (0x1d00024)

#define URXH1 (0x1d04024)

#endif

(1)chương trình khởi tạo UART:

static int whichUart=0;

void Uart_Init(int mclk, int baud) {

int i;

if(mclk == 0) mclk=MCLK;

rUFCON0=0x0; //FIFO disable rUFCON1=0x0;

rUMCON0=0x0;

rUMCON1=0x0;

//UART0

rULCON0=0x3; //Normal,No parity,1 stop,8 bit

rUCON0=0x245; //rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling

rUBRDIV0=( (int)(mclk/16./baud + 0.5) -1 );

//UART1

rULCON1=0x3;

rUCON1=0x245;

rUBRDIV1=( (int)(mclk/16./baud + 0.5) -1 );

for(i=0;i<100;i++);

}

(2)Chương trình nhận kí tự : char Uart_Getch(void)

{

if(whichUart==0) {

while(!(rUTRSTAT0 & 0x1)); //Receive data read return RdURXH0();

} else {

while(!(rUTRSTAT1 & 0x1)); //Receive data ready return rURXH1;

} }

(3)chương trình gửi kí tự:

void Uart_SendByte(int data) {

if(whichUart==0) {

if(data=='\n') {

while(!(rUTRSTAT0 & 0x2));

Delay(10); //because the slow response of hyper_terminal WrUTXH0('\r');

}

while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.

Delay(10);

WrUTXH0(data);

} else {

if(data=='\n') {

while(!(rUTRSTAT1 & 0x2));

Delay(10); //because the slow response of hyper_terminal rUTXH1='\r';

}

while(!(rUTRSTAT1 & 0x2)); //Wait until THR is empty.

Delay(10);

rUTXH1=data;

} }

Một phần của tài liệu Hệ thống nhúng và các Lab cho ARM bản dịch thuật sang tiếng việt (Trang 155 - 161)

Tải bản đầy đủ (PDF)

(299 trang)