Added MS/TP tweak to improve byte reception and processing at higher baud rates and larger packet sizes. Thank you Peter Mc Shane!

This commit is contained in:
skarg
2012-03-12 21:26:53 +00:00
parent 9eb0066764
commit 2a51a1db7c
4 changed files with 23 additions and 9 deletions
+6 -2
View File
@@ -1255,11 +1255,15 @@ uint16_t dlmstp_receive(
InputBuffer = pdu; InputBuffer = pdu;
InputBufferSize = max_pdu; InputBufferSize = max_pdu;
} }
/* only do receive state machine while we don't have a frame */ while ((MSTP_Flag.ReceivedValidFrame == false) &&
if ((MSTP_Flag.ReceivedValidFrame == false) &&
(MSTP_Flag.ReceivedValidFrameNotForUs == false) && (MSTP_Flag.ReceivedValidFrameNotForUs == false) &&
(MSTP_Flag.ReceivedInvalidFrame == false)) { (MSTP_Flag.ReceivedInvalidFrame == false)) {
/* only do receive state machine while we don't have a frame */
MSTP_Receive_Frame_FSM(); MSTP_Receive_Frame_FSM();
/* process another byte, if available */
if (!RS485_DataAvailable(NULL)) {
break;
}
} }
if (MSTP_Flag.ReceivedValidFrameNotForUs) { if (MSTP_Flag.ReceivedValidFrameNotForUs) {
MSTP_Flag.ReceivedValidFrameNotForUs = false; MSTP_Flag.ReceivedValidFrameNotForUs = false;
+3 -1
View File
@@ -255,7 +255,9 @@ bool RS485_DataAvailable(
if (RS485_Interface->US_CSR & AT91C_US_RXRDY) { if (RS485_Interface->US_CSR & AT91C_US_RXRDY) {
/* data is available */ /* data is available */
*DataRegister = RS485_Interface->US_RHR; if (DataRegister) {
*DataRegister = RS485_Interface->US_RHR;
}
DataAvailable = true; DataAvailable = true;
/* LED ON */ /* LED ON */
pPIO->PIO_CODR = LED2; pPIO->PIO_CODR = LED2;
+11 -5
View File
@@ -1504,11 +1504,17 @@ uint16_t dlmstp_receive(
if (Receive_State == MSTP_RECEIVE_STATE_IDLE) { if (Receive_State == MSTP_RECEIVE_STATE_IDLE) {
transmitting = MSTP_Transmit_FSM(); transmitting = MSTP_Transmit_FSM();
} }
/* only do receive state machine while we don't have a frame */ if (transmitting == false) {
if ((MSTP_Flag.ReceivedValidFrame == false) && while ((MSTP_Flag.ReceivedValidFrame == false) &&
(MSTP_Flag.ReceivedValidFrameNotForUs == false) && (MSTP_Flag.ReceivedValidFrameNotForUs == false) &&
(MSTP_Flag.ReceivedInvalidFrame == false) && (transmitting == false)) { (MSTP_Flag.ReceivedInvalidFrame == false)) {
MSTP_Receive_Frame_FSM(); /* only do receive state machine while we don't have a frame */
MSTP_Receive_Frame_FSM();
/* process another byte, if available */
if (!rs485_byte_available(NULL)) {
break;
}
}
} }
/* only do master state machine while rx is idle */ /* only do master state machine while rx is idle */
if ((Receive_State == MSTP_RECEIVE_STATE_IDLE) && (transmitting == false)) { if ((Receive_State == MSTP_RECEIVE_STATE_IDLE) && (transmitting == false)) {
+3 -1
View File
@@ -141,7 +141,9 @@ bool rs485_byte_available(
bool data_available = false; /* return value */ bool data_available = false; /* return value */
if (!FIFO_Empty(&Receive_Buffer)) { if (!FIFO_Empty(&Receive_Buffer)) {
*data_register = FIFO_Get(&Receive_Buffer); if (data_register) {
*data_register = FIFO_Get(&Receive_Buffer);
}
timer_elapsed_start(&Silence_Timer); timer_elapsed_start(&Silence_Timer);
data_available = true; data_available = true;
led_rx_on_interval(10); led_rx_on_interval(10);