ARM技术论坛
直播中

h1654156005.8547

6年用户 28经验值
擅长:嵌入式技术 RF/无线
私信 关注
[资料]

SI24R1芯片驱动+STM32103C8T6

SI24R1 无线通信模块开发
在嵌入式系统中,无线通信模块的应用越来越广泛。SI24R1 是一款高性能的 2.4GHz 无线收发芯片,支持多种通信模式和功能,适用于遥控、传感器数据传输等多种应用场景。本文将基于附件资源 [Int_SI24R1.c]和 [Int_SI24R1.h]文件中的代码实现,介绍如何使用 SI24R1 模块进行开发,并提供一些调试经验和优化建议。


一、SI24R1 简介与硬件配置
1.1 硬件连接
SI24R1 通过 SPI 接口与主控芯片(如 STM32)进行通信。以下是关键引脚定义:


SPI 接口:SCK、MOSI、MISO
片选信号:NSS(低电平有效)
使能控制:CE(高电平使能发送/接收)
中断输出:IRQ(用于指示数据接收或发送完成)
在代码中,我们通过宏定义对这些引脚进行了封装:


// 引脚控制宏定义
#define NSS_LOW   HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_RESET)
#define NSS_HIGH  HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_SET)


#define CE_ON     HAL_GPIO_WritePin(SI_EN_GPIO_Port, SI_EN_Pin, GPIO_PIN_SET)
#define CE_OFF    HAL_GPIO_WritePin(SI_EN_GPIO_Port, SI_EN_Pin, GPIO_PIN_RESET)
AI写代码
c
运行
1
2
3
4
5
6
1.2 寄存器配置
SI24R1 的寄存器决定了其工作模式和功能。主要配置包括:


信道设置:RF_CH(地址 0x05),频率计算公式为 2400 + Channel_Number (MHz)。
自动重传机制:SETUP_RETR(地址 0x04),设定最大重传次数和每次重传的时间间隔。
CRC 校验:在 CONFIG 寄存器中启用 CRC 校验,确保数据完整性。
ACK 应答机制:通过 EN_AA 寄存器启用自动应答功能。
以下是一个典型的寄存器配置示例:


// 配置 RF 信道
SI24R1_Write_Reg(WRITE_REG_SI24R1 + RF_CH, CHANNEL); // 设置为固定信道


// 启用自动重传
SI24R1_Write_Reg(WRITE_REG_SI24R1 + SETUP_RETR, 0x0A); // 10次重传,间隔250us+86us


// 启用 CRC 校验和自动应答
SI24R1_Write_Reg(WRITE_REG_SI24R1 + CONFIG, 0x0F); // CRC 16位校验
SI24R1_Write_Reg(WRITE_REG_SI24R1 + EN_AA, 0x01);  // 仅启用 Pipe0 自动应答
AI写代码
c
运行
1
2
3
4
5
6
7
8
9
二、SI24R1 初始化与模式切换
2.1 初始化流程
初始化过程包括检查 SI24R1 是否正常通信,并根据需要设置为接收或发送模式。


void SI24R1_Init(uint8_t mode)
{
    Int_Si24R1_Check(); // 检查通信状态


    if (mode == RX_MODE)
    {
        SI24R1_RX_Mode(); // 进入接收模式
        printf("RX_MODE\r\n");
    }
    else if (mode == TX_MODE)
    {
        SI24R1_TX_Mode(); // 进入发送模式
        printf("TX_MODE\r\n");
    }
}
AI写代码
c
运行


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2.2 接收模式配置
接收模式下,需配置接收地址、数据宽度以及使能接收通道:


void SI24R1_RX_Mode(void)
{
    CHIP_DISABLE; // 关闭芯片


    // 设置接收地址
    SI24R1_Write_Buf(WRITE_REG_SI24R1 + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);


    // 启用 Pipe0 自动应答
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + EN_AA, 0x01);


    // 启用 Pipe0 接收
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + EN_RXADDR, 0x01);


    // 设置 RF 信道
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + RF_CH, CHANNEL);


    // 设置数据宽度
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + RX_PW_P0, TX_PLOAD_WIDTH);


    // 设置 RF 参数(2Mbps 数据速率,7dBm 输出功率)
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + RF_SETUP, 0x0F);


    // 启用 CRC 校验
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + CONFIG, 0x0F);


    // 清除所有中断标志
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + STATUS, 0xFF);


    CHIP_ENABLE; // 启动芯片
}
AI写代码
c
运行


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2.3 发送模式配置
发送模式下,需配置发送地址、数据宽度以及自动重传参数:


void SI24R1_TX_Mode(void)
{
    CHIP_DISABLE;


    // 设置发送地址
    SI24R1_Write_Buf(WRITE_REG_SI24R1 + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);


    // 设置接收地址(Pipe0)
    SI24R1_Write_Buf(WRITE_REG_SI24R1 + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);


    // 启用 Pipe0 自动应答
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + EN_AA, 0x01);


    // 启用 Pipe0 接收
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + EN_RXADDR, 0x01);


    // 设置自动重传次数和间隔
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + SETUP_RETR, 0x0A);


    // 设置 RF 信道
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + RF_CH, CHANNEL);


    // 设置 RF 参数(2Mbps 数据速率,7dBm 输出功率)
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + RF_SETUP, 0x0F);


    // 启用 CRC 校验
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + CONFIG, 0x0E);


    CHIP_ENABLE;
}
AI写代码
c
运行


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
三、数据收发操作
3.1 接收数据包
接收数据包时,首先读取状态寄存器以判断是否有数据到达,然后从 FIFO 中读取数据:


uint8_t SI24R1_RxPacket(uint8_t *rxbuf)
{
    uint8_t state = SI24R1_Read_Reg(READ_REG_SI24R1 + STATUS);
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + STATUS, state); // 清除中断标志


    if (state & RX_DR) // 收到数据
    {
        SI24R1_Read_Buf(RD_RX_PLOAD, rxbuf, TX_PLOAD_WIDTH); // 读取数据
        SI24R1_Write_Reg(FLUSH_RX, 0xFF); // 清空 RX FIFO
        return 0;
    }


    return 1; // 未收到数据
}
AI写代码
c
运行


1
2
3
4
5
6
7
8
9
10
11
12
13
14
3.2 发送数据包
发送数据包时,先将数据写入 TX FIFO,然后启动发送并等待结果:


uint8_t SI24R1_TxPacket(uint8_t *txbuf)
{
    CHIP_DISABLE;
    SI24R1_Write_Buf(WR_TX_PLOAD, txbuf, TX_PLOAD_WIDTH); // 写入数据
    CHIP_ENABLE; // 启动发送


    while (1)
    {
        uint8_t state = SI24R1_Read_Reg(STATUS);
        SI24R1_Write_Reg(WRITE_REG_SI24R1 + STATUS, state); // 清除中断标志


        if (state & MAX_RT) // 达到最大重传次数
        {
            SI24R1_Write_Reg(FLUSH_TX, 0xFF); // 清空 TX FIFO
            printf("The maximum number of retransmissions is reached\n");
            return MAX_RT;
        }


        if (state & TX_DS) // 发送成功
        {
            printf("Send success\n");
            return TX_DS;
        }
    }
}
AI写代码
c
运行


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
四、调试经验与优化建议
4.1 常见问题排查
状态寄存器未正确清除:在进入发送模式前,务必清除旧的状态标志位,以防止误判当前状态。
CE 引脚控制问题:检查 CE 引脚的电气特性和驱动能力,确保其能够正确驱动 SI24R1 模块。
IRQ 等待逻辑问题:确保 IRQ 信号线工作正常,避免外部因素导致固定电平问题,并在等待逻辑中添加超时机制。
SPI 通信问题:在 SPI 通信错误处理中,除了打印错误信息外,还需采取恢复措施或返回错误码,以防止后续操作忽略错误。
4.2 性能优化
增加短延时以确保进入发送模式:在调用 [CHIP_ENABLE] 后,可以适当加入短延时以确保芯片进入正确的发送模式。
在等待发送完成时,添加超时机制:防止程序陷入无限循环,提高系统的健壮性。
清除中断标志后,检查状态寄存SI24R1 无线通信模块开发

在嵌入式系统中,无线通信模块的应用越来越广泛。SI24R1 是一款高性能的 2.4GHz 无线收发芯片,支持多种通信模式和功能,适用于遥控、传感器数据传输等多种应用场景。本文将基于附件资源 [Int_SI24R1.c]和 [Int_SI24R1.h]文件中的代码实现,介绍如何使用 SI24R1 模块进行开发,并提供一些调试经验和优化建议。


一、SI24R1 简介与硬件配置
1.1 硬件连接
SI24R1 通过 SPI 接口与主控芯片(如 STM32)进行通信。以下是关键引脚定义:


SPI 接口:SCK、MOSI、MISO
片选信号:NSS(低电平有效)
使能控制:CE(高电平使能发送/接收)
中断输出:IRQ(用于指示数据接收或发送完成)
在代码中,我们通过宏定义对这些引脚进行了封装:


// 引脚控制宏定义
#define NSS_LOW   HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_RESET)
#define NSS_HIGH  HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_SET)


#define CE_ON     HAL_GPIO_WritePin(SI_EN_GPIO_Port, SI_EN_Pin, GPIO_PIN_SET)
#define CE_OFF    HAL_GPIO_WritePin(SI_EN_GPIO_Port, SI_EN_Pin, GPIO_PIN_RESET)
AI写代码
c
运行
1
2
3
4
5
6
1.2 寄存器配置
SI24R1 的寄存器决定了其工作模式和功能。主要配置包括:


信道设置:RF_CH(地址 0x05),频率计算公式为 2400 + Channel_Number (MHz)。
自动重传机制:SETUP_RETR(地址 0x04),设定最大重传次数和每次重传的时间间隔。
CRC 校验:在 CONFIG 寄存器中启用 CRC 校验,确保数据完整性。
ACK 应答机制:通过 EN_AA 寄存器启用自动应答功能。
以下是一个典型的寄存器配置示例:


// 配置 RF 信道
SI24R1_Write_Reg(WRITE_REG_SI24R1 + RF_CH, CHANNEL); // 设置为固定信道


// 启用自动重传
SI24R1_Write_Reg(WRITE_REG_SI24R1 + SETUP_RETR, 0x0A); // 10次重传,间隔250us+86us


// 启用 CRC 校验和自动应答
SI24R1_Write_Reg(WRITE_REG_SI24R1 + CONFIG, 0x0F); // CRC 16位校验
SI24R1_Write_Reg(WRITE_REG_SI24R1 + EN_AA, 0x01);  // 仅启用 Pipe0 自动应答
AI写代码
c
运行
1
2
3
4
5
6
7
8
9
二、SI24R1 初始化与模式切换
2.1 初始化流程
初始化过程包括检查 SI24R1 是否正常通信,并根据需要设置为接收或发送模式。


void SI24R1_Init(uint8_t mode)
{
    Int_Si24R1_Check(); // 检查通信状态


    if (mode == RX_MODE)
    {
        SI24R1_RX_Mode(); // 进入接收模式
        printf("RX_MODE\r\n");
    }
    else if (mode == TX_MODE)
    {
        SI24R1_TX_Mode(); // 进入发送模式
        printf("TX_MODE\r\n");
    }
}
AI写代码
c
运行


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2.2 接收模式配置
接收模式下,需配置接收地址、数据宽度以及使能接收通道:


void SI24R1_RX_Mode(void)
{
    CHIP_DISABLE; // 关闭芯片


    // 设置接收地址
    SI24R1_Write_Buf(WRITE_REG_SI24R1 + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);


    // 启用 Pipe0 自动应答
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + EN_AA, 0x01);


    // 启用 Pipe0 接收
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + EN_RXADDR, 0x01);


    // 设置 RF 信道
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + RF_CH, CHANNEL);


    // 设置数据宽度
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + RX_PW_P0, TX_PLOAD_WIDTH);


    // 设置 RF 参数(2Mbps 数据速率,7dBm 输出功率)
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + RF_SETUP, 0x0F);


    // 启用 CRC 校验
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + CONFIG, 0x0F);


    // 清除所有中断标志
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + STATUS, 0xFF);


    CHIP_ENABLE; // 启动芯片
}
AI写代码
c
运行


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2.3 发送模式配置
发送模式下,需配置发送地址、数据宽度以及自动重传参数:


void SI24R1_TX_Mode(void)
{
    CHIP_DISABLE;


    // 设置发送地址
    SI24R1_Write_Buf(WRITE_REG_SI24R1 + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);


    // 设置接收地址(Pipe0)
    SI24R1_Write_Buf(WRITE_REG_SI24R1 + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);


    // 启用 Pipe0 自动应答
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + EN_AA, 0x01);


    // 启用 Pipe0 接收
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + EN_RXADDR, 0x01);


    // 设置自动重传次数和间隔
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + SETUP_RETR, 0x0A);


    // 设置 RF 信道
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + RF_CH, CHANNEL);


    // 设置 RF 参数(2Mbps 数据速率,7dBm 输出功率)
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + RF_SETUP, 0x0F);


    // 启用 CRC 校验
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + CONFIG, 0x0E);


    CHIP_ENABLE;
}
AI写代码
c
运行


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
三、数据收发操作
3.1 接收数据包
接收数据包时,首先读取状态寄存器以判断是否有数据到达,然后从 FIFO 中读取数据:


uint8_t SI24R1_RxPacket(uint8_t *rxbuf)
{
    uint8_t state = SI24R1_Read_Reg(READ_REG_SI24R1 + STATUS);
    SI24R1_Write_Reg(WRITE_REG_SI24R1 + STATUS, state); // 清除中断标志


    if (state & RX_DR) // 收到数据
    {
        SI24R1_Read_Buf(RD_RX_PLOAD, rxbuf, TX_PLOAD_WIDTH); // 读取数据
        SI24R1_Write_Reg(FLUSH_RX, 0xFF); // 清空 RX FIFO
        return 0;
    }


    return 1; // 未收到数据
}
AI写代码
c
运行


1
2
3
4
5
6
7
8
9
10
11
12
13
14
3.2 发送数据包
发送数据包时,先将数据写入 TX FIFO,然后启动发送并等待结果:


uint8_t SI24R1_TxPacket(uint8_t *txbuf)
{
    CHIP_DISABLE;
    SI24R1_Write_Buf(WR_TX_PLOAD, txbuf, TX_PLOAD_WIDTH); // 写入数据
    CHIP_ENABLE; // 启动发送


    while (1)
    {
        uint8_t state = SI24R1_Read_Reg(STATUS);
        SI24R1_Write_Reg(WRITE_REG_SI24R1 + STATUS, state); // 清除中断标志


        if (state & MAX_RT) // 达到最大重传次数
        {
            SI24R1_Write_Reg(FLUSH_TX, 0xFF); // 清空 TX FIFO
            printf("The maximum number of retransmissions is reached\n");
            return MAX_RT;
        }


        if (state & TX_DS) // 发送成功
        {
            printf("Send success\n");
            return TX_DS;
        }
    }
}
AI写代码
c
运行


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
四、调试经验与优化建议
4.1 常见问题排查
状态寄存器未正确清除:在进入发送模式前,务必清除旧的状态标志位,以防止误判当前状态。
CE 引脚控制问题:检查 CE 引脚的电气特性和驱动能力,确保其能够正确驱动 SI24R1 模块。
IRQ 等待逻辑问题:确保 IRQ 信号线工作正常,避免外部因素导致固定电平问题,并在等待逻辑中添加超时机制。
SPI 通信问题:在 SPI 通信错误处理中,除了打印错误信息外,还需采取恢复措施或返回错误码,以防止后续操作忽略错误。
4.2 性能优化
增加短延时以确保进入发送模式:在调用 [CHIP_ENABLE] 后,可以适当加入短延时以确保芯片进入正确的发送模式。
在等待发送完成时,添加超时机制:防止程序陷入无限循环,提高系统的健壮性。
清除中断标志后,检查状态寄存器值以确认发送结果:确保发送状态准确无误。
五、总结
SI24R1 是一款功能强大的无线通信模块,适用于多种嵌入式应用。通过合理的寄存器配置和代码实现,可以充分发挥其性能优势。在实际开发过程中,合理利用自动重传、CRC 校验等功能可以显著提升通信的稳定性和可靠性。同时,在调试过程中要注意引脚控制、状态寄存器管理和 SPI 通信的稳定性,确保整个系统运行良好。


希望本文对你在 SI24R1 开发过程中有所帮助!
————————————————
版权声明:本文为CSDN博主「大脸喵」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2302_77362431/article/details/148792903器值以确认发送结果:确保发送状态准确无误。
五、总结
SI24R1 是一款功能强大的无线通信模块,适用于多种嵌入式应用。通过合理的寄存器配置和代码实现,可以充分发挥其性能优势。在实际开发过程中,合理利用自动重传、CRC 校验等功能可以显著提升通信的稳定性和可靠性。同时,在调试过程中要注意引脚控制、状态寄存器管理和 SPI 通信的稳定性,确保整个系统运行良好。


希望本文对你在 SI24R1 开发过程中有所帮助!
————————————————
版权声明:本文为CSDN博主「大脸喵」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2302_77362431/article/details/148792903

更多回帖

发帖
×
20
完善资料,
赚取积分