SPI总线读写nRF24寄存器代码逻辑疑问:为何要遵循指定操作流程?
关于nRF24驱动SPI读写逻辑的原理说明
写入操作的实现逻辑
nRF24这类SPI接口的外设,寄存器访问遵循「命令优先」的规则:
- 所有读写操作都需要主机先发送1字节的命令头,命令头的高3位标识操作类型,低5位存储目标寄存器地址。你代码里的
NRF24_CMD_W_REGISTER就是写寄存器的操作标识(固定值为0x20),和寄存器地址做或运算之后,得到的就是完整的写命令头。 - 拉低
CSN引脚是SPI协议要求的从机选中操作,只有CSN为低时,从机才会响应总线上的传输。 - 连续发送2字节数据时,第一字节的命令头告诉从机「接下来要写入XX寄存器」,第二字节就是要写入的目标值,从机收到后就会自动把数值写入对应寄存器,最后拉高CSN结束本次传输即可。
读取操作需要先发数据的原因
SPI是主机主动驱动的全双工总线,从机不会主动向主机发送任何数据,所有传输的时钟信号都由主机产生,这是你疑问的核心:
- 你要读取某个寄存器的值,首先得让从机知道你要读的是哪个寄存器,所以必须先发送带读标识的命令头(
NRF24_CMD_R_REGISTER | reg,读标识固定为0x00)。 - 从机收到读命令后,会把对应寄存器的内容加载到SPI的发送缓冲区,接下来主机再发起1字节的SPI传输(代码里的
nRF24_ReadSpi本质是主机发送1字节无意义的dummy数据,同时采样从机返回的数据),就能拿到对应寄存器的数值。 - 部分实现中会把读操作合并为单次2字节传输:第一字节发读命令,第二字节发dummy值,同时接收第二字节对应的从机返回值,和你给出的分两次传输的实现逻辑完全等价。
内容的提问来源于stack exchange,提问作者yeuop
相关产品推荐
相关产品推荐

