社区导航

 

搜索
查看: 466|回复: 0

[资料分享] nRF24L01 MSP430 发送接收驱动程序

[复制链接]

5695

TA的帖子

19

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2017-11-11 22:43 | 显示全部楼层 |阅读模式
nrf24l01.c
[cpp] view plain copy
#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     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     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
[cpp] view plain copy
#ifndef _NRF24L01_H_  
#define _NRF24L01_H_  

#include    
#include    
#include    
#include    
#include    
#include    
#include    
#include    

//**********管脚定义************************************************************  
#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  



回复

使用道具 举报

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

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-11-18 13:54 , Processed in 0.077131 second(s), 18 queries , Gzip On, MemCache On.

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