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:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user