nrf24l01读出来的值全是0x00,求大神!!!!
nrf24l01寄存器开始读出是默认值,但后来读出来的数据都是0x00,写了寄存器还是一样,我用LM3S9B96驱动的下面是程序
#ifndef _NRF24L01_H_
#define _NRF24L01_H_
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_ints.h"
#include "driverlib/gpio.h"
#include "inc/hw_gpio.h"
#include "driverlib/sysctl.h"
#include "driverlib/rom.h"
#include "driverlib/interrupt.h"
#defineNRF_PERIPH SYSCTL_PERIPH_GPIOH
#defineNRF_BASE GPIO_PORTH_BASE
#defineNRF_CE_PIN GPIO_PIN_2 //RX/TX模式选择端
#defineNRF_CSN_PIN GPIO_PIN_3 //SPI片选端//就是SS
#defineNRF_SCLK_PIN GPIO_PIN_4 //SPI时钟端
#defineNRF_MOSI_PIN GPIO_PIN_5 //SPI主机输出从机输入端
#defineNRF_MISO_PIN GPIO_PIN_6 //SPI主机输r出从机输出端
#defineNRF_IRQ_PIN GPIO_PIN_7 //可屏蔽中断端
#defineNRF_CE_SET HWREG(NRF_BASE + GPIO_O_DATA + (NRF_CE_PIN<< 2))
#defineNRF_IRQ_READ HWREG(NRF_BASE + GPIO_O_DATA + (NRF_IRQ_PIN << 2))
#defineNRF_CSN_SET HWREG(NRF_BASE + GPIO_O_DATA + (NRF_CSN_PIN << 2))
#defineNRF_MOSI_SET HWREG(NRF_BASE + GPIO_O_DATA + (NRF_MOSI_PIN<< 2))
#defineNRF_MISO_READ HWREG(NRF_BASE + GPIO_O_DATA + (NRF_MISO_PIN<< 2))
#defineNRF_SCLK_SET HWREG(NRF_BASE + GPIO_O_DATA + (NRF_SCLK_PIN<< 2))
#defineDelay(X) SysCtlDelay(X)
/***************************************************************************************************************/
#include "NRF24L01.h"
unsigned char TxAddr[]={0x34,0x43,0x10,0x10,0x01};//transmit address
/*****************status flag****************************************/
volatile unsigned char sta;
/*sbit RX_DR=sta^6;
sbit TX_DS=sta^5;
sbit MAX_RT=sta^4;*/
/*****************************SPI time sequence******************************/
unsigned char NRFSPI(unsigned char date)
{
unsigned char i;
for(i=0;i<8;i++) // circle eight times
{
if(date&0x80)
NRF_MOSI_SET=0xff;
date<<=1; // 低一位移位到最高位
NRF_SCLK_SET=0xff;
if(NRF_MISO_READ) // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据
date|=0x01; // 读MISO到byte最低位
NRF_SCLK_SET=0; // SCK set low
}
return(date);
}
/**********************NRF24L01 initialization *******************************/
void NRF24L01Int()
{
Delay(2);//让系统什么都不干
NRF_CE_SET=0; //待机模式1
NRF_CSN_SET=0xff;
NRF_SCLK_SET=0;
//NRF_IRQ_READ=0xff;
}
/*****************SPI read a byte in register*********************************/
unsigned char NRFReadReg(unsigned char RegAddr)
{
unsigned char BackDate;
NRF_CSN_SET=0;//enable SPI
NRFSPI(RegAddr);//writing address of register to register
BackDate=NRFSPI(0x00);//writing a command to register
NRF_CSN_SET=0xff;
return(BackDate);
}
/*****************SPI a byte to register*********************************/
unsigned char NRFWriteReg(unsigned char RegAddr,unsigned char date)
{
unsigned char BackDate;
NRF_CSN_SET=0;//启动时序
BackDate=NRFSPI(RegAddr);//写入地址
NRFSPI(date);//写入值
NRF_CSN_SET=0xff;
return(BackDate);
}
/*****************SPI read a value from RXFIFO register ********************************/
unsigned char NRFReadRxDate(unsigned char RegAddr,unsigned char *RxDate,unsigned char DateLen)
{//寄存器地址//读取数据存放变量//读取数据长度//用于接收
unsigned char BackDate,i;
NRF_CSN_SET=0;//启动时序
BackDate=NRFSPI(RegAddr);//写入要读取的寄存器地址
for(i=0;i<DateLen;i++) //读取数据
{
RxDate=NRFSPI(0);
}
NRF_CSN_SET=0xff;
return(BackDate);
}
/*****************SPI write values to TXFIFO register**********************************/
unsigned char NRFWriteTxDate(unsigned char RegAddr,unsigned char *TxDate,unsigned char DateLen)
{ //寄存器地址//写入数据存放变量//读取数据长度//用于发送
unsigned char BackDate,i;
NRF_CSN_SET=0;
BackDate=NRFSPI(RegAddr);//写入要写入寄存器的地址
for(i=0;i<DateLen;i++)//写入数据
{
NRFSPI(*TxDate++);
}
NRF_CSN_SET=0xff;
return(BackDate);
}
/*****************NRF is set model of transmitting and send data******************************/
void NRFSetTxMode(unsigned char *TxDate)
{//发送模式
NRF_CE_SET=0;
NRFWriteTxDate(W_REGISTER+TX_ADDR,TxAddr,TX_ADDR_WITDH);//写寄存器指令+接收地址使能指令+接收地址+地址宽度
NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);//为了应答接收设备,接收通道0地址和发送地址相同
NRFWriteTxDate(W_TX_PAYLOAD,TxDate,TX_DATA_WITDH);//写入数据
/******下面有关寄存器配置**************/
NRFWriteReg(W_REGISTER+EN_AA,0x01); // 使能接收通道0自动应答
NRFWriteReg(W_REGISTER+EN_RXADDR,0x01); // 使能接收通道0
NRFWriteReg(W_REGISTER+SETUP_RETR,0x0a);// 自动重发延时等待250us+86us,自动重发10次
NRFWriteReg(W_REGISTER+RF_CH,0x40); // 选择射频通道0x40
NRFWriteReg(W_REGISTER+RF_SETUP,0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
NRFWriteReg(W_REGISTER+CONFIG,0x0e); // CRC使能,16位CRC校验,上电
NRF_CE_SET=0xff;
Delay(5);//保持10us秒以上
}
/*****************NRF设置为接收模式并接收数据******************************/
//主要接收模式
void NRFSetRXMode()
{
NRF_CE_SET=0;
NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);// 接收设备接收通道0使用和发送设备相同的发送地址
NRFWriteReg(W_REGISTER+EN_AA,0x01); // 使能接收通道0自动应答
NRFWriteReg(W_REGISTER+EN_RXADDR,0x01); // 使能接收通道0
NRFWriteReg(W_REGISTER+RF_CH,0x40); // 选择射频通道0x40
NRFWriteReg(W_REGISTER+RX_PW_P0,TX_DATA_WITDH);// 接收通道0选择和发送通道相同有效数据宽度
NRFWriteReg(W_REGISTER+RF_SETUP,0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益*/
NRFWriteReg(W_REGISTER+CONFIG,0x0f); // CRC使能,16位CRC校验,上电,接收模式
NRF_CE_SET = 0xff;
Delay(5);//保持10us秒以上
}
/****************************检测应答信号******************************/
unsigned char CheckACK()
{//用于发射
sta=NRFReadReg(R_REGISTER+STATUS); // 返回状态寄存器
if((0x20&sta)||(0x10&sta)) //发送完毕中断TX_DS||MAX_RT 5 4
{
NRFWriteReg(W_REGISTER+STATUS,0xff);// 清除TX_DS或MAX_RT中断标志
NRF_CSN_SET=0;
NRFSPI(FLUSH_TX);//用于清空FIFO !!关键!!不然会出现意想不到的后果!!!大家记住!!
NRF_CSN_SET=0xff;
return(0);
}
else
return(1);
}
/******************判断是否接收收到数据,接到就从RX取出*********************/
//用于接收模式
unsigned char NRFRevDate(unsigned char *RevDate)
{
unsigned char RevFlags=0;
sta=NRFReadReg(R_REGISTER+STATUS);//发送数据后读取状态寄存器
if(0x40&sta) // 判断是否接收到数据RX_DR6
{
NRF_CE_SET=0; //SPI使能
NRFReadRxDate(R_RX_PAYLOAD,RevDate,RX_DATA_WITDH);// 从RXFIFO读取数据
RevFlags=1; //读取数据完成标志
}
NRFWriteReg(W_REGISTER+STATUS,0xff); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标
return(RevFlags);
}
int main(void)
{ unsigned char temp=0;
SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_8MHZ);
SysCtlPeripheralEnable(NRF_PERIPH);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
GPIOPinTypeGPIOOutput(NRF_BASE, NRF_SCLK_PIN | NRF_CE_PIN| NRF_CSN_PIN |
NRF_MOSI_PIN | NRF_SCLK_PIN);
GPIOPinTypeGPIOInput(NRF_BASE,NRF_MISO_PIN);
NRF24L01Int();
//temp= NRFWriteReg(W_REGISTER+CONFIG,0x0e);
temp=NRFReadReg(0x00);//这里写寄存器地址,读出来总是0x00
while(temp);
}
代码好长啊。。。
unsigned char NRF24L01_Check(void)//检测24L01是否存在 0:失败1:成功
{
unsigned char BackDate;
unsigned char i,buf={0xa5,0xa5,0xa5,0xa5,0xa5};
NRFWriteTxDate(W_REGISTER+TX_ADDR,buf,5);//写入5个字节的地址.
NRFReadRxDate(TX_ADDR,buf,5);//读出写入的地址
for(i=0;i<5;i++)//检测24L01错误
{
if(buf!=0xa5)
{
BackDate=0;
break;
}
else
{BackDate=1;}//检测到24L01
}
return BackDate;
} 我的MFRC500读出来全是0X05...................................... 解决了,谢谢你们 我的也出现了类似的错误,接收端RxBuf一直是0x00;
不上电就是0xff。
一直没有找到错误。
——我是在一个正确的程序上稍做的修改,但是就是不行,串口观察这些数据,就都是0x00.
您已经解决,不知可否给解释解释,帮帮吗?多谢。 zerolee18 发表于 2013-3-30 16:23 static/image/common/back.gif
我的也出现了类似的错误,接收端RxBuf一直是0x00;
不上电就是0xff。
一直没有找到错误。
你把SPI代码发来看看 ele-madman 发表于 2013-3-31 14:14 static/image/common/back.gif
你把SPI代码发来看看
你好,现在在吗??好的,我把程序传给你,马上。
我现在已经得到了另外一个程序,并做了修改已经顺利调好。
第一个,也就是0x00的还是没有想明白,你给看看,多请教了。
我是改的坛子里的一个收发一体一对一的程序,把它改成一个发射,一个接受。
我主要是改了主函数的部分,但是最后没调通。你给看看。多谢。 本帖最后由 ele-madman 于 2013-3-31 21:50 编辑
zerolee18 发表于 2013-3-31 17:01 static/image/common/back.gif
你好,现在在吗??好的,我把程序传给你,马上。
我现在已经得到了另外一个程序,并做了修改已经顺利调 ...
你看下
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
}
这里改下试试,,,,MOSI = (uchar & 0x80) ? 1 : 0; //你MOSI是位定义 ele-madman 发表于 2013-3-31 21:37 static/image/common/back.gif
你看下
uint SPI_RW(uint uchar)
{
我现在没有权限,不能够直接对话,要不给个QQ号呗,在线聊聊。
并且最近在做一些东西,其中就有一块是无线通讯的2401,
希望交流交流,不吝赐教。 zerolee18 发表于 2013-3-31 22:45
我现在没有权限,不能够直接对话,要不给个QQ号呗,在线聊聊。
并且最近在做一些东西,其中就有一块是无 ...
无线模块我只是照着例程条通的,,,要深入的话就无能为力了,,,到是很希望多交流QQ:390157155
你好,你们的nrf24l01的输出口输出脉冲的幅值是多少,我的是2.8伏,所以一直读不出来它的内部寄存器的值,(我的单片是5伏的,2.8伏达不到高电平的要求) 你好 我现在用的LM3S1138 能不能给我一份调好的程序 我试试~ wbdos 发表于 2013-4-17 15:56 static/image/common/back.gif
你好 我现在用的LM3S1138 能不能给我一份调好的程序 我试试~
已发送 charlieholy 发表于 2013-3-20 19:24 static/image/common/back.gif
我的MFRC500读出来全是0X05......................................
0x05 是SPI模式的问题,调好,立马搞定{:lol:} 本帖最后由 ele-madman 于 2013-4-24 20:51 编辑
nrf24l01代码
页:
[1]