Skip to content

添加自定义ACK数据功能 #2

@singoonhe

Description

@singoonhe
  1. 在_config函数中添加启用ACK回复功能
    // 启用ACK负载功能
    if (params->enable_ack && params->enable_dynpd) {
    feature_reg |= (1 << EN_ACK_PAY); // 启用ACK回复
    ret += _reg_write(si, SI24_REG_FEATURE, &feature_reg, 1);
    }

  2. 为接收端添加写入ack函数,可在接收数据回调中调用
    size_t si24_write_ack_payload(si24_t* si, const unsigned char * buf, size_t size)
    {
    if (si->opts->mode != RECV_MODE)
    return -1;

    if (size > 32) size = 32; // 最大32字节

    return _reg_write(si, SI24_W_ACK_PAYLOAD, buf, size);
    }

  3. 为发送端添加读取ack回复函数
    // 读取ACK负载内容
    size_t si24_read_ack_payload(si24_t* si, uint8_t *buf, size_t size)
    {
    if (si->opts->mode != SEND_MODE)
    return -1;

    uint8_t status;
    _reg_read(si, SI24_REG_STATUS, &status, 1);
    // 如果 RX_DR (0x40) 为 1,说明硬件收到了 ACK Payload
    if (!(status & (1 << RX_DR))) {
    return 0;
    }

    uint8_t rx_pl_wid = 0;
    _reg_read(si, SI24_RX_PL_WID, &rx_pl_wid, 1);

    if (rx_pl_wid == 0 || rx_pl_wid > 32) {
    // 如果长度异常(比如0或大于32),通常是 SPI 干扰或配置不对
    uint8_t flush_cmd = SI24_FLUSH_RX;
    si->ctl->write_and_read(&flush_cmd, 1);
    return -1;
    }
    // 读取 ACK Payload 数据
    size_t ret = _reg_read(si, SI24_R_RX_PAYLOAD, buf, (rx_pl_wid > size ? size : rx_pl_wid));

    // 清除 RX_DR 标志以便下次接收
    uint8_t rx_flag = RX_DR;
    _reg_write(si, SI24_REG_STATUS, &rx_flag, 1);

    return rx_pl_wid;
    }

  4. 在si24_send函数中添加ack回复读取函数调用
    // 读取ack负载并保存
    if (si->opts->enable_ack && si->opts->enable_dynpd)
    {
    int ack_len = si24_read_ack_payload(si, si->ack_payload, sizeof(si->ack_payload));
    if (ack_len < sizeof(si->ack_payload)) {
    si->ack_payload[ack_len] = '\0';
    }
    }

     // 以下是原si24_send方法内容
    

    flags |= (1 << TX_DS);
    _reg_write(si, SI24_REG_STATUS, &flags, 1);
    _reg_read(si, SI24_REG_STATUS, &flags, 1);
    bytes_sent += sz;
    timeout = 0;

至此,si->ack_payload中即为ack回复的内容,发送方随时可读取

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions