|
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"
#define NRF_PERIPH SYSCTL_PERIPH_GPIOH
#define NRF_BASE GPIO_PORTH_BASE
#define NRF_CE_PIN GPIO_PIN_2 //RX/TX模式选择端
#define NRF_CSN_PIN GPIO_PIN_3 //SPI片选端//就是SS
#define NRF_SCLK_PIN GPIO_PIN_4 //SPI时钟端
#define NRF_MOSI_PIN GPIO_PIN_5 //SPI主机输出从机输入端
#define NRF_MISO_PIN GPIO_PIN_6 //SPI主机输r出从机输出端
#define NRF_IRQ_PIN GPIO_PIN_7 //可屏蔽中断端
#define NRF_CE_SET HWREG(NRF_BASE + GPIO_O_DATA + (NRF_CE_PIN << 2))
#define NRF_IRQ_READ HWREG(NRF_BASE + GPIO_O_DATA + (NRF_IRQ_PIN << 2))
#define NRF_CSN_SET HWREG(NRF_BASE + GPIO_O_DATA + (NRF_CSN_PIN << 2))
#define NRF_MOSI_SET HWREG(NRF_BASE + GPIO_O_DATA + (NRF_MOSI_PIN<< 2))
#define NRF_MISO_READ HWREG(NRF_BASE + GPIO_O_DATA + (NRF_MISO_PIN<< 2))
#define NRF_SCLK_SET HWREG(NRF_BASE + GPIO_O_DATA + (NRF_SCLK_PIN<< 2))
#define Delay(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[i]=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);
}
|
|