Issue in MODBUS

Hello Nordic Team ,

I am working on Nrf connect sdk v2.9.0 in this i m getting issue in Modbus RTU server [Slave] can you check my conf and code  

To check my code i use Q MODMASTER software Tool to give request my device which is Slave but it did not go the Holding reg call back 

I Check with Logic analyzer but the pin of DE is not drive Could you help me 

Prj conf 

CONFIG_UART_CONSOLE=n
CONFIG_UART_USE_RUNTIME_CONFIGURE=y

#CONFIG_SYSTEM_WORKQUEUE=y
CONFIG_PM=y


CONFIG_SERIAL=y
CONFIG_MODBUS=y
CONFIG_MODBUS_SERIAL=y
CONFIG_MODBUS_ROLE_SERVER=y

Code 

/* ─────────────────────────────────────────────
 *  Modbus RTU Server (RS485)
 * ───────────────────────────────────────────── */
#include <zephyr/modbus/modbus.h>


static int holding_reg_rd(uint16_t addr, uint16_t *reg)
{
    if (addr == 0) {
        *reg = ((uint16_t)chock_char_data[0] << 8) | chock_char_data[1];
        return 0;
    }
    return -ENOTSUP;
}

static struct modbus_user_callbacks mbc = {
    .holding_reg_rd = holding_reg_rd,
};

static int modbus_server_init(void)
{
    /* Configure DE pin as output, start LOW (receive mode) */
    /*int err = gpio_pin_configure(gpio0_dev, MODBUS_DE_PIN,
                                 GPIO_OUTPUT_INACTIVE);
    if (err) {
        LOG_ERR("Failed to configure Modbus DE pin (err %d)", err);
        return err;
    }*/
    int err ;

    const struct modbus_iface_param server_param = {
        .mode = MODBUS_MODE_RTU,
        .server = {
            .user_cb = &mbc,
            .unit_id = 1,
        },
        .serial = {
            .baud             = 9600,
            .parity           = UART_CFG_PARITY_NONE,
            .stop_bits_client = UART_CFG_STOP_BITS_1,
           // .de                = modbus_de_set,  /* SW-controlled DE pin */
        },
    };

    int iface = modbus_iface_get_by_name("modbus0");
    if (iface < 0) {
        LOG_ERR("Modbus interface not found (err %d)", iface);
        return iface;
    }

    err = modbus_init_server(iface, server_param);
    if (err) {
        LOG_ERR("modbus_init_server failed (err %d)", err);
    } else {
        LOG_INF("Modbus RTU server initialized (unit_id=1)");
    }
    return err;
}

Overlay 

/*
 * UART0 — Modbus RTU over RS-485
 *
 * The child node 'modbus0' uses the zephyr,modbus-serial compatible.
 * The driver automatically toggles DE/RE at the right time:
 *   - DE (P0.11): asserted HIGH before TX, de-asserted after last byte sent
 *   - RE (P0.12): active-low, asserted (LOW) during RX, de-asserted during TX
 */
&uart0 {
    status = "okay";
    current-speed = <9600>;

    modbus0: modbus0 {
        compatible = "zephyr,modbus-serial";
        status = "okay";
        de-gpios = <&gpio0 17 GPIO_ACTIVE_HIGH>;
        re-gpios = <&gpio0 19 GPIO_ACTIVE_LOW>;
    };
};

Related