📄 serial.c
字号:
Uart_Transfer(PORT4);
}
}
}
/******************************************************************************
* Describe: UART 4 Receive ISR
* Input : void
* Output: void
* return: void
******************************************************************************/
void Serial4R(void)
{
byte ch;
if (ri_u4c1) // receive complete
{
if ((u4rbh & 0x80) == 0) // no error occur
{
ch = u4rbl;
Uart_Receive(PORT4, ch);
}
else // error occur when receive, reset it
{
if (oer_u4rb == 1) // overrun error, next valid data received
{ // NOTE: see specification page 144.
if (((rs4_In + 1) & RSBUFLEN4) != rs4_Out)
{
rs4_Buff[rs4_In] = u4rbl;
rs4_In++;
rs4_In &= RSBUFLEN4;
}
}
re_u4c1 = 0; // disable receive
re_u4c1 = 1; // enable receive
}
}
}
/*
********************************************************************************
* Function : Initialize the UART port working mode
* Initial the port working in UART mode,
* Input :
* port -- Uart port no.
* Note: Baud rate 9600bps for default.
*
********************************************************************************
*/
void Uart_Init_Sub(BYTE port)
{
switch(port)
{
case PORT0: /*uart port 0*/
rs0_In = rs0_Out = 0;
wr0_In = wr0_Out = 0;
// /*used for the RS-485 in NE2-GR mainboard, need modify with new HW*/
// RS485EN_DIR = 1;
// RS485_RCV();
/*set pin pull-up/direction register*/
pd6_2 = 0; /* rxd0 p62 input*/
pu20 = 1; /* p60 ~ p63 pull up?*/
/*set A/B/C register */
ps0_3 = 1; // TXD0 output
/*MODE: set data format,set start bit and stop bit*/
u0mr = 0x05;
/* set baud rate: BRG's source and BRG's value*/
u0c0 = 0x10; // f1, CTS/RTS disable, TXEPT = 0;
u0brg = BRG_96; // 9600 bps, 10M
s0tic = 0x05; // set serial IPL,enable interrupt
s0ric = 0x05;
u0c1 = 0x05; // enable TX/RX
// uart0 transmit interrupt cause select bit
u0irs = 1; // cause by TI = 1(transmit complete)
u0rrm = 0; // uart0 continue receive mode
break;
case PORT1: /*uart port 1*/
rs1_In = rs1_Out = 0;
wr1_In = wr1_Out = 0;
/*set pin pull-up/direction register*/
pd6_6 = 0; /* rxd1 p6 input*/
pu21 = 1; /* p60 ~ p63 pull up?*/
/*set A/B/C register */
ps0_7 = 1; // TXD1 output
/*MODE: set data format,set start bit and stop bit*/
// u1mr = 0x05;
/* set baud rate: BRG's source and BRG's value*/
u1c0 = 0x10; // f1, CTS/RTS disable, TXEPT = 0;
u1brg = BRG_96; // 9600 bps, 10M
s1tic = 0x05; // set serial IPL,enable interrupt
s1ric = 0x05;
u1c1 = 0x05; // enable TX/RX
/* uart1 transmit interrupt cause select bit*/
u1irs = 1; // cause by TI = 1(transmit complete)
u1rrm = 0; // uart1 continue receive mode
break;
case PORT2: /*uart port 2*/
rs2_In = rs2_Out = 0;
wr2_In = wr2_Out = 0;
ps1_0 = 1; // set p7_0 TxD3
ps1_1 = 1; // set p7_1 RxD3
// MODE: set data format,set start bit and stop bit
u2mr = 0x05;
// set baud rate: BRG's source and BRG's value
u2c0 = 0x10; // f1, CTS/RTS disable, TXEPT = 0;
u2brg = BRG_96; //BaudRate;
s2tic = 0x05; // set serial IPL,enable interrupt
s2ric = 0x05;
u2c1 = 0x05; // enable TX/RX
// uart3 transmit interrupt cause select bit
u2irs = 1; // 0 means cause by TI = 1(transmit buffer empty)
u2rrm = 0; // uart3 continue receive mode
break;
case PORT3:
rs3_In = rs3_Out = 0;
wr3_In = wr3_Out = 0;
prc2 = 1;
ps3_2 = 1; // set p9_3 TxD3
prc2 = 1;
pd9_1 = 0; // rxd3 p91 input
prc2 = 1;
ps3_1 = 0; // set p9_3 I/O
pu27 = 1; // p90~p93 pull up
// MODE: set data format,set start bit and stop bit
u3mr = 0x05;
// set baud rate: BRG's source and BRG's value
u3c0 = 0x10; // f1, CTS/RTS disable, TXEPT = 0;
u3brg = BRG_96; //BaudRate;
s3tic = 0x05; // set serial IPL,enable interrupt
s3ric = 0x05;
u3c1 = 0x05; // enable TX/RX
// uart3 transmit interrupt cause select bit
u3irs = 1; // 0 means cause by TI = 1(transmit buffer empty)
u3rrm = 0; // uart3 continue receive mode
break;
case PORT4:
rs4_In = rs4_Out = 0; /*buffer clearing*/
wr4_In = wr4_Out = 0;
prc2 = 1;
ps3_6 = 1; // set as TXD4 output
prc2 = 1;
// pd9_7 = 0; //rxd4 p97 input
pd9_7 = 1; //for sample only
prc2 = 1;
ps3_7 = 0; // set as RXD4 input(I/O)
pu27 = 1; // p90~p93 pull up
// MODE: set data format,set start bit and stop bit
u4mr = 0x05;
// set baud rate: BRG's source and BRG's value
u4c0 = 0x10; // f1, CTS/RTS disable, TXEPT = 0;
u4brg = BRG_96; // 9600 bps
s4tic = 0x05; // set serial IPL,enable interrupt
s4ric = 0x05;
u4c1 = 0x05; // enable TX/RX
// uart4 transmit interrupt cause select bit
u4irs = 1; // cause by TI = 1(transmit completed)
u4rrm = 0; // enable continued receive mode
u4smr2 = 0;
break;
}
}
/******************************************************************************
* Describe: UART 0/1 & Serial 4 initial routine
* see 80specification page 143. see hardware page 426./425
* Input : void
* Output: void
* return: void
******************************************************************************/
void InitialSerial(void)
{
Uart_Init_Sub(PORT0);
Uart_Init_Sub(PORT1);
Uart_Init_Sub(PORT2);
Uart_Init_Sub(PORT3);
Uart_Init_Sub(PORT4);
Uart_SetPort(PORT0, NULL, NULL, NULL, NULL);
Uart_SetPort(PORT1, NULL, NULL, NULL, NULL);
Uart_SetPort(PORT2, NULL, NULL, NULL, NULL);
Uart_SetPort(PORT3, NULL, NULL, NULL, NULL);
Uart_SetPort(PORT4, NULL, NULL, NULL, NULL);
}
/******************************************************************************
* Describe: store the receive data to buffer
* Input :
* port -- port index ( 0 -- for port 0 : 1 -- for port 1 )
* out : none
* Note : For WD2-KR, we need convert the port.
* 说明: 这里没有关闭中断是因为它在中断里面调用的语句
******************************************************************************/
void Uart_Data_Store(BYTE port, byte ch)
{
switch(port)
{
case PORT0:
if (((rs0_In + 1) & RSBUFLEN0) != rs0_Out)
{
rs0_Buff[rs0_In] = ch;
rs0_In++;
rs0_In &= RSBUFLEN0;
}
else
{
// rs0_Buff[rs0_In] = ch; /*Discard the latest received data*/
}
break;
case PORT1:
if (((rs1_In + 1) & RSBUFLEN1) != rs1_Out)
{
rs1_Buff[rs1_In] = ch;
rs1_In++;
rs1_In &= RSBUFLEN1;
}
else
{
// rs1_Buff[rs1_In] = ch; /*Discard the latest received data*/
}
break;
case PORT2:
if (((rs2_In + 1) & RSBUFLEN2) != rs2_Out)
{
rs2_Buff[rs2_In] = ch;
rs2_In++;
rs2_In &= RSBUFLEN2;
}
else
{
// rs2_Buff[rs2_In] = ch; /*Discard the latest received data*/
}
break;
case PORT3: /*it is the actual port 3 of MCU*/
if (((rs3_In + 1) & RSBUFLEN3) != rs3_Out)
{
rs3_Buff[rs3_In] = ch;
rs3_In++;
rs3_In &= RSBUFLEN3;
}
else
{
// rs3_Buff[rs3_In] = ch; /*Discard the latest received data*/
}
break;
case PORT4:
if (((rs4_In + 1) & RSBUFLEN4) != rs4_Out)
{
rs4_Buff[rs4_In] = ch;
rs4_In++;
rs4_In &= RSBUFLEN4;
}
else
{
// rs4_Buff[rs4_In] = ch; /*Discard the latest received data*/
}
break;
default:
break;
}
}
/*
不发送数据,仅仅把它给删除:
*/
void Uart_Send_Null(byte port)
{
switch (port) {
case PORT0:
wr0_Out++;
wr0_Out &= WRBUFLEN0;
break;
case PORT1:
wr1_Out++;
wr1_Out &= WRBUFLEN1;
break;
case PORT2:
wr2_Out++;
wr2_Out &= WRBUFLEN2;
break;
case PORT3:
wr3_Out++;
wr3_Out &= WRBUFLEN3;
break;
case PORT4:
wr4_Out++;
wr4_Out &= WRBUFLEN4;
break;
}
}
/*******************************************************************************
* Send data to send register according to the send buffer
*******************************************************************************/
void Uart_Send_Data(byte port)
{
switch(port)
{
case PORT0: /*port 0 sending*/
u0tb = wr0_Buff[wr0_Out];
wr0_Out++;
wr0_Out &= WRBUFLEN0;
uart0_Sending = 1;
break;
case PORT1: /*port 1 sending*/
u1tb = wr1_Buff[wr1_Out];
wr1_Out++;
wr1_Out &= WRBUFLEN1;
uart1_Sending = 1;
break;
case PORT2: /*port 2 sending*/
u2tb = wr2_Buff[wr2_Out];
wr2_Out++;
wr2_Out &= WRBUFLEN2;
uart2_Sending = 1;
break;
case PORT3: /*port 3 sending*/
u3tb = wr3_Buff[wr3_Out]; /*In MCU*/
wr3_Out++;
wr3_Out &= WRBUFLEN3;
uart3_Sending = 1;
break;
case PORT4: /*port 4 sending*/
u4tb = wr4_Buff[wr4_Out];
wr4_Out++;
wr4_Out &= WRBUFLEN4;
uart4_Sending = 1;
break;
default:
break;
}
}
/*****************************************************
* Check and store the scanner input data.
* If the data is the end flag, then set the flag
*====================================================*/
void Uart_Scan_Data_Store(byte port, byte ch)
{
switch(port)
{
case PORT0:
if (((rs0_In + 1) & RSBUFLEN0) != rs0_Out)
{
rs0_Buff[rs0_In] = ch;
rs0_In++;
rs0_In &= RSBUFLEN0;
}
else
{
// rs0_Buff[rs0_In] = ch; /*Discard the latest received data*/
}
break;
case PORT1:
if (((rs1_In + 1) & RSBUFLEN1) != rs1_Out)
{
rs1_Buff[rs1_In] = ch;
rs1_In++;
rs1_In &= RSBUFLEN1;
}
else
{
// rs1_Buff[rs1_In] = ch; /*Discard the latest received data*/
}
break;
case PORT2:
if (((rs2_In + 1) & RSBUFLEN2) != rs2_Out)
{
rs2_Buff[rs2_In] = ch;
rs2_In++;
rs2_In &= RSBUFLEN2;
}
else
{
// rs2_Buff[rs2_In] = ch; /*Discard the latest received data*/
}
break;
case PORT3: /*it is the actual port 3 of MCU*/
if (((rs3_In + 1) & RSBUFLEN3) != rs3_Out)
{
rs3_Buff[rs3_In] = ch;
rs3_In++;
rs3_In &= RSBUFLEN3;
}
else
{
// rs3_Buff[rs3_In] = ch; /*Discard the latest received data*/
}
break;
case PORT4:
if (((rs4_In + 1) & RSBUFLEN4) != rs4_Out)
{
rs4_Buff[rs4_In] = ch;
rs4_In++;
rs4_In &= RSBUFLEN4;
}
else
{
// rs4_Buff[rs4_In] = ch; /*Discard the latest received data*/
}
break;
default:
break;
}
return;
// if (!BarRecFlag)
// {
// CodeBuf[BarCnt] = ch;
// if((CodeBuf[BarCnt] == ETX) || (CodeBuf[BarCnt] == CR))
// {
// BarRecFlag = 1;
// bellcnt = 0xfe;
// }
// else if(CodeBuf[BarCnt] == LF)
// {
// return;
// }
// BarCnt++;
// BarCnt &= BARBUFLEN;
// }
}
/*
*****************************************************************
* Store the Electronic scale data to receive buffer
*
* Note : For WD2-KR, we will not use the electronic scale, so this
* function is not using
****************************************************************/
void Uart_Scale_Data_Store(BYTE port, BYTE ch)
{
port ++;
ch ++; /* To avoid the compilter warnning*/
}
/******************************************************************************
* Describe: UART 0 baudrate Set, if value is not stand baudrate, retrun NG.
* Input : baud --- BRG_96 ~ BRG_576, (BRG_1152 is reserved)
* Output: void
* return: void
******************************************************************************/
byte Uart_SetBaudRate(byte port, word baud)
{
baud = GetBaud(ser_port[port].baud_idx);
if ((baud == BRG_576) || (baud == BRG_384) || (baud == BRG_192) ||
(baud == BRG_96) || (baud == BRG_1152) || (baud == BRG_48))
{
if(port == PORT0)
{
PORT0_re = 0;
PORT0_te = 0;
PORT0_brg = baud;
PORT0_re = 1;
PORT0_te = 1;
return OK;
}
else if(port == PORT1)
{
PORT1_re = 0;
PORT1_te = 0;
PORT1_brg = baud;
PORT1_re = 1;
PORT1_te = 1;
return OK;
}
else if(port == PORT2)
{
PORT2_re = 0;
PORT2_te = 0;
PORT2_brg = baud;
PORT2_re = 1;
PORT2_te = 1;
return OK;
}
else if(port == PORT3)
{
PORT3_re = 0;
PORT3_te = 0;
PORT3_brg = baud;
PORT3_re = 1;
PORT3_te = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -