NRF24L01+的模块所有问题在这个帖子讨论吧。我为你们解答。
毕竟玩了有段时间了。
我重新修改了 C 文件和 H 文件,你们下载后,稍微移植下,就可以用了。不会有什么大的问题。
//这次加入了半双工模式
//24L01操作线
#define NRF24L01_GND 0 //24L01
电源0v
#define NRF24L01_VCC 3.3 //24L01电源3.3v
#define NRF24L01_CE CE //24L01天线使能(高电平有效)
#define NRF24L01_CSN CSN //spi传输使能(低电平有效)
#define NRF24L01_SCK SCK //spi时钟(上升沿有效)
#define NRF24L01_MOSI MOSI//spi输入脚(上位机MO输出,下位机SI输入)
#define NRF24L01_MISO MISO//spi输出脚(上位机MI输入,下位机SO输出)
#define NRF24L01_IRQ IRQ //中断脚输出(拉低电平)
//////////////////////////////////////////////////////////////////////////////////
// 写一个字节,同时读出一个字节
u8 SPI_ReadWriteByte(u8 byte)//[D7:D0][D15:D8]
{
u8 i,data;//循环8次
// SCK=0;//时钟准备
// CSN=0;//使能spi传输
data=byte;//数据准备
for(i=0;i<8;i++)// output 8-bit
{
if(data & 0x80)MOSI = 1;// 输出高位逻辑值
else MOSI = 0;
delay_us(1);//nrf24l01要>40ns;
data = (data<<1); // 丢弃高位,低位补0
SCK = 1; // SCK 上升沿有效
delay_us(1);
if((MISO&0x01)==0x01)data|=0x01;
SCK = 0; // ..then set SCK low again
}
return(data); // 输出读取的8位
}
//////////////////////////////////////////////////////////////////////#include "STM32f4xx.h"
#include "stm32f4xx_conf.h"
#include "delay.h"
#include "spi.h"
#include "nrf24l01plus.h"//nrf24L01+无线模块
void HardFault_Handler()
{
}//硬件故障
int main(void)
{
static u8 rxbuf[32]={0};//接收包
static u8 txbuf[32]={0};//发送包
static u8 P,i=0x0f;//P通道地址
static u8 temp;//0x07寄存器的值
// SystemInit();//时钟初始化
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
////////////////////////////////////////////////////////////
//A.tx-B.p1 B.tx-A.p1
NRF24L01_bilateral_A_Init();//初始化NRF24L01为上位机A,
// NRF24L01_bilateral_B_Init();//初始化NRF24L01 为下位机B
//////////////////////////////////////////////////
for(i=0;i<32;i++) txbuf=0x41+i; //字母A开始//写数据包
i=0;
while(1)//循环发送
{
/////////////////////////
//写数据包
txbuf[0]=0x41+(i++);//写数据包//A.B.C.D....
if(txbuf[0]>0x41+26-1){txbuf[0]=0x41;i=0;}//Z->A
// txbuf[0]=0x00;//没有数据要发送
////////////////////////////
//数据 发送成功一次就跳出一次
while(1)//发送成功一次跳出
{
temp=NRF24L01_bilateral_Pack(rxbuf,txbuf);//接收包优先,后TX数据包
if(temp&1<<6 )//收到数据
{
P=temp>>1;
P=P&0x07;//取出接收通道的编号;
switch(P)//通道
{
case 0: break;//通道P0
case 1: break;//通道P1
case 2: break;//通道P2
case 3: break;//通道P3
case 4: break;//通道P4
case 5: break;//通道P5
default: break;//无效
}
}
if(temp&1<<5)break;//发送成功才跳出;
}
}
}
temp.zip (2.66 MB )
51的2401双通讯.zip (132.73 KB )