网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月05日漏签0天
中国海洋大学吧 关注:250,054贴子:6,331,311
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 4回复贴,共1页
<<返回中国海洋大学吧
>0< 加载中...

求牛人指导单片机的nrf2401无线收发模块

  • 只看楼主
  • 收藏

  • 回复
  • cyqchangyuqi
  • 入学新生
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
最近碰到一个非常难办的问题,nrf2401无线收发模块无法正常驱动,已经折磨我一个半月了,求高手解决啊。。。
我做的这个模块还用到两个其他配件,发送端用到两个电位器,接收端用到一个5641BH数码显像管。
2楼发送端.c
3楼接收端.c
求教啊


  • cyqchangyuqi
  • 入学新生
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include<STC15F2K60S2.h>
sbit CE=P0^0;
sbit CSN=P0^1;
sbit SCK=P0^2;
sbit MOSI=P0^3;
sbit MISO=P0^4;
sbit IRQ=P0^5;
sbit LED=P2^7;
#define TX_ADR_WIDTH 5
#define RX_ADR_WIDTH 5
#define TX_PLOAD_WIDTH 22
#define RX_PLOAD_WIDTH 32
unsigned int bdata sta;
sbit RX_DR = sta^6;
sbit TX_DS = sta^5;
sbit MAX_RT = sta^4;
bit flag = 0;
bit cnt = 0;
unsigned char const TX_ADDRESS[TX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};
unsigned char const RX_ADDRESS[RX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};
unsigned char Tx_Buf[TX_PLOAD_WIDTH] = {0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x08, 0x09,
0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
0x0f, 0x10, 0x11, 0x12, 0x13,
0x14, 0x15/*, 0x16, 0x17, 0x18,
0x19, 0x1a, 0x1b, 0x1c, 0x1d,
0x1e, 0x1f*/};//发送数据
unsigned char Rx_Buf[RX_PLOAD_WIDTH];//接收数据
/*--NRF24L01寄存器指令----------------------------------------------*/
#define READ_REG 0x00//读配置寄存器指令
#define WRITE_REG 0x20//写配置寄存器指令
#define RD_RX_PLOAD 0x61//读接收数据
#define WR_TX_PLOAD 0xa0//写待发数据
#define FLUSH_TX 0xe1//清除发送FIFO寄存器
#define FLUSH_RX 0xe2//清除接受FIFO寄存器
#define REUSE_TX_PL 0xe3//定义重复装载数据指令
#define NOP 0xff//保留
/*--SPI 寄存器地址--------------------------------------------------*/
#define CONFIG 0x00//配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA 0x01//自动应答功能设置
#define EN_RXADDR 0x02//可用信道设置
#define SETUP_AW 0x03//收发地址宽度设置
#define SETUP_RETR 0x04//自动重发功能设置
#define RF_CH 0x05//工作频率设置
#define RF_SETUP 0x06//发射速率、功耗功能设置
#define STATUS 0x07//状态寄存器
#define OBSERVE_TX 0x08//发送监测功能
#define CD 0x09//地址检测
#define RX_ADDR_P0 0x0a//频道0接收数据地址
#define RX_ADDR_P1 0x0b//频道1接收数据地址
#define RX_ADDR_P2 0x0c//频道2接收数据地址
#define RX_ADDR_P3 0x0d//频道3接收数据地址
#define RX_ADDR_P4 0x0e//频道4接收数据地址
#define RX_ADDR_P5 0x0f//频道5接收数据地址
#define TX_ADDR 0x10//发送地址寄存器
#define RX_PW_P0 0x11//接收频道0接收数据长度
#define RX_PW_P1 0x12//接收频道1接收数据长度
#define RX_PW_P2 0x13//接收频道2接收数据长度
#define RX_PW_P3 0x14//接收频道3接收数据长度
#define RX_PW_P4 0x15//接收频道4接收数据长度
#define RX_PW_P5 0x16//接收频道5接收数据长度
#define FIFO_STATUS 0x17//FIFO栈入栈出状态寄存器设置
void Delay_us(unsigned int time)
{
while(time - 1)
{
time --;
}
}
void Delay_ms(unsigned char time)
{
while(time * 10 - 1)
{
Delay_us(100);
time--;
}
}
unsigned char SPI_RW(unsigned char byte) //发送dat数据,并返回接收到的数据
{
unsigned Bit_Count;
for(Bit_Count = 0; Bit_Count < 8; Bit_Count++)
{
MOSI = (byte & 0x80);
byte = (byte << 1);
SCK = 1;
byte |= MISO;
SCK = 0;
}
return(byte);
}
void SPI_Write_Buf(unsigned char address, unsigned char *pBuf, unsigned char Byte_Num)
{
unsigned char Byte_Count;
CSN = 0;//SPI使能
SPI_RW(address);
for(Byte_Count = 0; Byte_Count < Byte_Num; Byte_Count++)
{
SPI_RW(*pBuf++);//指向下一个数据
}
CSN = 1;//关闭SPI//返回24L01的状态
}
unsigned char SPI_RW_Reg(unsigned char address, unsigned char command)
{
unsigned char status;
CSN = 0;//CSN 拉低,启动SPI通信
status = SPI_RW(address);//选择要操作的寄存器
SPI_RW(command);//向选择的寄存器中写入数据
CSN = 1;//CSN 拉高,终止SPI通信
return(status);//返回2401 reg寄存器的状态
}
void Init_NRF24L01(void)
{
CE = 0; //芯片使能
CSN = 1;//SPI 禁止2401的SPI功能
SCK = 0;//初始化SPI时钟
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);//设置本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);//设置接收地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);//频道0自动ACK应答 允许
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);//允许接收地址只有频道0,如果需要多频道可以参考说明文档第21页
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);//设置自动重发的延时和次数 延时大小4000+86us 次数5次
SPI_RW_Reg(WRITE_REG + RF_CH, 0);//设置工作信道为2.4GHZ,收发必须一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);//设置接收数据长度,本次设置为32字节
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);//设置发射速率为1MHZ
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);//IRQ收发完成中断响应,16位CRC,主发送
CE = 1;
}
void mode1()
{
CE = 0;
SPI_Write_Buf(WR_TX_PLOAD, Tx_Buf, TX_PLOAD_WIDTH);
CE = 1;
Delay_us(200);
CE = 0;
SPI_RW_Reg(FLUSH_TX, 0x00);
sta = SPI_RW_Reg(READ_REG+FIFO_STATUS,0x00);//发送 TxBuf 中的数据
SPI_RW_Reg(WRITE_REG+STATUS, 0xff);//清除状态标志
CE = 1;
}
void ADC_read()
{
ADC_CONTR = 0x80;
ADC_CONTR |= cnt;
ADC_CONTR |= 0x08;
Delay_us(50);
if(flag == 1)
{
flag = 0;
cnt =! cnt;
}
}
void main(void)
{
unsigned char temp = 0;
CLK_DIV |= 0x01;
EA = 1;
EADC = 1;
P1ASF = 0x05;
LED = 1;
Init_NRF24L01();
//初始化24L01
while (1)
{
ADC_read();
mode1();
if(!sta^4)
{
LED = 0;
}
else
{
LED = 1;
}
}
}
void ADC () interrupt 5
{
ADC_CONTR &= 0xef;
Tx_Buf[2+cnt] = ADC_RES;
ADC_RES = 0;
ADC_RESL = 0;
flag = 1;
}


2025-11-05 22:08:32
广告
不感兴趣
开通SVIP免广告
  • cyqchangyuqi
  • 入学新生
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include<STC12C5A60S2.h>
sbit CE=P1^0;
sbit CSN=P1^1;
sbit SCK=P1^2;
sbit MOSI=P1^3;
sbit MISO=P1^4;
sbit IRQ=P1^5;
sbit LED=P3^7;
#define TX_ADR_WIDTH 5
#define RX_ADR_WIDTH 5
#define TX_PLOAD_WIDTH 32
#define RX_PLOAD_WIDTH 32
unsigned char bdata sta;
sbit RX_DR = sta^6;
sbit TX_DS = sta^5;
sbit MAX_RT = sta^4;
unsigned char const TX_ADDRESS[TX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};
unsigned char const RX_ADDRESS[RX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};
unsigned char Tx_Buf[TX_PLOAD_WIDTH] = {0xff, 0xee, 0x11, 0x22, 0x33, 0xaa, 0xbb, 0x11, 0x22, 0x33,
0xaa, 0xbb, 0x11, 0x22, 0x33, 0xaa, 0xbb, 0x11, 0x22, 0x33,
0xaa, 0xbb, 0x11, 0x22, 0x33, 0xaa, 0xbb, 0x11, 0x22, 0x33,
0xee, 0xff};//发送数据
unsigned char Rx_Buf[RX_PLOAD_WIDTH];//接收数据
unsigned char code LEDchar[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};
unsigned char LEDnum[]={0xff,0xff,0xff,0xff};
unsigned char test1[] = {0x18, 0xba};
/*--NRF24L01寄存器指令----------------------------------------------*/
#define READ_REG 0x00//读寄存器指令
#define WRITE_REG 0x20//写寄存器指令
#define RD_RX_PLOAD 0x61//读取接收数据指令
#define WR_TX_PLOAD 0xa0//写待发数据指令
#define FLUSH_TX 0xe1//冲洗发送FIFO指令
#define FLUSH_RX 0xe2//冲洗接受FIFO指令
#define REUSE_TX_PL 0xe3//定义重复装载数据指令
#define NOP 0xff//保留
/*--SPI 寄存器地址--------------------------------------------------*/
#define CONFIG 0x00//配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA 0x01//自动应答功能设置
#define EN_RXADDR 0x02//可用信道设置
#define SETUP_AW 0x03//收发地址宽度设置
#define SETUP_RETR 0x04//自动重发功能设置
#define RF_CH 0x05//工作频率设置
#define RF_SETUP 0x06//发射速率、功耗功能设置
#define STATUS 0x07//状态寄存器
#define OBSERVE_TX 0x08//发送监测功能
#define CD 0x09//地址检测
#define RX_ADDR_P0 0x0a//频道0接收数据地址
#define RX_ADDR_P1 0x0b//频道1接收数据地址
#define RX_ADDR_P2 0x0c//频道2接收数据地址
#define RX_ADDR_P3 0x0d//频道3接收数据地址
#define RX_ADDR_P4 0x0e//频道4接收数据地址
#define RX_ADDR_P5 0x0f//频道5接收数据地址
#define TX_ADDR 0x10//发送地址寄存器
#define RX_PW_P0 0x11//接收频道0接收数据长度
#define RX_PW_P1 0x12//接收频道1接收数据长度
#define RX_PW_P2 0x13//接收频道2接收数据长度
#define RX_PW_P3 0x14//接收频道3接收数据长度
#define RX_PW_P4 0x15//接收频道4接收数据长度
#define RX_PW_P5 0x16//接收频道5接收数据长度
#define FIFO_STATUS 0x17//FIFO栈入栈出状态寄存器设置
void Delay_us(unsigned char time)
{
while(time - 1)
{
time --;
}
}
unsigned char SPI_RW(unsigned char dat) //发送dat数据,并返回接收到的数据
{
unsigned Bit_Count;
for(Bit_Count = 0; Bit_Count < 8; Bit_Count++)
{
MOSI = (dat & 0x80);
dat = (dat << 1);
SCK = 1;
dat |= MISO;
SCK = 0;
}
return(dat);
}
unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char Byte_Num)
{
unsigned char status, Byte_Count;
CSN = 0;//SPI使能
status = SPI_RW(reg);
for(Byte_Count = 0; Byte_Count < Byte_Num; Byte_Count++)
{
SPI_RW(*pBuf++);//指向下一个数据
}
CSN = 1;//关闭SPI
return(status);//返回24L01的状态
}
unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value)
{
unsigned char status;
CSN = 0;//CSN 拉低,启动SPI通信
status = SPI_RW(reg);//选择要操作的寄存器
SPI_RW(value);//向选择的寄存器中写入数据
CSN = 1;//CSN 拉高,终止SPI通信
return(status);//返回2401 reg寄存器的状态
}
void Init_NRF24L01(void)
{
CE = 0; //芯片使能
CSN = 1;//SPI 禁止2401的SPI功能
SCK = 0;//初始化SPI时钟
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);//设置本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);//设置接收地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);//频道0自动ACK应答 允许
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);//允许接收地址只有频道0,如果需要多频道可以参考说明文档第21页
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);//设置自动重发的延时和次数 延时大小4000+86us 次数5次
SPI_RW_Reg(WRITE_REG + RF_CH, 0);//设置工作信道为2.4GHZ,收发必须一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);//设置接收数据长度,本次设置为32字节
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);//设置发射速率为1MHZ
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);//IRQ收发完成中断响应,16位CRC,主接收
Delay_us(150);
}
unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char Byte_Num)
{
unsigned char status, ctr;
CSN = 0;//SPI使能
status = SPI_RW(reg);
for(ctr = 0; ctr < Byte_Num; ctr++)
{
pBuf[ctr] = SPI_RW(0x00);//指向下一个数据
}
CSN = 1;//关闭SPI
return(status);//返回24L01的状态
}
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{
unsigned char revale=0;
sta=SPI_RW_Reg(READ_REG+STATUS, 0x00); // 读取状态寄存其来判断数据接收状况
if(!sta^5) // 判断是否接收到数据
{
CE = 0; //SPI使能
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
revale =1; //读取数据完成标志
CE = 1;
Delay_us(150);
LED = 0;
}
SPI_RW_Reg(WRITE_REG+STATUS,0xff); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
return revale;
}
void main(void)
{
Delay_us(255);
CLK_DIV |= 0x01;
EA = 1;
TMOD = 0x01;
ET0 = 1;
TH0 = 0xfc;
TL0 = 0x17;
TR0 = 1;
P2M0 = 0x0f;
P2M1 = 0x00;
LED = 1;
Init_NRF24L01();
Delay_us(255);
while(1)
{
nRF24L01_RxPacket(Rx_Buf);
/*if(!sta^0)
{
LED = 0;
}
else
{
LED = 1;
}*/
LEDnum[0]=LEDchar[Rx_Buf[2]%16];
LEDnum[1]=LEDchar[Rx_Buf[2]/16%16];
LEDnum[2]=LEDchar[Rx_Buf[3]%16];
LEDnum[3]=LEDchar[Rx_Buf[3]/16%16];
}
}
void Interrupttimer0 () interrupt 1
{
unsigned char pin;
TH0 = 0xfc;
TL0 = 0x17;
P0 = 0xff;
switch (pin)
{
case 0: P2 &= 0xf0; P2 |= 0x01; pin++; P0 = LEDnum[0]; break;
case 1: P2 &= 0xf0; P2 |= 0x02; pin++; P0 = LEDnum[1]; break;
case 2: P2 &= 0xf0; P2 |= 0x04; pin++; P0 = LEDnum[2]; break;
case 3: P2 &= 0xf0; P2 |= 0x08; pin=0; P0 = LEDnum[3]; break;
default: break;
}
}


  • cyqchangyuqi
  • 入学新生
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
别沉了


  • 言多必失orz
  • 素质博导
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
你该去单片机论坛发,在这里发遇到大神的可能性不太大


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 4回复贴,共1页
<<返回中国海洋大学吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示