mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-30 18:57:19 +02:00
freemodbus: fix issues when modbus master and slave work simultaneously (backport v4.3)
This commit is contained in:
committed by
Jiang Jiang Jian
parent
625bd4f767
commit
4f716817e0
@ -187,25 +187,40 @@ menu "Modbus configuration"
|
|||||||
Modbus stack event processing time.
|
Modbus stack event processing time.
|
||||||
|
|
||||||
config FMB_TIMER_PORT_ENABLED
|
config FMB_TIMER_PORT_ENABLED
|
||||||
bool "Modbus slave stack use timer for 3.5T symbol time measurement"
|
bool "Modbus stack use timer for 3.5T symbol time measurement"
|
||||||
default n
|
default n
|
||||||
help
|
help
|
||||||
If this option is set the Modbus stack uses timer for T3.5 time measurement.
|
If this option is set the Modbus stack uses timer for T3.5 time measurement.
|
||||||
Else the internal UART TOUT timeout is used for 3.5T symbol time measurement.
|
Else the internal UART TOUT timeout is used for 3.5T symbol time measurement.
|
||||||
|
|
||||||
config FMB_TIMER_GROUP
|
config FMB_TIMER_GROUP
|
||||||
int "Modbus Timer group number"
|
int "Slave Timer group number"
|
||||||
range 0 1
|
range 0 1
|
||||||
default 0
|
default 0
|
||||||
help
|
help
|
||||||
Modbus Timer group number that is used for timeout measurement.
|
Modbus slave Timer group number that is used for timeout measurement.
|
||||||
|
|
||||||
config FMB_TIMER_INDEX
|
config FMB_TIMER_INDEX
|
||||||
int "Modbus Timer index in the group"
|
int "Slave Timer index in the group"
|
||||||
range 0 1
|
range 0 1
|
||||||
default 0
|
default 0
|
||||||
help
|
help
|
||||||
Modbus Timer Index in the group that is used for timeout measurement.
|
Modbus slave Timer Index in the group that is used for timeout measurement.
|
||||||
|
|
||||||
|
config FMB_MASTER_TIMER_GROUP
|
||||||
|
int "Master Timer group number"
|
||||||
|
range 0 1
|
||||||
|
default FMB_TIMER_GROUP
|
||||||
|
help
|
||||||
|
Modbus master Timer group number that is used for timeout measurement.
|
||||||
|
|
||||||
|
config FMB_MASTER_TIMER_INDEX
|
||||||
|
int "Master Timer index"
|
||||||
|
range 0 1
|
||||||
|
default FMB_TIMER_INDEX
|
||||||
|
help
|
||||||
|
Modbus master Timer Index in the group that is used for timeout measurement.
|
||||||
|
Note: Modbus master and slave should have different timer index to be able to work simultaneously.
|
||||||
|
|
||||||
config FMB_TIMER_ISR_IN_IRAM
|
config FMB_TIMER_ISR_IN_IRAM
|
||||||
bool "Place timer interrupt handler into IRAM"
|
bool "Place timer interrupt handler into IRAM"
|
||||||
|
@ -54,7 +54,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef MB_PORT_HAS_CLOSE
|
#ifndef MB_PORT_HAS_CLOSE
|
||||||
#define MB_PORT_HAS_CLOSE 0
|
#define MB_PORT_HAS_CLOSE 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* ----------------------- Static variables ---------------------------------*/
|
/* ----------------------- Static variables ---------------------------------*/
|
||||||
|
@ -61,6 +61,8 @@
|
|||||||
|
|
||||||
#define MB_TCP_FRAME_LOG_BUFSIZE (256)
|
#define MB_TCP_FRAME_LOG_BUFSIZE (256)
|
||||||
|
|
||||||
|
#define MB_PORT_HAS_CLOSE (1) // Define to explicitly close port on destroy
|
||||||
|
|
||||||
// Define number of timer reloads per 1 mS
|
// Define number of timer reloads per 1 mS
|
||||||
#define MB_TIMER_TICS_PER_MS (20UL)
|
#define MB_TIMER_TICS_PER_MS (20UL)
|
||||||
|
|
||||||
|
@ -147,8 +147,7 @@ vMBPortTimersDisable(void)
|
|||||||
void vMBPortTimerClose(void)
|
void vMBPortTimerClose(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_FMB_TIMER_PORT_ENABLED
|
#ifdef CONFIG_FMB_TIMER_PORT_ENABLED
|
||||||
ESP_ERROR_CHECK(timer_pause(usTimerGroupIndex, usTimerIndex));
|
ESP_ERROR_CHECK(timer_deinit(usTimerGroupIndex, usTimerIndex));
|
||||||
ESP_ERROR_CHECK(timer_disable_intr(usTimerGroupIndex, usTimerIndex));
|
|
||||||
ESP_ERROR_CHECK(esp_intr_free(xTimerIntHandle));
|
ESP_ERROR_CHECK(esp_intr_free(xTimerIntHandle));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -50,16 +50,13 @@
|
|||||||
#define MB_TIMER_DIVIDER ((TIMER_BASE_CLK / 1000000UL) * MB_TICK_TIME_US - 1) // divider for 50uS
|
#define MB_TIMER_DIVIDER ((TIMER_BASE_CLK / 1000000UL) * MB_TICK_TIME_US - 1) // divider for 50uS
|
||||||
#define MB_TIMER_WITH_RELOAD (1)
|
#define MB_TIMER_WITH_RELOAD (1)
|
||||||
|
|
||||||
// Timer group and timer number to measure time (configurable in KConfig)
|
|
||||||
#define MB_TIMER_INDEX (CONFIG_FMB_TIMER_INDEX)
|
|
||||||
#define MB_TIMER_GROUP (CONFIG_FMB_TIMER_GROUP)
|
|
||||||
|
|
||||||
/* ----------------------- Variables ----------------------------------------*/
|
/* ----------------------- Variables ----------------------------------------*/
|
||||||
static USHORT usT35TimeOut50us;
|
static USHORT usT35TimeOut50us;
|
||||||
|
|
||||||
static const USHORT usTimerIndex = MB_TIMER_INDEX; // Initialize Modbus Timer index used by stack,
|
// Initialize Modbus Timer group and index used by stack
|
||||||
static const USHORT usTimerGroupIndex = MB_TIMER_GROUP; // Timer group index used by stack
|
static const USHORT usTimerIndex = CONFIG_FMB_MASTER_TIMER_INDEX;
|
||||||
static timer_isr_handle_t xTimerIntHandle; // Timer interrupt handle
|
static const USHORT usTimerGroupIndex = CONFIG_FMB_MASTER_TIMER_GROUP;
|
||||||
|
static timer_isr_handle_t xTimerIntHandle; // Timer interrupt handle
|
||||||
|
|
||||||
/* ----------------------- static functions ---------------------------------*/
|
/* ----------------------- static functions ---------------------------------*/
|
||||||
static void IRAM_ATTR vTimerGroupIsr(void *param)
|
static void IRAM_ATTR vTimerGroupIsr(void *param)
|
||||||
@ -193,7 +190,6 @@ vMBMasterPortTimersDisable()
|
|||||||
|
|
||||||
void vMBMasterPortTimerClose(void)
|
void vMBMasterPortTimerClose(void)
|
||||||
{
|
{
|
||||||
ESP_ERROR_CHECK(timer_pause(usTimerGroupIndex, usTimerIndex));
|
ESP_ERROR_CHECK(timer_deinit(usTimerGroupIndex, usTimerIndex));
|
||||||
ESP_ERROR_CHECK(timer_disable_intr(usTimerGroupIndex, usTimerIndex));
|
|
||||||
ESP_ERROR_CHECK(esp_intr_free(xTimerIntHandle));
|
ESP_ERROR_CHECK(esp_intr_free(xTimerIntHandle));
|
||||||
}
|
}
|
||||||
|
@ -173,7 +173,7 @@ static esp_err_t mbc_serial_slave_destroy(void)
|
|||||||
mb_error = eMBClose();
|
mb_error = eMBClose();
|
||||||
MB_SLAVE_CHECK((mb_error == MB_ENOERR), ESP_ERR_INVALID_STATE,
|
MB_SLAVE_CHECK((mb_error == MB_ENOERR), ESP_ERR_INVALID_STATE,
|
||||||
"mb stack close failure returned (0x%x).", (uint32_t)mb_error);
|
"mb stack close failure returned (0x%x).", (uint32_t)mb_error);
|
||||||
|
mbs_interface_ptr = NULL;
|
||||||
vMBPortSetMode((UCHAR)MB_PORT_INACTIVE);
|
vMBPortSetMode((UCHAR)MB_PORT_INACTIVE);
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user