NRF24L01.zip

  • 爱玲儿
    了解作者
  • C/C++
    开发工具
  • 75KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 10 积分
    下载积分
  • 2
    下载次数
  • 2017-07-26 11:44
    上传日期
基于STC12C5A60S2单片机的利用SPI实现NRF24L01无线传输
NRF24L01.zip
  • NRF24L01
  • NRF24L01.LST
    10.1KB
  • NRF24L01.OBJ
    16.3KB
  • NRF24L01_C51.uvopt
    58.3KB
  • NRF24L01_C51.uvgui_Administrator.bak
    138KB
  • NRF24L01.c
    5.1KB
  • NRF24L01.h
    3KB
  • NRF24L01_C51.hex
    8KB
  • NRF24L01_C51_uvopt.bak
    58.3KB
  • main.OBJ
    8.5KB
  • NRF24L01_C51.plg
    1.5KB
  • NRF24L01_C51.uvgui.Administrator
    138KB
  • NRF24L01_C51.uvproj
    13.2KB
  • SPI.h
    551B
  • SPI.LST
    4.3KB
  • NRF24L01_C51.lnp
    77B
  • NRF24L01_C51
    26.5KB
  • SPI.c
    2KB
  • NRF24L01_C51.build_log.htm
    896B
  • NRF24L01_C51.M51
    24.3KB
  • main.LST
    6.9KB
  • main.c
    3KB
  • SPI.OBJ
    5.2KB
  • NRF24L01_C51_uvproj.bak
    13.8KB
  • MCU.h
    191B
内容介绍
#include "NRF24L01.H" uchar idata nrf_sta; uchar idata RxBuf[32] = "0"; //接收缓存 存入idata区 uchar idata TxBuf[32] = "0"; //发送缓存 uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址 uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址 //===== 粗略的延时 ===== void delayus(uint us) { while(us--); } //================== NRF24L01初始化 ================== void init_NRF24L01(void) { delayus(100); CE = 0; // 片选使能 CSN = 1; // SPI使能 SCK = 0; // SPI时钟拉低 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_Write_Reg(WRITE_REG + EN_AA, 0x01); //通道0自动应答 SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x01); //允许接收地址频道0 SPI_Write_Reg(WRITE_REG + RF_CH, 0x32); //设置信道工作频率,收发必须一致 SPI_Write_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度 SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0f); //设置发射速率为2MHZ,发射功率为最大值0dB SPI_Write_Reg(WRITE_REG + NRF_CONFIG, 0x7c); //IRQ引脚不显示中断 掉电模式 1~16CRC校验 } //================== //读取状态标志 //================== void get_nrf_sta(void) { nrf_sta = SPI_Read_Reg(STATUS); SPI_Write_Reg(WRITE_REG+STATUS,nrf_sta); } //================== //设置为接收模式 //================== void nrf_RxMod(void) { CE = 0; SPI_Write_Reg(WRITE_REG+STATUS,0xff); //清除中断标志 SPI_Write_Reg(FLUSH_RX,0x00); //清除RX_FIFO寄存器 SPI_Write_Reg(WRITE_REG + NRF_CONFIG, 0x7f);//IRQ引脚不显示中断 上电 接收模式 1~16CRC校验 CE = 1; delayus(100); } //================== //把接收到的数据存入数组 //================== void nrf_read(uchar *rx_buf) { if(RX_DR == 1) //收到数据 { CE = 0; SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);//读取数据 存入数组 SPI_Write_Reg(FLUSH_RX,0x00);//清除rx fifo寄存器 CE = 1; delayus(100); } } //================== //设置为发送模式 //================== void nrf_TxMod(void) { CE = 0; SPI_Write_Reg(WRITE_REG+STATUS,0xff); //清除中断标志 SPI_Write_Reg(FLUSH_TX,0x00); //清除TX_FIFO寄存器 SPI_Write_Reg(WRITE_REG + NRF_CONFIG,0x7e); //IRQ引脚不显示中断 上电 发射模式 1~16CRC校验 CE = 1; delayus(100); } //================== //发送 不做任何判断只管发送 //================== void nrf_trans(uchar *tx_buf) { CE = 0; //StandBy I模式 SPI_Write_Reg(WRITE_REG+STATUS,0xFF); //清除所有中断 SPI_Write_Reg(FLUSH_TX,0x00); //清除tx fifo寄存器 //===== 重要 ===== SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址 SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); // 装载数据 CE = 1; //置高CE激发数据发送 delayus(100); //此延时必须有 因为从待机模式到收发模式需要时间,最大需要130us } //========================= //将float数编码装载 保留4位小数 //占用5个字节 数据范围+- 65535.9999 //========================= void nrf_load_float(uchar a,float num) { if(num > 0) { TxBuf[a] = '+'; TxBuf[a+1] = (uint)num/256; TxBuf[a+2] = (uint)num%256; TxBuf[a+3] = (uint)((num - (int)num)*10000)/256; TxBuf[a+4] = (uint)((num - (int)num)*10000)%256; } else if(num < 0) { num = -num; TxBuf[a] = '-'; TxBuf[a+1] = (uint)num/256; TxBuf[a+2] = (uint)num%256; TxBuf[a+3] = (uint)((num - (int)num)*10000)/256; TxBuf[a+4] = (uint)((num - (int)num)*10000)%256; } else { TxBuf[a] = '0'; TxBuf[a+1] = 0; TxBuf[a+2] = 0; TxBuf[a+3] = 0; TxBuf[a+4] = 0; } } //======================= //将接收到的float数组解码 //占用5个字节 数据范围+- 65535.9999 //======================= float nrf_unload_float(uchar a) { float num; if(RxBuf[a] == '+'){ num = RxBuf[a+1]*256 + RxBuf[a+2]+ (float)((int)RxBuf[a+3]*256 + RxBuf[a+4])/10000.0; } else if(RxBuf[a] == '-'){ num = RxBuf[a+1]*256 + RxBuf[a+2]+ (float)((int)RxBuf[a+3]*256 + RxBuf[a+4])/10000.0; num = -num; } else if(RxBuf[a] == '0') num = 0; return (num); } //======================= //将float数编码装载 保留2位小数 //占用3个字节 数据范围+- 255.99 //======================= void nrf_load_sfloat(uchar a,float num) { if(num > 0){ TxBuf[a] = '+'; TxBuf[a+1] = (uchar)num; //转换成uchar类型,自动将保留低8位,去除高位。 TxBuf[a+2] = (uint)((num - (int)num)*100); } else if(num < 0){ num = -num; TxBuf[a] = '-'; TxBuf[a+1] = (uchar)num; TxBuf[a+2] = (uint)((num - (int)num)*100); } else{ TxBuf[a] = '0'; TxBuf[a+1] = 0; TxBuf[a+2] = 0; } } //======================= //将float数解码 保留2位小数 //占用3个字节 数据范围+- 255.99 //====================== float nrf_unload_sfloat(uchar a) //a是数据包在数组内的起始位置 { float num; if(RxBuf[a] == '+'){ num = RxBuf[a+1]+ (float)RxBuf[a+2]/100; } else if(RxBuf[a] == '-'){ num = RxBuf[a+1]+ (float)RxBuf[a+2]/100; num = -num; } else if(RxBuf[a] == '0') num = 0; return (num); }
评论
    相关推荐
    • NRF24L01.rar
      通过STM32单片机实现对NRF24L01的控制
    • NRF24L01配置功能函数.zip
      NRF24L01不一样的配置方式,方便简洁明了,一个函数配置出所有你想要的功能。由结构体打包函数,每个参数设置都有注释说明,傻瓜式配置。 ------------------NRF24L01函数目录——————————————— ...
    • NRF24L01模块
      包含了NRF24L01模块的使用文档,原理图,及C语言代码,系统的分析了从硬件原理图到软件的各方面技术,及编C语言程代码!
    • FTDI_nRF24L01:nRF24L01 配置工具
      FTDI_nRF24L01 nRF24L01 配置工具 这个基于 qt 的工具允许您使用广泛的 FTDI(FT232R 和 FT245R)USB 到串行转换器将 nRF24L01nRF24L01+ 连接到您的 Windows/Linux PC。 对于开发,我正在使用这样的模块,任何...
    • NRF24L01手册
      NRF24L01中文版,内容比较全面。 nRF24L01是一款工作在2.4~2.5GHz世界通用ISM频段的单片无线收发器芯片 下载后输入文档密码wireless即可打开
    • 8,NRF24L01模块资料.rar
      此次NRF24L01的无线通信模块可,用于智能小车与四旋翼飞机相关的制造
    • nRF24L01.rar
      NRF24L01 library with all definition of registers and commands
    • NRF24L01.rar
      iNTERFACING NRF24L01 WITH STM32F4
    • NRF24L01资料.rar
      该压缩包包涵了无线传输模块的NRF24L01的中文和英文的数据手册
    • nrf24L01.zip
      2.4G配置使用,发送数据,与接收数据,采用一个频段可带多个字节,参考2.4g说明书