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;
InputBufferSize = max_pdu;
}
/* only do receive state machine while we don't have a frame */
if ((MSTP_Flag.ReceivedValidFrame == false) &&
while ((MSTP_Flag.ReceivedValidFrame == false) &&
(MSTP_Flag.ReceivedValidFrameNotForUs == false) &&
(MSTP_Flag.ReceivedInvalidFrame == false)) {
/* only do receive state machine while we don't have a frame */
MSTP_Receive_Frame_FSM();
/* process another byte, if available */
if (!RS485_DataAvailable(NULL)) {
break;
}
}
if (MSTP_Flag.ReceivedValidFrameNotForUs) {
MSTP_Flag.ReceivedValidFrameNotForUs = false;
+3 -1
View File
@@ -255,7 +255,9 @@ bool RS485_DataAvailable(
if (RS485_Interface->US_CSR & AT91C_US_RXRDY) {
/* data is available */
*DataRegister = RS485_Interface->US_RHR;
if (DataRegister) {
*DataRegister = RS485_Interface->US_RHR;
}
DataAvailable = true;
/* LED ON */
pPIO->PIO_CODR = LED2;
+11 -5
View File
@@ -1504,11 +1504,17 @@ uint16_t dlmstp_receive(
if (Receive_State == MSTP_RECEIVE_STATE_IDLE) {
transmitting = MSTP_Transmit_FSM();
}
/* only do receive state machine while we don't have a frame */
if ((MSTP_Flag.ReceivedValidFrame == false) &&
(MSTP_Flag.ReceivedValidFrameNotForUs == false) &&
(MSTP_Flag.ReceivedInvalidFrame == false) && (transmitting == false)) {
MSTP_Receive_Frame_FSM();
if (transmitting == false) {
while ((MSTP_Flag.ReceivedValidFrame == false) &&
(MSTP_Flag.ReceivedValidFrameNotForUs == false) &&
(MSTP_Flag.ReceivedInvalidFrame == false)) {
/* 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 */
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 */
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);
data_available = true;
led_rx_on_interval(10);