环境:ubuntu scons rt-thread stm32f407VGT6 nrf24l01

1. 配置 rtconfig.h,添加如下定义。

#define RT_USING_SPI

#define BSP_USING_SPI3

2. 修改 board/CubeMX_Config/Src/stm32f4xx_hal_msp.c,增加spi3的配置。

void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(hspi->Instance==SPI1){/* USER CODE BEGIN SPI1_MspInit 0 *//* USER CODE END SPI1_MspInit 0 *//* Peripheral clock enable */__HAL_RCC_SPI1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**SPI1 GPIO Configuration    PA5     ------> SPI1_SCKPA6     ------> SPI1_MISOPA7     ------> SPI1_MOSI */GPIO_InitStruct.Pin = SPI1_SCK_Pin|SPI1_MISO_Pin|SPI1_MOSI_Pin;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* USER CODE BEGIN SPI1_MspInit 1 *//* USER CODE END SPI1_MspInit 1 */}if(hspi->Instance==SPI3){/* USER CODE BEGIN SPI1_MspInit 0 *//* USER CODE END SPI1_MspInit 0 *//* Peripheral clock enable */__HAL_RCC_SPI3_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/**SPI1 GPIO Configuration    PB3     ------> SPI1_SCKPB4     ------> SPI1_MISOPB5     ------> SPI1_MOSI */GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);/* USER CODE BEGIN SPI1_MspInit 1 *//* USER CODE END SPI1_MspInit 1 */}
}

3. 向spi3总线注册从机设备(调试中发现,如果直接使用spi3作为设备,程序运行到 rt_spi_configure()的时候会报错)。

static int rt_hw_spi_flash_init(void)
{//__HAL_RCC_GPIOB_CLK_ENABLE();//rt_hw_spi_device_attach("spi3", "spi10", GPIOA, GPIO_PIN_11);// spi10 表示挂载在 spi3 总线上的设备,PA11是片选,这一步就可以将从设备挂在到总线中。rt_hw_spi_device_attach("spi3", "spi10");return RT_EOK;
}
/* 导出到自动初始化 */
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);

4. 初始化spi。

uint8_t NRF24L01_Bus_Init(nrf24l01_t* _nrf24l01, const char* dev_name)
{struct rt_spi_configuration cfg = {.mode = RT_SPI_MODE_0 | RT_SPI_MSB | RT_SPI_MASTER,.data_width = 8,.max_hz = 5000000,};_spi_bus = (struct rt_spi_device*)rt_device_find(dev_name);if (_spi_bus == RT_NULL) {rt_kprintf("nrf24l01 can not find bus %s !!!\r\n", dev_name);_spi_bus = RT_NULL;return 1;}rt_spi_configure(_spi_bus, &cfg);_nrf24l01->spi_bus = _spi_bus;return 0;
}

5. 初始化nrf24l01,使用irq引脚作为外部中断来判断是否接收到数据。

void nrf24l01_irqhandler(void * args)
{uint8_t buf[20];uint8_t i;//rt_sem_release(&sem_led);NRF24L01_RxPacket(nrf24l01, buf);rt_kprintf("rx data:\r\n");for(i=0;i<20;i++){rt_kprintf("%x ", buf[i]);}
}rt_uint8_t nrf24l01_init(void)
{rt_uint8_t ret;uint8_t key_gpio = GET_PIN(A, 0);ret = NRF24L01_Bus_Init(&nrf24l01, "spi10");NRF24L01_Check(nrf24l01);// init IRQrt_pin_attach_irq(key_gpio, PIN_IRQ_MODE_FALLING , nrf24l01_irqhandler, RT_NULL);rt_pin_irq_enable(key_gpio, PIN_IRQ_ENABLE);return ret;
}

6. main函数中初始化nrf24l01的CE,CSN,IRQ 引脚。

static void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOD_CLK_ENABLE();// nrf24l01 CSN.GPIO_InitStruct.Pin = GPIO_PIN_6;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// nrf24l01 CE, GPIO_InitStruct.Pin = GPIO_PIN_0;HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,1);// nrf24l01 IRQ.GPIO_InitStruct.Pin = GPIO_PIN_0;GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);}

7. 用外部IRQ引脚中断接收数据,触发中断后,发送一个信号量,然后通过一个线程接收数据。

void nrf24l01_receive_thread(void *parameter)
{uint8_t buf[20];uint8_t i;while(1){rt_sem_take(&sem_nrf, RT_WAITING_FOREVER);rt_mutex_take(nrf_mutex, RT_WAITING_FOREVER);NRF24L01_RxPacket(nrf24l01, buf);rt_mutex_release(nrf_mutex);rt_kprintf("rx data:\r\n");for(i=0;i<20;i++){rt_kprintf("%x ", buf[i]);}}}

main函数如下:

/** Copyright (c) 2006-2018, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2018-11-06     misonyo   first version*/#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <console.h>
#include "24l01_cmd.h"struct rt_semaphore sem_nrf;
rt_mutex_t nrf_mutex = RT_NULL;static void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOD_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();// nrf24l01 CSN.GPIO_InitStruct.Pin = GPIO_PIN_6;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// nrf24l01 CE, GPIO_InitStruct.Pin = GPIO_PIN_0;HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,1);// nrf24l01 IRQ.GPIO_InitStruct.Pin = GPIO_PIN_0;GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);}int main(void)
{rt_err_t ret;MX_GPIO_Init();rt_sem_init(&sem_nrf, "nrf", 0, RT_IPC_FLAG_FIFO);nrf_mutex = rt_mutex_create("mutex_nrf", RT_IPC_FLAG_FIFO);ret = nrf24l01_init();if(ret != 0){rt_kprintf("init nrf24l01 error\r\n");}tid = rt_thread_create("nrf_receive", nrf24l01_receive_thread, RT_NULL, 512, 5, 1);rt_thread_startup(tid);return RT_EOK;
}

nrf24l01驱动链接:https://download.csdn.net/download/nodead/12919884

RT-Thread stm32 spi 使用笔记相关推荐

  1. rt thread 外挂SPI flash步骤

    第5版硬件出炉,外挂了W25Q64在stm32 的SPI1上,引脚如下. CS->PA15 SCK->PB3 MISO->PB4 MOSI->PB5 注意以上引脚也有SPI3, ...

  2. 正点原子delay函数移植到rt thread操作系统(HAL库)

    正点原子教程中涉及到的操作系统只涉及了UCOS的教程,其中例程的system文件夹中的delay.c函数只是适配了UCOS. 下面将delay.c函数移植到rt thread中,使用的bsp是rt t ...

  3. STM32 SPI+DMA 驱动 SRAM LY68L6400SLIT 应用笔记

    关键词:库函数,STM32F407,SPI+DMA ,SPI-DMA,SRAM , LY68L6400SLIT,STM32CubeMX 编 辑:大黄蜂 说明:本笔记记录 基于 STM32F407 + ...

  4. Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32

    1.前言     [2014年4月重写该博文]     经过若干时间的努力终于搞定了STM32+LwIP和yeelink平台的数据互通,在学习的过程中大部分时间花在以太网协议栈学习上,但是在RT Th ...

  5. stm32f407单片机rt thread 片外spi flash OTA升级配置示例

    参考地址https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/ 第一步,生成Boot ...

  6. STM32 SPI NSS 作用

    STM32 SPI NSS 作用 原创 2017年06月16日 11:18:14 142 SSM可以控制内部NSS引脚与SSI(一个寄存器,软件模式)相连,还是与NSS外部引脚(真正的STM32引脚, ...

  7. 关于RT thread系统节拍时钟的配置

    关于RT thread系统节拍时钟的配置                  -----本文基于rt-thread-3.1.3版本编写 首先,使用RTthread OS时,要配置(或者明白)它的系统节拍 ...

  8. STM32 SPI 软件NSS和硬件NSS解读

    [导读] SSM可以控制内部NSS引脚与SSI(一个寄存器,软件模式)相连,还是与NSS外部引脚(真正的STM32引脚,硬件模式)相连.真正作用的是内部NSS引脚(内部NSS引脚才真正连接到SPI通信 ...

  9. STM32 SPI NSS大揭秘

    SSM可以控制内部NSS引脚与SSI(一个寄存器,软件模式)相连,还是与NSS外部引脚(真正的STM32引脚,硬件模式)相连.真正作用的是内部NSS引脚(内部NSS引脚才真正连接到SPI通信控制器上) ...

最新文章

  1. 目标检测--Wide-Residual-Inception Networks for Real-time Object Detection
  2. [你必须知道的.NET]第二十一回:认识全面的null
  3. 本期最新 9 篇论文,每一篇都想推荐给你 | PaperDaily #14
  4. java图遍历求最长路径_如何在Java中使用递归实现矩阵中最长路径的返回
  5. 最新版本sublime text3注册码
  6. ecc加解密算法 c++_ECC加密算法的基本介绍
  7. [spring boot] 01 环境搭建 - 配置java和mvn环境
  8. python 二分查找_Python实现二分法搜索
  9. Linux基础知识-文件管理
  10. 浏览器Browser截屏截长图使用记录220813
  11. 移动中兴ZXV10 B860AV2.1-A_S905L2_MT7668_线刷固件包
  12. 计算机技术服务业成本核算,如何进行服务行业的成本核算
  13. 《大秦帝国之崛起》看后感
  14. Easy EDA #学习笔记04# |Type-C Micro USB APPLELighting 充电头
  15. 币图告诉你如何解决双花问题
  16. 打字游戏之主界面实现
  17. 《人生就是一个不断相遇与离别的过程》
  18. 【Java并发】Java并发编程-02
  19. 不使用物理系统判断两个矩形是否碰撞
  20. 英文期刊投稿指南模板(通用版)-----以IEEE Wireless Communications为例

热门文章

  1. Windows 10 21H1 更新的3种方式
  2. Ubuntu下codeblocks安装配置方法及opencv配置方法
  3. RESTful HTTP中对POST,PUT,PATCH的区别
  4. python数据分析案例(四):共享单车租用分析
  5. 一元流量参数为null_了解JavaScript中null和undefined之间的差异和相似之处
  6. Win10任务栏总是弹出推荐Edge浏览器广告的解决方法
  7. 【Nav2中文网】四、首次机器人安装指南(六)设置导航插件
  8. 光盘出租系统mysql_[数据库应用] 影碟出租管理系统
  9. 5行代码带你爬取 “2021福布斯排行榜“,看看中国都有哪些人?
  10. java.io.FileNotFoundException: D:\hadoop (拒绝访问。)