Skip to content

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

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回复的内容,发送方随时可读取

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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