链接:https://pan.baidu.com/s/1R_p89zMbirEisudmYErTkg
提取码:k6i4
一对二通信
1.例子1
1.1实验材料
用的是正点原子的miniSTM32 和网上的stm32 开发板,都是f103rct6
1.2接线
1.3现象
现象1
1.按RESET后,会出现下图所示的:
2.黑色板子按KEY1进入发送模式,miniSTM32按KEY0进入接收模式
可以看到黑色板子发送消息-----蓝色板子接收消息并显示在屏幕上
现象2
当黑色板子nrf24l01出现故障,即发送端出现故障
屏幕画面不再更新
led灯还是继续闪烁
和下面程序描述一样
就是NRF24L01_RxPacket(tmp_buf)等于1了
while(1)
{
if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来.
{
tmp_buf[32]=0;//加入字符串结束符
LCD_ShowString(0,190,lcddev.width-1,32,16,tmp_buf);
}else delay_us(100);
t++;
if(t==10000)//大约1s钟改变一次状态
{
t=0;
LED0=!LED0;
}
};
这个函数,意思是接收状态—成功返回0失败返回1
u8 NRF24L01_RxPacket(u8 *rxbuf)
{
u8 sta;
SPI1_SetSpeed(SPI_BAUDRATEPRESCALER_8); //spi速度为6.75Mhz(24L01的最大SPI时钟为10Mhz)
sta=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值
NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志
if(sta&RX_OK)//接收到数据
{
NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
NRF24L01_Write_Reg(FLUSH_RX,0xff); //清除RX FIFO寄存器
return 0;
}
return 1;//没收到任何数据
}
现象3
当接收端出现故障:
出现如下提示
接收端正常后
则立刻正常发送
(图中按KEY0进入接收模式,发送端就正常发送了)
发送端函数
就是一直检测是不是等于TX_OK,
NRF24L01_TxPacket函数原型如下;其中读取状态寄存器的值,来判断是处于什么状态;
状态寄存寄存器地址是0x07,可以读出以下几种状态值
u8 NRF24L01_TxPacket(u8 *txbuf)
{
u8 sta;
SPI1_SetSpeed(SPI_BAUDRATEPRESCALER_8); //spi速度为6.75Mhz(24L01的最大SPI时钟为10Mhz)
NRF24L01_CE=0;
NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF 32个字节
NRF24L01_CE=1; //启动发送
while(NRF24L01_IRQ!=0); //等待发送完成
sta=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值
NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志
if(sta&MAX_TX) //达到最大重发次数
{
NRF24L01_Write_Reg(FLUSH_TX,0xff); //清除TX FIFO寄存器
return MAX_TX;
}
if(sta&TX_OK) //发送完成
{
return TX_OK;
}
return 0xff;//其他原因发送失败
}