智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3521|回复: 9
打印 上一主题 下一主题

24l01问题,能发送出去,接收不到,求解。。。

[复制链接]

17

主题

356

帖子

0

精华

常驻嘉宾

菜鸟一枚

Rank: 8Rank: 8

积分
4240
QQ
威望
2035
贡献
1297
兑换币
944
注册时间
2011-8-23
在线时间
454 小时
跳转到指定楼层
1#
发表于 2012-8-12 15:05:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如下是接收代码:
#include <reg52.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned char uint;
//****************************************IO端口定义***************************************
sbit  MISO =P3^3;
sbit  MOSI =P3^2;
sbit  SCK  =P1^3;
sbit  CE   =P3^5;
sbit  CSN  =P1^2;
sbit  IRQ  =P3^4;
//************************************按键***************************************************
sbit KEY1=P1^4;
sbit   shuma=P1^7;
//************************************数码管位选*********************************************
sbit led=P1^1;
sbit    led1=P1^0;
//************************************蜂明器***************************************************
sbit  BELL=P1^6;
//***********************************数码管0-9编码*******************************************
uchar seg[16]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,
                 0x1f,0x01,0x09,0x11,0xc1,0x63,0x85,0x61,0x71};
         //0~~9段码
//uchar code TxBuf[4]={0x01,0x02,0x03,0x04};
//uchar code TxBuf[32]={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};
//*********************************************NRF24L01*************************************
#define TX_ADR_WIDTH 5 // 5 uints TX address width
#define RX_ADR_WIDTH 5 // 5 uints RX address width
#define TX_PLOAD_WIDTH 4 // 20 uints TX payload
#define RX_PLOAD_WIDTH 4 // 20 uints TX payload
uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址
uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址
//***************************************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(nRF24L01)寄存器地址****************************************************
#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 // 接收频道0接收数据长度
#define RX_PW_P2 0x13 // 接收频道0接收数据长度
#define RX_PW_P3 0x14 // 接收频道0接收数据长度
#define RX_PW_P4 0x15 // 接收频道0接收数据长度
#define RX_PW_P5 0x16 // 接收频道0接收数据长度
#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置
//**************************************************************************************
void Delay(unsigned int s);
void inerDelay_us(unsigned char n);
void init_NRF24L01(void);
uint SPI_RW(uint uchar);
uchar SPI_Read(uchar reg);
void SetRX_Mode(void);
uint SPI_RW_Reg(uchar reg, uchar value);
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
void nRF24L01_TxPacket(unsigned char * tx_buf);
//*****************************************长延时*****************************************
void Delay(unsigned int s)
{
unsigned int i;
for(i=0; i<s; i++);
for(i=0; i<s; i++);
}
//******************************************************************************************
uint bdata sta; //状态标志
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
/******************************************************************************************
/*延时函数
/******************************************************************************************/
void inerDelay_us(unsigned char n)
{
for(;n>0;n--)
_nop_();
}
//****************************************************************************************
/*NRF24L01初始化
//***************************************************************************************/
void init_NRF24L01(void)
{
   inerDelay_us(100);
   CE=0; // chip enable
   CSN=1; // Spi disable  
  SCK=0; // Spi clock line init high
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, 0x01); // 频道0自动 ACK应答允许
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21   
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,发射功率为最大值0dB
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收
}
/****************************************************************************************************
/*函数:uint SPI_RW(uint uchar)
/*功能:NRF24L01的SPI写时序
/****************************************************************************************************/
uint SPI_RW(uint uchar)
{
uint bit_ctr;
   for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
   {
MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI
uchar = (uchar << 1); // shift next bit into MSB..
SCK = 1; // Set SCK high..
uchar |= MISO; // capture current MISO bit
SCK = 0; // ..then set SCK low again
   }
   return(uchar); // return read uchar
}
/****************************************************************************************************
/*函数:uchar SPI_Read(uchar reg)
/*功能:NRF24L01的SPI时序
/****************************************************************************************************/
uchar SPI_Read(uchar reg)
{
uchar reg_val;

CSN = 0; // CSN low, initialize SPI communication...
SPI_RW(reg); // Select register to read from..
reg_val = SPI_RW(0); // ..then read registervalue
CSN = 1; // CSN high, terminate SPI communication

return(reg_val); // return register value
}
/****************************************************************************************************/
/*功能:NRF24L01读写寄存器函数
/****************************************************************************************************/
uint SPI_RW_Reg(uchar reg, uchar value)
{
uint status;

CSN = 0; // CSN low, init SPI transaction
status = SPI_RW(reg); // select register
SPI_RW(value); // ..and write value to it..
CSN = 1; // CSN high again

return(status); // return nRF24L01 status uchar
}
/****************************************************************************************************/
/*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数
/****************************************************************************************************/
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;

CSN = 0; // Set CSN low, init SPI tranaction
status = SPI_RW(reg); // Select register to write to and read status uchar

for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
pBuf[uchar_ctr] = SPI_RW(0); //  
CSN = 1;   
return(status); // return nRF24L01 status uchar
}
/*********************************************************************************************************
/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
/*********************************************************************************************************/
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;

CSN = 0; //SPI使能   
status = SPI_RW(reg);   
for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
SPI_RW(*pBuf++);
CSN = 1; //关闭SPI
return(status); //  
}
/****************************************************************************************************/
/*函数:void SetRX_Mode(void)
/*功能:数据接收配置  
/****************************************************************************************************/
void SetRX_Mode(void)
{
CE=0;
// SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收
CE = 1;  
inerDelay_us(130);
}
/******************************************************************************************************/
/*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
/*功能:数据读取后放如rx_buf接收缓冲区中  
/******************************************************************************************************/
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{
   unsigned char revale=0;
sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况
if(RX_DR) // 判断是否接收到数据
{
CE = 0; //SPI使能
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
revale =1; //读取数据完成标志
}
SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
return revale;
}
/***********************************************************************************************************
/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
/*功能:发送 tx_buf中数据
/**********************************************************************************************************/
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
CE=0; //StandBy I模式
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送
CE=1; //置高CE,激发数据发送
inerDelay_us(10);
}
//************************************串口初始化*********************************************************
void StartUART( void )
{
  SM0=0; //设置串行口工作方式为方式1。SM0=0,SM1=0为工作方式0.依次类推
SM1=1;
REN=1; //串行口接收允许。REN=0时,禁止接收。
TMOD=0x20; //定时器1工作方式2.
TH1=0xfd; //相应波特率设初值计算方法。 初值X=(256-11059200/(12*32*9600))  
TL1=0xfd; //9600为你要设置的波特率。11059200为晶振频率。X的值最后要换算成16进制
TR1=1;
}
//************************************通过串口将接收到数据发送给PC端**************************************
void R_S_Byte(uchar R_Byte)
{
SBUF = R_Byte;   
  while( TI == 0 ); //查询法
   TI = 0;   
}
//************************************主函数************************************************************
void main(void)
{
uchar i;
uchar RxBuf[4];
  init_NRF24L01() ;
StartUART();
Delay(6000);
while(1)
{
SetRX_Mode();
   if(nRF24L01_RxPacket(RxBuf))
{
P2=0x00;
for(i=0;i<4;i++)
{
R_S_Byte(RxBuf[i]);
Delay(600);
}
}

}

}  

26

主题

913

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5207

活跃会员奖章在线王奖章优秀会员奖章论坛元老奖章

威望
2267
贡献
1804
兑换币
117
注册时间
2011-3-16
在线时间
568 小时
2#
发表于 2012-8-12 21:24:06 | 只看该作者
好长啊,你如何确定你发出去了?
回复 支持 反对

使用道具 举报

17

主题

356

帖子

0

精华

常驻嘉宾

菜鸟一枚

Rank: 8Rank: 8

积分
4240
QQ
威望
2035
贡献
1297
兑换币
944
注册时间
2011-8-23
在线时间
454 小时
3#
 楼主| 发表于 2012-8-14 18:51:32 | 只看该作者
wgl404 发表于 2012-8-12 21:24
好长啊,你如何确定你发出去了?

嗯,的确挺长的。我按照网上调试的那种方法,查看状态寄存器STATUS的值,如果是0x2e,那就说明发出去了;或者查看FIFO_STATUS的值,是0x11,也说明发出去,我用数码管读了一下,确实是那两个值。接收我也调好了,是其中的某个参数没改,所以收不到,已经解决了,用串口能看到发过来的数据了!
回复 支持 反对

使用道具 举报

26

主题

913

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5207

活跃会员奖章在线王奖章优秀会员奖章论坛元老奖章

威望
2267
贡献
1804
兑换币
117
注册时间
2011-3-16
在线时间
568 小时
4#
发表于 2012-8-14 20:10:10 | 只看该作者
xiaobai727 发表于 2012-8-14 18:51
嗯,的确挺长的。我按照网上调试的那种方法,查看状态寄存器STATUS的值,如果是0x2e,那就说明发出去了; ...

So,恭喜呀!
回复 支持 反对

使用道具 举报

17

主题

356

帖子

0

精华

常驻嘉宾

菜鸟一枚

Rank: 8Rank: 8

积分
4240
QQ
威望
2035
贡献
1297
兑换币
944
注册时间
2011-8-23
在线时间
454 小时
5#
 楼主| 发表于 2012-8-15 14:39:00 | 只看该作者
wgl404 发表于 2012-8-14 20:10
So,恭喜呀!

嗯,谢谢。。。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

注册会员

Rank: 2

积分
47
威望
108
贡献
29
兑换币
0
注册时间
2012-3-12
在线时间
1 小时
毕业学校
山大
6#
发表于 2012-8-29 11:11:44 | 只看该作者
请问你把哪个地方改了?我的也是接收不到啊求解
回复 支持 反对

使用道具 举报

17

主题

356

帖子

0

精华

常驻嘉宾

菜鸟一枚

Rank: 8Rank: 8

积分
4240
QQ
威望
2035
贡献
1297
兑换币
944
注册时间
2011-8-23
在线时间
454 小时
7#
 楼主| 发表于 2012-9-2 15:44:50 | 只看该作者
似水无痕 发表于 2012-8-29 11:11
请问你把哪个地方改了?我的也是接收不到啊求解

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // 这句最后改为0xff,这是选择模式的,0xfe是发送模式。

回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

注册会员

Rank: 2

积分
26
威望
24
贡献
2
兑换币
3
注册时间
2012-12-17
在线时间
0 小时
毕业学校
1
8#
发表于 2012-12-17 18:04:18 | 只看该作者
xiaobai727 发表于 2012-9-2 15:44
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // 这句最后改为0xff,这是选择模式的,0xfe是发送模式。

你主函数没有用到这条程序吧
回复 支持 反对

使用道具 举报

17

主题

356

帖子

0

精华

常驻嘉宾

菜鸟一枚

Rank: 8Rank: 8

积分
4240
QQ
威望
2035
贡献
1297
兑换币
944
注册时间
2011-8-23
在线时间
454 小时
9#
 楼主| 发表于 2012-12-22 23:11:31 | 只看该作者
〢ヽ习惯 发表于 2012-12-17 18:04
你主函数没有用到这条程序吧

这个已经是很久之前的问题了,已经解决了,不过还是很感谢你能解答。。。
回复 支持 反对

使用道具 举报

0

主题

90

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3815
QQ
威望
1971
贡献
1326
兑换币
1151
注册时间
2012-12-10
在线时间
259 小时
毕业学校
黑龙江工程学院
10#
发表于 2012-12-23 12:25:40 | 只看该作者
;P
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-26 12:02 , Processed in 0.115273 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表