P3_4=0; P3_5=0;
P3_7=0;
break;
case 6:
P1_1=0; P1_4=1; P3_0=0; P3_1=0; P3_3=0; P3_4=0; P3_5=0;
P3_7=0;
break;
case 7:
P1_1=0; P1_4=0; P3_0=0; P3_1=1; P3_3=1; P3_4=1; P3_5=1;
P3_7=0;
break;
case 8:
P1_1=0; P1_4=0; P3_0=0; P3_1=0; P3_3=0; P3_4=0; P3_5=0;
P3_7=0;
break; default: break; } } }
}
五、工作原理
1、发送原理
由源程序主函数可知,当系统执行完初始化函数 init_NRF24L01() 后,将自动进入发送模式,再调用nRF24L01_TxPacket(unsigned char * tx_buf) 发送函数,将以定义的无字符型字符数组TxBuf数据和地址RX_ADDRESS按照时序由SPI口写入nRF24L01缓冲区,TxBuf必须在CSN为低时连续写入,而RX_ADDRESS在发射时写入一次即可,然后CE置为高电平并保持至少10μs,延迟130μs后发射数据,若自动应答开启,那么nRF24L01在发射数据后立即进入接收模式,接收应答信号。如果收到应答,则认为此次通信成功,TX_DS置高,同时TxBuf从TX FIFO中清除;若未收到应答,则自动重新发射该数据(自动重发已开启),若重发次数(ARC)达到上限,MAX_RT置高,TX FIFO中数据保留以便在次重发;MAX_RT或TX_DS置高时,使IRQ变低,产生中断,通知MCU。最后发射成功时,若CE为低则nRF24L01进入空闲模式1;若发送堆栈中有数据且CE为高,则进入下一次发射;若发送堆栈中无数据且CE为高,则进入空闲模式2。
数据
参考源程序:uchar TxBuf[2]={0x01,0x02,};
发送函数
参考源程序:nRF24L01_TxPacket(TxBuf);
接收地址
参考源程序:
uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};
2、接收原理
接收数据时,首先将nRF24L01配置为接收模式SetRX_Mode(),接着延迟130μs进入接收状态等待数据的到来。当接收方检测到有效的地址和CRC时,就将数据包存储在RX FIFO中,利用接收函数将其读取到指定的地址,同时中断标志位RX_DR置高,IRQ变低,产生中断,通知MCU去取数据,函数将返回1。若此时自动应答开启,接收方则同时进入发射状态回传应答信号。最后接收成功时,若CE变低,则nRF24L01进入空闲模式1。
数据存放地
参考源程序:uchar RxBuf[2];
接收函数
参考源程序:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
本机地址
参考源程序:
uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};
3、抢答器原理
发送部分利用if语句判断8个端口是否有控制信号,当某个端口有信号输入,则执行相应的语句,通过改变数组TxBuf来达到发送指定信息的目的。同时标志位Flag置1,函数进入死循环,从而达到锁定其余端口的目的。只有程序复位重新执行后,才能进行下一轮抢答。
接收部分才用循环接收的方法实现实时信号追踪,利用if语句判断数据是否接收成功,当成功接收后利用switch语句读取接收到的TxBuf信息,从而执行相应的语句实现数码管的显示和蜂鸣器的发声。