看了两天的24l01的相关资料了,一直有点模糊,今天下午感觉有点懂了,在板子上调试成功了,但是还没进行通讯测试。stm32和arduino进行通信还没成功 ,:(

先把stm32的NRF24L01配置的过程说一下吧(这是我跟着代码写的,有点简单,可能还有差错):

1 . 首先初始化相关的端口和SPI等

  1. void SPI2_NRF24L01_init(void)
  2. {
  3. SPI_InitTypeDef SPI_InitStructure;
  4. GPIO_InitTypeDef GPIO_InitStructure;
  5.  
  6. /* Enable SPI2 GPIOB clocks */
  7. RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 ,ENABLE);
  8. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  9. /* Configure SPI2 pins: SCK, MISO and MOSI */
  10. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  11. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//GPIO_Mode_Out_PP; //
  13. GPIO_Init(GPIOB, &GPIO_InitStructure);
  14.  
  15. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  16. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  17. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  18. GPIO_Init(GPIOC,&GPIO_InitStructure);
  19.  
  20. /* Configure PB.11 as Output push-pull, used as Flash Chip select */
  21. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  22. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  23. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  24. GPIO_Init(GPIOB, &GPIO_InitStructure);
  25.  
  26. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //NRF24L01 MODE-CE
  27. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  28. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  29. GPIO_Init(GPIOC, &GPIO_InitStructure);
  30. /* Deselect the FLASH: Chip Select high */
  31.  
  32. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //NRF24L01 IRQ
  33. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
  34. GPIO_Init(GPIOB, &GPIO_InitStructure);
  35. GPIO_SetBits(GPIOB, GPIO_Pin_8); //On
  36. NotSelect_SDR();
  37.  
  38. /* SPI2 configuration */
  39. SPI_Cmd(SPI2,DISABLE);
  40. SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  41. SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  42. SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  43. SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  44. SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  45. SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  46. SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
  47. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  48. SPI_InitStructure.SPI_CRCPolynomial = ;
  49. SPI_Init(SPI2,&SPI_InitStructure);
  50.  
  51. /* Enable SPI2 */
  52. SPI_Cmd(SPI2,ENABLE);
  53. }

  

这是我的引脚连接。

2 . 然后开始初始化 NRF模块

01 . spi的读、写数据方法:

  1. u8 Spi_RW(u8 dat)
  2. {
  3. /* 当 SPI发送缓冲器非空时等待 */
  4. while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
  5. /* 通过 SPI2发送一字节数据 */
  6. SPI_I2S_SendData(SPI2, dat);
  7. /* 当SPI接收缓冲器为空时等待 */
  8. while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
  9. /* Return the byte read from the SPI bus */
  10. return SPI_I2S_ReceiveData(SPI2);
  11. }

        模块的读、写方法:

  1. uint8_t NRF_Read_Reg(uint8_t reg)
  2. {
  3. uint8_t reg_val;
  4. SPI_CSN_L(); /* 选通器件 */
  5. Spi_RW(reg); /* 写寄存器地址 */
  6. reg_val = Spi_RW(); /* 读取该寄存器返回数据 #define NRF_READ_REG        0x00   // 读寄存器指令 */
  7. SPI_CSN_H(); /* 禁止该器件 */
  8. return reg_val;
  9. }
  10.  
  11. uint8_t NRF_Write_Reg(uint8_t reg, uint8_t value)
  12. {
  13. uint8_t status;
  14. SPI_CSN_L(); /* 先选通器件 */
  15. status = Spi_RW(reg); /* 写寄存器地址,同时也可以读出该寄存器 */
  16. Spi_RW(value); /* 然后就向该地址的寄存器写数据 */
  17. SPI_CSN_H(); /* 最后禁止该器件 */
  18. return status;
  19. }

02 . 然后就是按照模块的寄存器说明来向相应的寄存器里写入数据来设置:

  1. NRF_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); //写RX节点地址
  2. NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //写TX节点地址
  3. NRF_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答
  4. NRF_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址
  5. NRF_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a); //设置自动重发间隔时间:500us;最大自动重发次数:10次
  6. NRF_Write_Reg(NRF_WRITE_REG+RF_CH,); //设置RF通道为CHANAL
  7. NRF_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启

这些寄存器的地址和设置的数据在NRF24L01.h中都有宏定义:

  1. //***************************************NRF24L01寄存器指令*******************************************************
  2. #define NRF_READ_REG 0x00 // 读寄存器指令
  3. #define NRF_WRITE_REG 0x20 // 写寄存器指令
  4. #define R_RX_PL_WID 0x60
  5. #define RD_RX_PLOAD 0x61 // 读取接收数据指令
  6. #define WR_TX_PLOAD 0xA0 // 写待发数据指令
  7. #define FLUSH_TX 0xE1 // 冲洗发送 FIFO指令
  8. #define FLUSH_RX 0xE2 // 冲洗接收 FIFO指令
  9. #define REUSE_TX_PL 0xE3 // 定义重复装载数据指令
  10. #define NOP 0xFF // 保留
  11. //*************************************SPI(nRF24L01)寄存器地址****************************************************
  12. #define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式
  13. #define EN_AA 0x01 // 自动应答功能设置
  14. #define EN_RXADDR 0x02 // 可用信道设置
  15. #define SETUP_AW 0x03 // 收发地址宽度设置
  16. #define SETUP_RETR 0x04 // 自动重发功能设置
  17. #define RF_CH 0x05 // 工作频率设置
  18. #define RF_SETUP 0x06 // 发射速率、功耗功能设置
  19. #define NRFRegSTATUS 0x07 // 状态寄存器
  20. #define OBSERVE_TX 0x08 // 发送监测功能
  21. #define CD 0x09 // 地址检测
  22. #define RX_ADDR_P0 0x0A // 频道0接收数据地址
  23. #define RX_ADDR_P1 0x0B // 频道1接收数据地址
  24. #define RX_ADDR_P2 0x0C // 频道2接收数据地址
  25. #define RX_ADDR_P3 0x0D // 频道3接收数据地址
  26. #define RX_ADDR_P4 0x0E // 频道4接收数据地址
  27. #define RX_ADDR_P5 0x0F // 频道5接收数据地址
  28. #define TX_ADDR 0x10 // 发送地址寄存器
  29. #define RX_PW_P0 0x11 // 接收频道0接收数据长度
  30. #define RX_PW_P1 0x12 // 接收频道1接收数据长度
  31. #define RX_PW_P2 0x13 // 接收频道2接收数据长度
  32. #define RX_PW_P3 0x14 // 接收频道3接收数据长度
  33. #define RX_PW_P4 0x15 // 接收频道4接收数据长度
  34. #define RX_PW_P5 0x16 // 接收频道5接收数据长度
  35. #define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置
  36. //**************************************************************************************
  37. //*********************************************NRF24L01*************************************
  38. #define RX_DR 6 //中断标志
  39. #define TX_DS 5
  40. #define MAX_RT 4
  41.  
  42. #define MODEL_RX 1 //普通接收
  43. #define MODEL_TX 2 //普通发送
  44. #define MODEL_RX2 3 //接收模式2,用于双向传输
  45. #define MODEL_TX2 4 //发送模式2,用于双向传输
  46.  
  47. #define RX_PLOAD_WIDTH 32
  48. #define TX_PLOAD_WIDTH 32
  49. #define TX_ADR_WIDTH 5
  50. #define RX_ADR_WIDTH 5

03 . 基本都设置好了,还要设置一下发送模式

  1. NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断开启,16位CRC,主发送
  2. NRF_Write_Reg(FLUSH_TX,0xff);
  3. NRF_Write_Reg(FLUSH_RX,0xff);
  4.  
  5. Spi_RW(0x50);
  6. Spi_RW(0x73);
  7. NRF_Write_Reg(NRF_WRITE_REG+0x1c,0x01);
  8. NRF_Write_Reg(NRF_WRITE_REG+0x1d,0x07);

04 . 最后check一下模块和STM32是否连接成功:

  1. u8 Nrf24l01_Check(void)
  2. {
  3. u8 buf1[];
  4. u8 i;
  5. /*写入5个字节的地址. */
  6. NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,);
  7. /*读出写入的地址 */
  8. NRF_Read_Buf(TX_ADDR,buf1,);
  9. /*比较*/
  10. for(i=;i<;i++)
  11. {
  12. if(buf1[i]!=TX_ADDRESS[i])
  13. break;
  14. }
  15. if(i==)
  16. return SUCCESS ; //MCU与NRF成功连接
  17. else
  18. return ERROR ; //MCU与NRF不正常连接
  19. }

3 . NRF24L01 发送数据方式 :

先拉低CE ,然后 将数据写入 TX_FIFO ,然后拉高CE,保持10us以上,数据会无线发送出去。

STM32F103: NRF24L01的更多相关文章

  1. nRF24L01无线模块笔记

    nRF24L01模块 官网链接: https://www.nordicsemi.com/Products/nRF24-series 常见的无线收发模块, 工作在2.4GHz频段, 适合近距离遥控和数据 ...

  2. NRF24L01 无线模块的使用

    NRF24L01 是一款工作在2.4-2.5GHz通用ISM频段的单片收发芯片 工作电压:1.9-3.6V低电压工作 高速率:2Mbps,由于空中传输时间很短,极大的降低了无线传输中的碰撞现象 多频点 ...

  3. STM32f103 定时器之编码器接口模式

    背景 买了个Arduino的旋转编码器模块,配合STM32定时器的编码器模式实现了旋转角度以及圈数的计数.这种旋转编码器我能想到的实际应用场景暂时只有实体音量旋钮,鼠标的滚轮等,所以只实现了计数.阅读 ...

  4. [nRF51822] 13、浅谈nRF51822和NRF24LE1/NRF24LU1/NRF24L01经典2.4G模块无线通信配置与流程

    前言:  nRF51可以支持基于2.4G的互相通信.与NRF24LE1的通信.与NRF24LU1的通信.与NRF24L01的通信. 一.nRF51822基于2.4G和nRF51822通信 其中nRF5 ...

  5. STM32f103之外部中断

    一.背景 有个需求,IO口检测上升沿,然后做相应的动作.在此记录STM32F103的外部中断结构及配置方法, 以备下次快速上手使用. 有许多不太明白,又是老司机(:-D)帮忙,真的是站在别人的肩膀上会 ...

  6. STM32F103之DMA

    一.背景: 需要使用STM32的DAC,例程代码中用了DMA,对DMA之前没有实际操作过,也很早就想知道DMA到底是什么,因此,看了一下午手册,代码和网上的资料,便有了此篇文章,做个记录. 二.正文: ...

  7. STM32F103使用内部Flash保存参数

    在我们应用开发时,经常会有一些程序运行参数需要保存,如一些修正系数.这些数据的特点是:数量少而且不需要经常修改,但又不能定义为常量,因为每台设备可能不一样而且在以后还有修改的可能.将这类数据存在指定的 ...

  8. STM32解密STM32F103芯片解密STM32F103R6单片机破解多少钱?

    STM32解密STM32F103芯片解密STM32F103R6单片机破解多少钱? STM32F系列单片机芯片解密型号: STM32F100  |  STM32F101  |  STM32F102  | ...

  9. nRF24L01芯片控制——迈向无线的第一步

    nRF24L01芯片是一款专供单片机的射频收发芯片.工作于2.4GHz~2.5GHz ISM频段.融合了shockburst技术. 我先列出该芯片的硬件参数资料: 至于每个引脚的具体用途,可以参见技术 ...

随机推荐

  1. JSP--JSP语法--指令--include(动态包含/静态包含)--九大隐式对象--四大域对象--JSP内置标签--JavaBean的动作元素--MVC三层架构

    一.JSP 原理:JSP其实就是一个servlet. Servlet负责业务逻辑处理,JSP只负责显示.开发中,JSP中不能有一行JAVA代码 二.JSP语法 1.    JSP模板元素:JSP中HT ...

  2. linux c编程:记录锁

    记录锁相当于线程同步中读写锁的一种扩展类型,可以用来对有亲缘或无亲缘关系的进程进行文件读与写的同步,通过fcntl函数来执行上锁操作.尽管读写锁也可以通过在共享内存区来进行进程的同步,但是fcntl记 ...

  3. Oracle 11g数据库详解(2)

    FAILED_LOGIN_ATTEMPTS 用于指定连续登陆失败的最大次数 达到最大次数后,用户会被锁定,登陆时提示ORA-28000 UNLIMITED为不限制 精确无误差 是 实时 PASSWOR ...

  4. 简明python教程五----数据结构

    python中有三种内建的数据结构:列表.元组和字典 list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目.在python中,每个项目之间用逗号分隔. 列表中的项目应该包括在方 ...

  5. java return redirect

    return “/user/new” 或 return “/user/edit” 如果new页面有下拉(举例)组件,在return之前如果没有准备select所需要的数据,则return到new的页面 ...

  6. memcached单点

    一.Repcached (memcached同步补丁) 下载地址:http://sourceforge.net/projects/repcached/files/repcached/2.2.1-1.2 ...

  7. 【Java】仿真qq尝试:用户注册(二)

    参考: 1.corejavaI:使用解耦的try/catch与try/finally 2.Java中try catch finally语句中含有return语句的执行情况(总结版):http://bl ...

  8. ASP.NET MVC Bootstrap模板选中菜单高亮显示当前项方法

    当我们处理后台显示当前页面,当前页菜单项高亮,我们可以使用js方法,也可用程序实现,使用Bootstrap模板处理高亮并展开方法之一 1.在项目中导入 <script src="/as ...

  9. CSS3 Loading进度条加载动画特效

    在线演示 本地下载

  10. iOS开发小结 - 关于swift中#if DEBUG判断不执行的解决方案

    在以前的OC项目中我们经常用#if DEBUG来判断是否是在DEBUG模式下调试代码,然后最近我用swift写的项目中发现#if DEBUG判断居然不管用了,多方查证为果的情况下终于找到了解决方案,希 ...