-
Notifications
You must be signed in to change notification settings - Fork 1
Description
-
在_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);
} -
为接收端添加写入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);
} -
为发送端添加读取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;
} -
在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回复的内容,发送方随时可读取