你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

NUCLEO_L552ZE_Q 『人生中的首块STM32L552开发板』┅ nRF24L01双机...

[复制链接]
三界狗 发布时间:2020-3-26 00:14
上回在NUCLEO_L552ZE_Q_STM32Nucleo_144 开发板上测试了外部中断的使用,本想着这回来一篇有关TrustZone的文章,毕竟这才是Cortex-M33的重要的内容,于是花了些时间去研究,然而现实总是那么残酷,在这碰了壁,自己建立的工程下载进去之后没有反应,就想着先去看看官方给的GPIO_IOToggle_TrustZone例程,按照说明文件里的步骤下载到开发板上,结果还是没有任何反应,我也是一头雾水,在网上也找不到任何有关的资料,说明文档是英文的,看得也是一知半解的,所以就没弄成,还是决定先放在一边吧,不能被这个耽搁了。恰好手上有两个nRF24L01P模块,还有两块stm32f103c8t6小板子,于是就鼓捣了一下使用它们来做个无线通信测试,下面就请跟随我进入正题吧。
评测内容:
1、使用STM32F103C8T6系统板连接nRF24L01P作为主机发送一固定长度字符串,NUCLEO_L552ZE_Q_STM32Nucleo_144 开发板的板载SPI通信接口连接nRF24L01P作为从机接收,并且通过uart串口将接收到的数据发送到PC上位机显示,使用板载LED指示发送和接收状态。
所需元件:
1、NUCLEO_L552ZE_Q_STM32Nucleo_144 开发板*1
2、STM32F103C8T6系统板*1;
3、nRF24L01P模块*2;
2、板载红色LED;

评测步骤:
1、新建工程:
本次测评我使用STM32CubeMX的开发板模板进行工程创建,针对NUCLEO_L552ZE_Q_STM32Nucleo_144 开发板上的板载硬件已经默认帮配置好了,只需要根据自己的需求配置SPI接口便可以了,按照如下步骤便可创建一个开发板的默认配置工程;
1-1.png

1-2.png

2、配置SPI接口:
根据下图配置将SPI接口设置好,SPI接口使用的是开发板上的CN7排座的SPI_A接口,在STM32CubeMX上SPI1的默认SCK引脚在PA1上,我根据开发板的原理图将其改到了PA5,需要注意的是,nRF24L01P的IRQ引脚需要设置成上拉输入模式;
1-3.png

nRF24L01P的SPI接口

1-4.png

SPI配置选项

1-5.png

开发板接口原理图

3、设置串口波特率:
开发板上与STLink虚拟串口连接使用的是LPUART1,工程创建的时候已经默认配置好了,使用PG7和PG8两个引脚,波特率为209700Bits/s,这个波特率不是我想要的,所以将它改成了921600Bits/s;
3-1.png

4、保存工程:
保存好配置工程并且生成MDK_v5工程;
4-1.png

5、测试串口的工作情况:
因为不能保证nRF24L01P能够顺利的工作,因此我是先测试串口能够正常工作之后再考虑加入nRF24L01P;这也是一种调试代码的技巧,一点点来,不然什么东西都一下子加上,调试的时候出问题就会不清楚问题的出处具体是在哪里;
在这里,又再一次体现出了HAL库强大的封装工艺了,在标准库函数上要实现发送一个字符串,需要自己调用串口发送字符的函数来循环实现发送字符串的函数,而在HAL库上,只需要一个函数,不管是发送字符还是发送字符串,统统都能搞定。
就像以前学习串口通信的时候发送Hello World一样,添加如下代码到main函数的循环里,
  1. HAL_UART_Transmit(&hlpuart1, "Hello World !!!\r\n", 17, 100);
  2. HAL_Delay(500);
复制代码
将代码编译连接通过后下载到开发板上,按下开发板右下角的复位键后,便能在串口助手上看到如下打印的信息,说明串口工作正常;
5-1.png

6、添加nRF24L01P相关的代码:
nRF24L01P的代码我使用的是购买该模块的时候官方提供的测试模板,模块使用的是泽耀科技生产的挪威原装芯片nRF24L01P模块,不是黑色PCB板那种,但应该都是通用的,接口也是一样的,已经成功在我的STM32F103C8T6系统板上正常收发了,代码我会在末尾的附件中给出,
复制模板的nRF24L01P源代码和头文件到本工程中并添加到工程里;
6-1.png

由于使用的环境不一样,需要做一点修改,首先是引脚宏定义,在nRF24L01P.h文件的开头添加#include "main.h",并且将不需要的头文件包含去掉nRF24L01P.h文中定义了模块的CSN、CE、IRQ三个接口的引脚,改成如下;
  1. /** RF24L01硬件接口定义 */
  2. #define RF24L01_CE_GPIO_PORT                        GPIOD
  3. #define RF24L01_CE_GPIO_PIN                                GPIO_PIN_15

  4. #define RF24L01_CS_GPIO_PORT                        GPIOD
  5. #define RF24L01_CS_GPIO_PIN                                GPIO_PIN_14

  6. #define RF24L01_IRQ_GPIO_PORT                        GPIOF
  7. #define RF24L01_IRQ_GPIO_PIN                        GPIO_PIN_12
复制代码
然后是nRF24L01P.c文件中的延时函数,替换成HAL库的延时函数,并且注释掉500Ms的延时函数(HAL库的延时函数能够延时500ms以上),相应的调用延时函数的地方再做点修改;
  1. /**
  2.   * @brief :NRF24L01 延时(Ms)
  3.   * @param :
  4.            @TxByte:延时的Ms数
  5.   * @note  :不超过2^32。
  6.   * @retval:无
  7.   */
  8. static void NRF24L01_delay_ms(uint32_t Ms)
  9. {
  10.         HAL_Delay(Ms);
  11. }

  12. /**
  13.   * @brief :NRF24L01 延时(500Ms)
  14.   * @param :
  15.            @Ms_500:延时的500Ms倍数
  16.   * @note  :不超过255。
  17.   * @retval:无
  18.   */
  19. //static void NRF24L01_delay_500ms(uint8_t Ms_500)
  20. //{
  21. //        drv_delay_500Ms(Ms_500);
  22. //}
复制代码

接下来是将SPI读写函数替换HAL库的SPI读写函数,在这里又再一次凸显出了HAL库的那个简单易用的优点;
  1. /**
  2.   * @brief :NRF24L01 SPI收发一个字节
  3.   * @param :
  4.            @TxByte:发送的数据字节
  5.   * @note  :接口函数,方便移植。
  6.   * @retval:读取的数据
  7.   */
  8. static uint8_t nRF24L01_SPI_RW_Byte( uint8_t TxByte )
  9. {
  10.         uint8_t RxByte;
  11.        
  12.         HAL_SPI_TransmitReceive(&hspi1, &TxByte, &RxByte, 1, 100);
  13.        
  14.         return RxByte;
  15. }
复制代码
再接下来,nRF24L01P.c文件实现了nrf24L01P使用到的GPIO口的初始化函数NRF24L01_Gpio_Init,由于使用的固件库不一样,且main.c文件中已经统一初始化了,所以就将该函数的内容注释掉,并且注释掉所有调用的地方。编译工程,没有问题说明移植成功。
7、编写代码实现无线接收功能:nRF24L01P.h包含到main.c文件中,在文件开头定义一个用于接收数据的数组;
  1. uint8_t g_RF24L01RxBuffer[ 32 ] = { 0 };
复制代码

在main函数中添加如下代码,实现nRF24L01P的无线接收功能
  1. uint8_t i;
  2.        
  3.   /* USER CODE BEGIN 1 */

  4.   /* USER CODE END 1 */

  5.   /* MCU Configuration--------------------------------------------------------*/

  6.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  7.   HAL_Init();

  8.   /* USER CODE BEGIN Init */

  9.   /* USER CODE END Init */

  10.   /* Configure the system clock */
  11.   SystemClock_Config();

  12.   /* USER CODE BEGIN SysInit */

  13.   /* USER CODE END SysInit */

  14.   /* Initialize all configured peripherals */
  15.   MX_GPIO_Init();
  16.   MX_ADC1_Init();
  17.   MX_LPUART1_UART_Init();
  18.   MX_RTC_Init();
  19.   MX_SPI1_Init();
  20.   MX_UCPD1_Init();
  21.   MX_USB_PCD_Init();
  22.   /* USER CODE BEGIN 2 */
  23.         NRF24L01_check( );                        //检测nRF24L01P是否已连接
  24.         RF24L01_Init( );                                //初始化nRF24L01P
  25.        
  26.         HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET);
  27.         for( i = 0; i < 6; i++ )
  28.         {
  29.                 HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);
  30.                 HAL_Delay( 500 );
  31.         }
  32.        
  33.         RF24L01_Set_Mode( MODE_RX );                //接收模式
  34.   /* USER CODE END 2 */

  35.   /* Infinite loop */
  36.   /* USER CODE BEGIN WHILE */
  37.   while (1)
  38.   {
  39.     /* USER CODE END WHILE */

  40.     /* USER CODE BEGIN 3 */

  41.                 i = NRF24L01_RxPacket( g_RF24L01RxBuffer );                //接收字节
  42.                 if( 0 != i )
  43.                 {
  44.                         HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);
  45.                         HAL_UART_Transmit(&hlpuart1, g_RF24L01RxBuffer, i, 100);                       
  46.                 }
  47.   }
  48.   /* USER CODE END 3 */
复制代码
8、运行结果:代码编译通过,烧录至开发板上,按下右下角的复位键,程序开始运行。发送端我使用的是官方测试模板小改动后在STM32F103C8T6系统板上实现的,在此就不详细阐述了,有需要可下载附件做参考。发送端和接收端都运行起来后,串口助手上也开始打印接收到的数据了;
8-1.png

8-2.gif

总结:
nRF24L01对我来说是个噩梦,为了能够发挥NRF24L01P的最远传输距离,曾经一点点啃英文数据手册应用在51单片机上(黑色小模块给的例程都是NRF24L01而不是NRF24L01P的,前者的传输距离较短,后者的资料有点少),前些天为了将原先51单片机上程序移植到STM32上,荒废了几天时间,还是无法发送数据,气得我直接将模块给废了,然后就遇到了这款红色版的模块,例程和资料都可以再公司官网上下载到,很详细靠谱。
NUCLEO_L552ZE_Q_STM32Nucleo_144 开发板的SPI和UART串口评测就这些,简单来说,使用HAL库来开发的代码确实要简单很多,开发板上的STLink还提供有虚拟串口,并且将SPI接口也都在一个地方引出来了,对于接线来说很方便。OK,有关nRF24L01P的细节东西比较多,有些地方没有阐述清楚的,欢迎在评论区指出。




nRF24L01P_TX.zip (4.45 MB, 下载次数: 2)
收藏 评论0 发布时间:2020-3-26 00:14

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版