接收方对新接收数据包的PID值与上一包进行比较如果PID值不同则认为接收的数据包是新数据包如果PID值与上一包相同则新接收的数据包有可能与前一包相同,接收方必须确认CRC值是否相等如果CRC值与前一包数据的CRC值相等则认为是同一包数据并将其舍弃。 (2)发送方
每发送一包数据则发送方的PID值加1。 开始
否 开始 是 PID 等于是 来自微处理器新数据包? 增加 PID的last PID的值? 否 否 CRC 等于 Last CRC? 是 来自微处理器新数据包结束 丢弃重复数据包 结束
数据字段的宽度为1到32字节,发送方与接收方必须一致,接收到数据通道有效数据宽度通过RX_PW_Px寄存器设置,x为0到5。
CRC校验是可选的,寄存器EN_CRC用来使能CRC,寄存器CRCO用于设置CRC模式,有8位CRC校验的多项式X8+X2+X+1,16位CRC校验的多项式是X16+X12+X5+1,发送方与接收方也必须一致,CRC计算范围包括整个数据包:地址、PID和有效数据等。若CRC校验错误则不会接收数据包。 3.3.2 SPI的读写程序
15
图3-7 PID生成和检测
图3-8 SPI 程序时序图
1.数据发送过程
当一字节写进发送缓冲器时,发送过程开始。在发送第一个数据位时,数据字被并行地(通过内部总线)传入以为寄存器,而后串行地溢出到MOSI脚上;MSB在线还是LSB在线,取决于SPI_CR1寄存器中的LSBFIRST位,数据从发送缓冲器传输到移位寄存器时TXE标志将被置位,如果设置SPI_CR1寄存器中的TXEIE位,将产生中断。 SPI总线读写操作流程图3-9如下:
16
等待数据发送结束(SPIF将产生中断) 读出从机发送的数据或释放从机 发送一字节数据启动SPI数据传输 设置为SPI主机(设置 SPI_CR1寄存器) 选择从机 开始 图3-9 SPI总线读写操作流程图
2.数据接收过程
对于接收器来说,当数据传输完成时,移位寄存器里的数据传送到接收缓冲器,并且RXNE标志被置位。如果SPI_CR2寄存器中的RXEIE位被置位,则产生中断。在最后采样时钟沿,RXNE位被设置,在移位寄存器中接收到的数据字被传送到接受缓冲器,读SPI_DR寄存器时,SPIU设备返回接受到的数据字,读SPI_DR寄存器将清除RXNE位。 3.3.3 nRF24L01发送程序设计
发射数据时,首先将nRF24L01配置为发射模式:接着把接收节点地址TX_ADDR和有效数据TX_PLD按照时序由SPI口写入nRF24L01缓存区,TX_PLD必须在CSN为低时连续写入,而TX_ADDR在发射时写入一次即可,然后CE置为高电平并保持至少10μs,延迟130μs后发射数据;若自动应答开启,那么nRF24L01在发射数据后立即进入接收模式,接收应答信号(自动应答接收地址应该与接收节点地址TX_ADDR一致)。如果收到应答,则认为此次通信成功,TX_DS置高,同时TX_PLD从TX FIFO中清除;若未收到应答,则自动重新发射该数据(自动重发已开启),若重发次数(ARC)达到上限,MAX_RT置高,TX_FIFO中数据保留以便在次重发;MAX_RT或TX_DS置高时,使IRQ变低,产生中断,通知MCU。最后发射成功时, 清STATUS中断标志位进入下一次发射。nRF24L01发送时序图和流程图分别如下图3-10和3-11所示:
图3-10 nRF24L01发送数据时序图
17
清STATUS中断标志位 返回 MAX_RT=1? N TD_DS=1? Y 读取STATUS 延迟130us N IRQ=0? Y 清STATUS中断标志位 延迟20us 写Pay load 配置为发送模式 nRF24L01初始化 置CE为高 置CE为低 图3-11 发送模块软件流程图
3.3.4 nRF24L01接收程序设计
接收数据时,首先将nRF24L01配置为接收模式,接着延迟130μs进入接收状态等待数据的到来。当接收方检测到有效的地址和CRC时,就将数据包存储在RX FIFO中,同时中断标志位RX_DR置高,IRQ变低,产生中断,通知MCU去取数据。若此时自动应答开启,接收方则同时进入发射状态回传应答信号。最后接收成功时,清STATUS中断标志位,等待接收下一组信号。nRF24L01接收数据时序图与流程图分别如下图3-12和3-13所示:
18
图3-12 nRF24L01接收数据时序图
延迟130us 置CE为高 nRF24L01初始化 配置为接收模式
返回 清STATUS中断标志位 RD_DR=1? 是 发送数据指令,读取接收数据 否 IRQ=0? 是 读取STATUS 否 图3-13 接收模式软件流程图
19