Hellow
I have a project now, using Atmel's AT89C51RE2 as MCU. I've already checked each UART(UART0, UART1) worked alone in mode 1, but I need 2 uarts works simultaneously. I heard for both uarts working, each uart configuration has different baud rate, and different mode, is it correct? anyway, I tried to make uart work in mode 3, but I failed. Could you give me any advice ?? (or eg?)
thank you.
I tried codes below, and saw both uarts(uart0/uart1) were working concurrently. I just made reset each tx interrupt flag(TI_0/TI_1) in different place.
#include <stdio.h> #include <string.h> #include "at89c51re2_2.h" #include "INTRINS.H" #define TRUE 1 #define FALSE 0 #define BUF_SIZE 50 typedef unsigned char Int8; typedef signed char SignedInt8; typedef unsigned short Int16; typedef signed short SignedInt16; typedef unsigned long Int32; typedef signed long SignedInt32; typedef bit Boolean; Int8 serialBuf[BUF_SIZE]; Int8 serialBufPos; Int8 serialByte; Boolean parseCommandFlag = FALSE; Int8 serialBuf1[BUF_SIZE]; Int8 serialBufPos1; Int8 serialByte1; Boolean parseCommandFlag1 = FALSE; void print_Uart0(char *sBuf_0) { while(*sBuf_0 != NULL) { SBUF_0 = *sBuf_0++; } SBUF_0 = 0x0D; } void print_Uart1(char *sBuf_1) { while(*sBuf_1 != NULL) { while(!TI_1); TI_1 = 0; SBUF_1 = *sBuf_1++; } while(!TI_1); TI_1 = 0; SBUF_1 = 0x0D; } void ParseCommand (void) { print_Uart0("\n==Exciter UART0 Test==\n"); memset(serialBuf, 0x00, sizeof(Int8)*BUF_SIZE); serialBufPos = 0; parseCommandFlag = FALSE; } void ParseCommand1(void) { print_Uart1("\n==Exciter UART1 Test==\n"); memset(serialBuf1, 0x00, sizeof(Int8)*BUF_SIZE); serialBufPos1 = 0; parseCommandFlag1 = FALSE; } void main (void) { memset(serialBuf, 0x00, sizeof(Int8)*BUF_SIZE); serialBufPos = 0; memset(serialBuf1, 0x00, sizeof(Int8)*BUF_SIZE); serialBufPos1 = 0; /********* Timer Set ********/ T2CON = 0; BDRCON_0 |= 0x0C; //RBCK_0 = 1, TBCK_0 = 1 BDRCON_1 &= 0xF3; //RBCK_1 = 0, TBCK_1 = 0 TMOD |= 0x20 ; /* Timer 1 in mode 2 */ /****** UART0 ******/ //use internal Baud Rate Generator SCON_0 = 0x50; /* uart0 in mode 1 (8 bit), REN_0=1 */ BDRCON_0 &=0xEC; /* BRR_0=0; SRC_0=0; SPD_0 = 0*/ PCON |= 0x80; /* SMOD1_0 = 1;*/ BRL_0 = 251; /* set 19200, @18.432Mhz (BRL_0=251;SPD_0=1;SMOD1_0=0) */ /****** UART1 ******/ SCON_1 = 0x50; /* uart1 in mode 1 (8 bit), REN_1=1*/ BDRCON_1 |= 0x80; TH1 = 0xFB; /* 19200 Bds at 18.432MHz */ TI_0 = 1; TI_1 = 1; RI_0 = 0; RI_1 = 0; IEN1 |= 0x08; /* Enable serial port1 interrupt */ ES = 1; /* Enable serial port0 interrupt */ EA = 1; /* Enable global interrupt */ BDRCON_0 |=0x10; /* Baud rate generator run*/ TR1 = 1; while(1) { if(parseCommandFlag == TRUE) ParseCommand(); if(parseCommandFlag1 == TRUE) ParseCommand1(); } } void serial0_IT(void) interrupt 4 { if (RI_0 == 1) { RI_0 = 0; serialByte = SBUF_0; /* Read receive data */ if (serialByte == ' ') { /* skip space */ } else if (serialByte == 0x0D) /* CR */ { serialBuf [serialBufPos] = '\0'; parseCommandFlag = TRUE; } else { if ((serialByte >= 'a') && (serialByte <= 'z')) { serialByte -= 0x20; /* 0x20 = 'a' - 'A' */ } serialBuf [serialBufPos] = serialByte; serialBufPos++; } } else if (TI_0 == 1) TI_0 = 0; } void serial1_IT(void) interrupt 10 { if (RI_1 == 1) { RI_1 = 0; serialByte1 = SBUF_1; /* Read receive data */ if (serialByte1 == ' ') { /* skip space */ } else if (serialByte1 == 0x0D) /* CR */ { serialBuf1[serialBufPos1] = '\0'; parseCommandFlag1 = TRUE; } else { if ((serialByte1 >= 'a') && (serialByte1 <= 'z')) { serialByte1 -= 0x20; /* 0x20 = 'a' - 'A' */ } serialBuf1[serialBufPos1] = serialByte1; serialBufPos1++; } } }