nrf24l01.c
#include "nrf24l01.h"
unsigned char flag=0;//状态寄存器(STATUS)标志
unsigned char success=0;//发送接收成功与否标志,0为失败,1为发送成功,2为接收成功
unsigned char TXBuf[TX_PLOAD_WIDTH]={0x68,0x86,0x00};
unsigned char RXBuf[RX_PLOAD_WIDTH]={0x00,0x00,0x00};
unsigned char TX_ADDRESS[TX_ADDR_WIDTH]={0x04,0x01,0x02,0x03,0x00}; //接收节点地址(0通道40位可任意配置)
unsigned char RX_ADDRESS[RX_ADDR_WIDTH]={0x04,0x01,0x02,0x03,0x00}; //接收地址(与接收节点地址相同)
//Function:延时t*ms
void Delayms(unsigned int t)
{SysCtlDelay(t*2000);}
//Function:延时t*us
void Delayus(unsigned int t)
{SysCtlDelay(t*2);}
//Function:系统初始化
void SystemInit(void)
{
SysCtlLDOSet(SYSCTL_LDO_2_50V);//设置LDO输出电压为2.5v
SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_6MHZ);//系统时钟设置,采用主振荡器,外晶振6MHZ,不分频
}
//Function:管脚配置初始化
void NrfInitPort(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
GPIOPinTypeGPIOOutput(CE);
GPIOPinTypeGPIOOutput(CSN);
GPIOPinTypeGPIOOutput(MOSI);
GPIOPinTypeGPIOInput(MISO);//MISO配置为输入
GPIOPinTypeGPIOOutput(SCK);
GPIOPinTypeGPIOInput(IRQ);
GPIOIntTypeSet(IRQ,GPIO_LOW_LEVEL);//低电平触发
GPIOPinIntEnable(IRQ);//开启端口引脚中断
IntEnable(INT_GPIOA);//开启GPIOA总中断
}
//Function:SPI写入一字节,同时读出一字节
unsigned char SPIWriteRead(unsigned char c)
{
unsigned char i;
for(i=0;i<8;i++)
{
GPIOPinWrite(MOSI,(0x80&c)>>5);//SPI写
c<<=1;
GPIOPinWrite(SCK,0xFF);
c|=(GPIOPinRead(MISO)>>1);//SPI读
GPIOPinWrite(SCK,0x00);
}
return c;
}
//Function:从寄存器中读取状态字节
unsigned char ReadReg(unsigned char reg)
{
unsigned char regVal;
GPIOPinWrite(CSN,0x00);//片选
SPIWriteRead(R_REGISTER+reg);
regVal=SPIWriteRead(0);//只读,故参数值()内任意取char型值
GPIOPinWrite(CSN,0xFF);
return regVal;
}
//Function:向寄存器写入一字节,同时返回状态字节
unsigned char WriteReadReg(unsigned char reg,unsigned char value)
{
unsigned char status;
GPIOPinWrite(CSN,0x00);
status=SPIWriteRead(reg);//选择寄存器(写指令)
SPIWriteRead(value);//写入值(配置寄存器)
GPIOPinWrite(CSN,0xFF);
return status;
}
//Function:从寄存器读出num字节的数据(pBuf),同时返回状态字节
unsigned char ReadBuf(unsigned char reg,unsigned char *pBuf,unsigned char num)
{
unsigned char i,status;
GPIOPinWrite(CSN,0x00);
status=SPIWriteRead(reg);//选择寄存器(写指令)
for(i=0;i<num;i++)
pBuf[i]=SPIWriteRead(0);//读取num字节数据
GPIOPinWrite(CSN,0xFF);
return status;
}
//Function:向寄存器写入num字节的数据(pBuf),同时返回状态字节
unsigned char WriteBuf(unsigned char reg,unsigned char*pBuf,unsigned char num)
{
unsigned char i,status;
GPIOPinWrite(CSN,0x00);
status=SPIWriteRead(reg);//选择寄存器(写指令)
for(i=0;i<num;i++)
SPIWriteRead(pBuf[i]);//读取num字节数据
GPIOPinWrite(CSN,0xFF);
return status;
}
//Function:接收启动函数
void RXReady(void)
{
WriteReadReg(W_REGISTER+CONFIG,0x0F);//IRQ收发完成中断响应,16位CRC,PWR_UP上电,接收模式
GPIOPinWrite(CE,0xFF);//CE置高使能接收模式
Delayus(130);//待机模式->接收模式用时最长为130us
}
//Function:发送启动函数
void TXReady(unsigned char *txBuf)
{
GPIOPinWrite(CE,0x00);
WriteBuf(W_TX_PAYLOAD,txBuf,TX_PLOAD_WIDTH);//装载发送数据
WriteReadReg(W_REGISTER + CONFIG, 0x0E);//IRQ收发完成中断响应,16位CRC,PWR_UP上电,发送模式
GPIOPinWrite(CE,0xFF);//启动发送
Delayus(10);//CE高电平保持时间至少10us
}
//Function:Nrf寄存器初始化
void NrfInit(void)
{
GPIOPinWrite(CE,0x00);//芯片使能关闭
GPIOPinWrite(CSN,0xFF);//片选关闭
GPIOPinWrite(SCK,0x00);//SPI时钟为低
WriteBuf(W_REGISTER+TX_ADDR, TX_ADDRESS, TX_ADDR_WIDTH);//写本地地址
WriteBuf(W_REGISTER+RX_ADDR_P0, RX_ADDRESS, RX_ADDR_WIDTH);//写接收端地址
WriteReadReg(W_REGISTER+EN_AA, 0x01);//频道0自动ACK应答允许
WriteReadReg(W_REGISTER+EN_RXADDR, 0x01);//允许接收地址只有频道0
WriteReadReg(W_REGISTER+RF_CH, 0x40);//设置信道工作为 GHZ,收发必须一致
WriteReadReg(W_REGISTER+RX_PW_P0, RX_PLOAD_WIDTH);//设置接收数据长度
WriteReadReg(W_REGISTER+RF_SETUP, 0x07);//设置发射速率为1MHZ,发射功率为最大值0dB
IntMasterEnable();//使能控制器中断
}
//Function:IRQ(PA0)中断处理函数,判断发送还是接收中断,接收则读出数据
void GPIO_Port_A_ISR(void)
{
unsigned char temp;//端口中断值
temp=GPIOPinIntStatus(GPIO_PORTA_BASE,true);//读取中断
GPIOPinIntClear(GPIO_PORTA_BASE,temp);//清除中断
flag=ReadReg(STATUS);//读取STATUS寄存器值
GPIOPinWrite(CE,0x00);//进入待机模式
if((flag<<1)&0x80)//判断是否为接收中断
{
ReadBuf(R_RX_PAYLOAD,RXBuf,RX_PLOAD_WIDTH);//接收中断则从Buf中读出数据
success=2;
}
if((flag<<2)&0x80)//判断是否为发送完成中断
success=1;
if((flag<<3)&0x80)//判断是否为达到最多次重发中断
success=0;
WriteReadReg(W_REGISTER+STATUS,flag);//清除中断
}
nrf24l01.h
#ifndef _NRF24L01_H_
#define _NRF24L01_H_
#include <hw_types.h>
#include <hw_memmap.h>
#include <hw_sysctl.h>
#include <hw_gpio.h>
#include <sysctl.h>
#include <gpio.h>
#include <hw_ints.h>
#include <interrupt.h>
//**********管脚定义************************************************************
#define CE GPIO_PORTA_BASE,GPIO_PIN_5 //芯片使能
#define CSN GPIO_PORTA_BASE,GPIO_PIN_4 //SPI片选,低电平使能
#define SCK GPIO_PORTA_BASE,GPIO_PIN_3 //SPI时钟
#define MOSI GPIO_PORTA_BASE,GPIO_PIN_2 //SPI主器件输出,从器件输入
#define MISO GPIO_PORTA_BASE,GPIO_PIN_1 //SPI主器件输入,从器件输出
#define IRQ GPIO_PORTA_BASE,GPIO_PIN_0 //中断输出
//**********NRF24L01寄存器指令**************************************************
#define R_REGISTER 0x00 // 读寄存器指令
#define W_REGISTER 0x20 // 写寄存器指令
#define R_RX_PAYLOAD 0x61 // 读取接收数据指令
#define W_TX_PAYLOAD 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栈入栈出状态寄存器设置
#define TX_ADDR_WIDTH 5 //(发送)接收节点地址宽度(3-5字节)
#define RX_ADDR_WIDTH 5 //接收地址宽度(3-5字节)
#define TX_PLOAD_WIDTH 9 //发送数据有效宽度(1-32字节)
#define RX_PLOAD_WIDTH 9 //接收数据有效宽度(1-32字节)
extern unsigned char TX_ADDRESS[TX_ADDR_WIDTH]; //接收节点地址(0通道40位可任意配置)
extern unsigned char RX_ADDRESS[RX_ADDR_WIDTH]; //接收地址(与接收地址相同)
extern unsigned char flag;//状态寄存器(STATUS)标志
extern unsigned char success;//发送接收成功与否标志,0为失败,1为发送成功,2为接收成功
extern unsigned char TXBuf[];
extern unsigned char RXBuf[];
void Delayms(unsigned int t);//Function:延时t*ms
void Delayus(unsigned int t);//Function:延时t*us
void SystemInit(void);//Function:系统初始化
void NrfInitPort(void);//Function:管脚配置初始化
unsigned char SPIWriteRead(unsigned char c);//Function:SPI写入一字节,同时读出一字节
unsigned char ReadReg(unsigned char reg);//Function:从寄存器中读取状态字节
unsigned char WriteReadReg(unsigned char reg,unsigned char value);//Function:向寄存器写入一字节,同时返回状态字节
unsigned char ReadBuf(unsigned char reg,unsigned char *pBuf,unsigned char num);//Function:从寄存器读出num字节的数据(pBuf),同时返回状态字节
unsigned char WriteBuf(unsigned char reg,unsigned char*pBuf,unsigned char num);//Function:向寄存器写入num字节的数据(pBuf),同时返回状态字节
void RXReady(void);//Function:接收启动函数
void TXReady(unsigned char *txBuf);//Function:发送启动函数
void NrfInit(void);//Function:Nrf寄存器初始化
void GPIO_Port_A_ISR(void);//Function:IRQ(PA0)中断处理函数,判断发送还是接收中断,接收则读出数据
#endif