对于学习嵌入式中的通信,可能会用到这个模块,该模块应用的是si24r1芯片。
一、si24r1简介:
Si24R1 是一颗工作在 2.4GHz ISM 频段,专为低功耗无线场合设计,集成嵌
入式 ARQ 基带协议引擎的无线收发器芯片。工作频率范围为 2400MHz-2525MHz,
共有 126 个 1MHz 带宽的信道。
Si24R1 采用 GFSK/FSK 数字调制与解调技术。数据传输速率与 PA 输出功率
都可以调节,支持 2Mbps,1Mbps,250Kbps 三种数据速率。高的数据速率可以在更
短的时间完成同样的数据收发,因此可以具有更低的功耗。
Si24R1 针对低功耗应用场合进行了特别优化,在关断模式下,所有寄存器
值与 FIFO 值保持不变,关断电流小于 0.7uA;在待机模式下,时钟保持工作,
电流小于 15uA,并且可以在不到 130uS 时间内开始数据的收发。
Si24R1 操作方式非常方便, 只需要微控制器(MCU)通过 SPI 接口对芯片
少数几个寄存器配置即可以实现数据的收发通信。嵌入式 ARQ 基带引擎基于包通
信原理,支持多种通信模式,可以手动或全自动 ARQ 协议操作。内部集成收发
FIFO,可以保证芯片与 MCU 数据连续传输,增强型 ARQ 基带协议引擎能处理所有
高速操作,因此大大降低了 MCU 的系统消耗。
Si24R1 具有非常低的系统应用成本,只需要一个 MCU 和少量外围无源器件
即可以组成一个无线数据收发系统。内部集成高 PSRR 的 LDO 电源,保证 1.9-3.6V
宽电源范围内稳定工作;数字 IO 兼容 3.3V/5V 两种电压,可以与各种 MCU 接口。
二、工作模式:
状态转换图
Si24R1
芯片内部有状态机,控制着芯片在不同工作模式之间的转换。
Si24R1
可配置为
Shutdown
、
Standby
、
Idle-TX
、
TX
和
RX
五种工作模式。
Shutdown 工作模式
在 Shutdown
工作模式下,
Si24R1
所有收发功能模块关闭,芯片停止工作,
消耗电流最小,但所有内部寄存器值和
FIFO
值保持不变,仍可通过
SPI
实现对
寄存器的读写。设置
CONFIG
寄存器的
PWR_UP
位的值为
0
,芯片立即返回到
Shutdown
工作模式。
Standby 工作模式。
在 Standby
工作模式,只有晶体振荡器电路工作,保证了芯片在消耗较少电
流的同时能够快速启动。设置
CONFIG
寄存器下的
PWR_UP
位的值为
1
,芯片
待时钟稳定后进入
Standby
模式。芯片的时钟稳定时间一般为
1.5~2ms
,与晶振
的性能有关。当引脚
CE=1
时,芯片将由
Standby
模式进入到
Idle-TX
或
RX
模
式,当
CE=0
时,芯片将由
Idle-TX
、
TX
或
RX
模式返回到
Standby
模式。
Idle-TX 工作模式
在 Idle-TX
工作模式下,晶体振荡器电路及时钟电路工作。相比于
Standby
模式,芯片消耗更多的电流。当发送端
TX FIFO
寄存器为空,并且引脚
CE=1
时,芯片进入到
Idle-TX
模式。在该模式下,如果有新的数据包被送到
TX FIFO
中,芯片内部的电路将立即启动,切换到
TX
模式将数据包发送。
在
Standby
和
Idle-TX
工作模式下,所有内部寄存器值和
FIFO
值保持不变,
仍可通过
SPI
实现对寄存器的读写。
TX 工作模式
当需要发送数据时,需要切换到 TX
工作模式。芯片进入到
TX
工作模式的
条件为:
TX FIFO
中有数据,
CONFIG
寄存器的
PWR_UP
位的值为
1
,
PRIM_RX
位的值为
0
,同时要求引脚
CE
上有一个至少持续
10us
的高脉冲。芯片不会直接
由
Standby
模式直接切换到
TX
模式,而是先立即切换到
Idle-TX
模式,再由
Idle-TX
模式自动切换到
TX
模式。
Idle-TX
模式切换到
TX
模式的时间为
120us~130us
之间,但不会超过
130us
。单包数据发送完成后,如果
CE=1,
则由
TX FIFO
的状态来决定芯片所处的工作模式,当
TX FIFO
还有数据,芯片继续
保持在
TX
工作模式,并发送下一包数据;当
TX FIFO
没有数据,芯片返回
Idle-TX
模式;如果
CE=0
,立即返回
Standby
模式。数据发射完成后,芯片产生数据发
射完成中断。
RX 工作模式
当需要接收数据时,需要切换到 RX
工作模式。芯片进入到
RX
工作模式的
条件为:设置寄存器
CONFIG
的
PWR_UP
位的值为
1
,
PRIM_RX
位的值为
1
,
并且引脚
CE=1
。芯片由
Standby
模式切换到
RX
模式的时间为
120~130us。当接
收到数据包的地址与芯片的地址相同,并且
CRC
检查正确时,数据会自动存入
RX FIFO
,并产生数据接收中断。芯片最多可以同时存三个有效数据包,当
FIFO
已满,接收到的数据包被自动丢掉。
在接收模式下,可以通过 RSSI
寄存器检测接收信号功率。当接收到的信号
强度大于
-60dBm
时,
RSSI
寄存器的
RSSI
位的值将被设置为
1
。否则,
RSSI=0。
RSSI
寄存器的更新方法有两种:当接收到有效的数据包后,
RSSI
会自动更新,
此外,将芯片从
RX
模式换到
Standby
模式时
RSSI
也会自动更新。
RSSI
的值会
随温度的变化而变化,范围在±
5dBm
以内
三、数据包处理协议
Si24R1 基于包通信,支持停等式 ARQ 协议。芯片内部 ARQ 协议基带处理引
擎,可以不需要外部微控制器干预下,自动实现 ACK 和 NO_ACK 数据包的处理。
ARQ 协议基带处理单元支持 1 到 32 字节动态数据长度,数据长度在数据包内。
也可以采用固定数据长度,通过寄存器指定;基带处理单元完成数据的自动解包、
打包、自动回复 ACK 确认信号以及自动重发。该处理单元内部有 6 个通信管道,
可以直接支持 1:6 星型网络。
ARQ 包格式
一个完整的 ARQ 数据包包括前导码、地址、包控制字、负载数据以及 CRC。
前导码字段主要用于接收数据同步,发射时芯片自动附上,接收时芯片自动
去掉,对用户不可见。
地址字段为接收数据方地址,只有当该地址与芯片的地址寄存器中地址相同
时才会接收。地址长度可以通过配置寄存器 AW 配置为 3、或 4、或 5 字节。
ARQ 通信模式
在
TX
模式下,发送端自动将前导码、地址、包控制字、负载数据、
CRC
打包。
通过射频模块将信号调制通过天线发射。
在
RX
模式下,接收端在接收到的解调信号中不断侦测有效地址,一旦侦测到
地址与接收地址相同,开始接收数据,如果接收到的数据有效,则将负载数据部
分存放入
RX FIFO
中,并产生中断通知
MCU
。
MCU
通过
SPI
接口可随时访问
RX FIFO
寄存器,进行数据读取。
ACK 模式
当用
W_TX_PAYLOAD
命令对发送端
TX FIFO
写数据时,将数据打包后,数
据包中包控制字段
NO_ACK
标志位复位。接收端接收到一帧有效数据后
,
产生
RX_DR
中断后,会自动发送一帧
ACK
信号,发送端接收到
ACK
信号,则自动
清除
TX FIFO
数据并产生
TX_DS
发射中断,表明此次通信成功。
接收端在发送
ACK
信号时,取接收管道地址作为目标地址来发送
ACK
信号,
所以发送端需要设置接收管道
0
地址与自身发送地址相同,以便接收
ACK
信号。
如果发送端在
ARD
时间内没有接收到
ACK
信号,则重新发送上一帧数据。当
重发次数达到最大,仍没有收到确认信号时,发送端产生
MAX_RT
中断。
MAX_RT
中断在清除之前不能进行下一步的数据发送。所有中断通过对状态寄
存器进行写操作来清除。
PLOS_CNT
寄存器在每产生一个
MAX_RT
中断后加
1
,
用来记录当前频段下,丢失的数据包的数量。
ARC_CNT
寄存器记录当前数据重
发的次数,在发送一包新数据时使其复位。最大重发次数与
ARD
时间通过
SETUP_RETR
寄存器来进行配置。接收端开启自动回复
ACK
信号由
EN_AA
寄
存器来控制。
模式一:
ACK
通信
//发射方配置:
spi_rw_reg(SETUP_AW, 0x03); // 设置地址宽度为 5bytes
spi_write_buf(TX_ADDR, TX_ADDRESS, 5); // 写入发送地址,5 字节
spi_write_buf(RX_ADDR_P0, TX_ADDRESS, 5); //接收通道 0 地址和发射地址相同
spi_write_buf(W_TX_PAYLOAD, buf, TX_PLOAD_WIDTH); // 写 TX FIFO
spi_rw_reg(FEATURE, 0x04); //使能动态负载长度
spi_rw_reg(DYNPD, 0x01); //开启 DPL_P0
spi_rw_reg(SETUP_RETR, 0x15); //自动重发延时等待 500us,自动重发 5 次
spi_rw_reg(RF_CH, 0x40); // 选择射频信道
spi_rw_reg(RF_SETUP, 0x0e); // 数据传输率 2Mbps 及功率
spi_rw_reg(CONFIG, 0x0e); //配置为发射模式、CRC、可屏蔽中断
CE = 1;
//接收方配置:
spi_write_buf(RX_ADDR_P0, TX_ADDRESS, 5); //接收通道 0 地址和发射地址相同
spi_rw_reg(EN_RXADDR, 0x01); // 使能接收通道 0
spi_rw_reg(RF_CH, 0x40); // 选择射频信道
spi_rw_reg(RX_PW_P0, TX_PLOAD_WIDTH); //设置负载长度,使用 PIPE0 接收
spi_rw_reg(SETUP_AW, 0x03); // 设置地址宽度为 5bytes
spi_rw_reg( FEATURE, 0x04); //使能动态负载
spi_rw_reg(DYNPD, 0x01); //开启 DPL_P0
spi_rw_reg(RF_SETUP, 0x0e); // 数据传输率 2Mbps 及功率
spi_rw_reg(CONFIG, 0x0f; //配置为发射模式、CRC、可屏蔽中断
CE = 1;
模式二:
NOACK
通信
//发射方配置:
spi_write_buf( TX_ADDR, TX_ADDRESS, 5); // 写入发送地址
spi_rw_reg( FEATURE, 0x01); // 使能 W_TX_PAYLOAD_NOACK 命令
spi_write_buf(W_TX_PAYLOAD_NOACK, buf, TX_PLOAD_WIDTH); // 写 FIFO
spi_rw_reg(SETUP_AW, 0x03); // 5 byte Address width
spi_rw_reg( RF_CH, 0x40); // 选择射频通道 0x40
spi_rw_reg(RF_SETUP, 0x08); // 数据传输率 2Mbps
spi_rw_reg( CONFIG, 0x0e); //配置为发射模式、CRC 为 2Bytes
CE = 1;
//接收方配置:
spi_write_buf( RX_ADDR_P0, TX_ADDRESS, 5); // 接收地址
spi_rw_reg( EN_RXADDR, 0x01); // 使能接收通道 0
spi_rw_reg( RF_CH, 0x40); // 选择射频信道
spi_rw_reg( RX_PW_P0, TX_PLOAD_WIDTH); //设置接收通道 0 负载数据宽度
spi_rw_reg( RF_SETUP, 0x08); // 数据传输率 2Mbps,-18dbm TX power
spi_rw_reg( CONFIG, 0x0f); // 配置为接收方、CRC 为 2Bytes
CE = 1;
模式三:接收方开启多个通道
//动态负载:
spi_rw_reg(FEATURE, 0x04);
spi_rw_reg(DYNPD, 0x3F) ; //开启所有通道动态负载长度
spi_rw_reg(EN_RXADDR, 0x3F); //开启所有通道
spi_rw_reg(RF_CH, 0x40); // 选择射频通道 0x40
spi_rw_reg(SETUP_AW, 0x03); // 5 byte Address width
spi_rw_reg(CONFIG, 0x0B); //配置为接收方
CE = 1;
//静态负载:
spi_rw_reg(RX_PW_P0, 0x20); //设置通道 0 接收数据宽度
spi_rw_reg(RX_PW_P1, 0x20);
spi_rw_reg(RX_PW_P2, 0x20);
spi_rw_reg(RX_PW_P3, 0x20);
spi_rw_reg(RX_PW_P4, 0x20);
spi_rw_reg(RX_PW_P5, 0x20);
spi_rw_reg(EN_RXADDR, 0x3F); //开启所有通道
spi_rw_reg(RF_CH, 0x40); // 选择射频通道 0x40
spi_rw_reg(SETUP_AW, 0x03); // 设置地址宽度
spi_rw_reg(CONFIG, 0x0F); //配置为接收方
CE = 1;