Added frame and overrun error detection into AT91SAM7S port of MS/TP.

This commit is contained in:
skarg
2007-08-20 16:33:29 +00:00
parent 4980eb8b2e
commit 1d46e28189
+14 -6
View File
@@ -80,6 +80,7 @@ void RS485_Initialize(void)
RS485_Interface->US_CR = RS485_Interface->US_CR =
AT91C_US_RSTRX | /* Reset Receiver */ AT91C_US_RSTRX | /* Reset Receiver */
AT91C_US_RSTTX | /* Reset Transmitter */ AT91C_US_RSTTX | /* Reset Transmitter */
AT91C_US_RSTSTA | /* Clear status register */
AT91C_US_RXDIS | /* Receiver Disable */ AT91C_US_RXDIS | /* Receiver Disable */
AT91C_US_TXDIS; /* Transmitter Disable */ AT91C_US_TXDIS; /* Transmitter Disable */
@@ -92,6 +93,9 @@ void RS485_Initialize(void)
/* set the Time Guard to release RTS after x bit times */ /* set the Time Guard to release RTS after x bit times */
RS485_Interface->US_TTGR = 4; RS485_Interface->US_TTGR = 4;
/* Receiver Time-out disabled */
RS485_Interface->US_RTOR = 0;
/* baud rate */ /* baud rate */
RS485_Interface->US_BRGR = MCK/16/RS485_Baud; RS485_Interface->US_BRGR = MCK/16/RS485_Baud;
@@ -195,14 +199,18 @@ void RS485_Check_UART_Data(struct mstp_port_struct_t *mstp_port)
{ {
volatile AT91PS_PIO pPIO = AT91C_BASE_PIOA; volatile AT91PS_PIO pPIO = AT91C_BASE_PIOA;
/* FIXME: Framing or overrun error? */
if (mstp_port->ReceiveError == true) { if (mstp_port->ReceiveError == true) {
/* wait for state machine to clear this */ /* wait for state machine to clear this */
} } else if (mstp_port->DataAvailable == false) {
/* wait for state machine to read from the DataRegister */ /* check for data or error */
else if (mstp_port->DataAvailable == false) { if (RS485_Interface->US_CSR & (AT91C_US_OVRE | AT91C_US_FRAME)) {
/* check for data */ /* clear the error flag */
if ( RS485_Interface->US_CSR & AT91C_US_RXRDY) { RS485_Interface->US_CR = AT91C_US_RSTSTA;
mstp_port->ReceiveError = true;
/* LED ON */
pPIO->PIO_CODR = LED2;
} else if ( RS485_Interface->US_CSR & AT91C_US_RXRDY) {
/* data is available */
mstp_port->DataRegister = RS485_Interface->US_RHR; mstp_port->DataRegister = RS485_Interface->US_RHR;
mstp_port->DataAvailable = true; mstp_port->DataAvailable = true;
/* LED ON */ /* LED ON */