RT-Thread(RTT)之SPI设备使用(以驱动nrf24l01模块为例)

前言

本文目的,了解SPI和如何使用RT-Thread的SPI设备,通过SPI向nrf24l01模块中的寄存器写数据,再把数据读出来,验证数据是否一致,以验证SPI设备配置正确,是否能够正常使用


一、SPI简介

1、SPI是Serial Peripherl Interface的缩写,中文意思是串行外围设备接口

2、SPI主要应用于EEPROM、FLASH、实时时钟、AD转换器,数字信号处理器、数字信号解码器
在这里插入图片描述

3、SPI采用主从工作方式,总线上有一个主设备多个从设备
在这里插入图片描述
4、SPI传输数据时需要最多四根信号线分别是:
串行时钟信号SCLK由主设备产生发送给从设备;
MOSI主出从入引脚,主设备输出数据从设备接收数据;
MISO主入从出引脚,主设备接收数据从设备输出数据;
CS片选信号,由主设备输出的使能信号,用来选择与主设备通信的从设备
在这里插入图片描述

5、SPI总线有四种工作方式,取决于时钟极性CPOL和时钟相位CPHA

  • CPOL定义了SCLK空闲时的状态电平

在这里插入图片描述

  • CPHA定义了数据采集边沿

在这里插入图片描述

  • 因此SPI通信有四种不同的工作模式,由时钟极性CPOL和时钟相位CPHA的组合决定

在这里插入图片描述

  • 模式0:当CPOL=0CPHA=0时,空闲时时钟为低电平,第一个时钟沿采样,因此模式0是在时钟上升沿进行采样

在这里插入图片描述

  • 模式1:当CPOL=0CPHA=1时,空闲时时钟为低电平,第二个时钟沿采样,因此模式1是在时钟下降沿进行采样

在这里插入图片描述

  • 模式2:当CPOL=1CPHA=0时,空闲时时钟为高电平,第一个时钟沿采样,因此模式2是在时钟下降沿采样

在这里插入图片描述

  • 模式3:当CPOL=1CPHA=1时,空闲时钟为高电平,第二个时钟沿采样,因此模式3是在时钟上升沿采样

在这里插入图片描述

  • 在使用到SPI通信时,在确定CPOL和CPHA时,要以数据手册中的时序图为准,举个例子,下图是彩色OLED控制器SSD1351数据手册中关于SPI通信的时序图描述,可以看到手册中规定了时钟上升沿采样,所以我们配置SPI工作方式时只能选择模式0模式3

在这里插入图片描述

6、SPI通信的优点缺点

在这里插入图片描述

二、通过SPI向NRF24L01模块写数据再读出来,验证数据是否一致

1、创建一个工程

在这里插入图片描述

2、在board.h中打开SPI的注释,使用SPI几需要查看你自己板子上的硬件连接图

在这里插入图片描述

3、在RT-Thread Settings中打开SPI驱动程序使能

在这里插入图片描述

4、打开SPI模块使能注释

在这里插入图片描述

5、打开CubeMX进行配置

在这里插入图片描述

6、使用外部高速晶振作为时钟源

在这里插入图片描述

7、配置一下时钟线,频率直接拉满

在这里插入图片描述

8、配置调试接口

在这里插入图片描述

9、打开串口一,因为在创建工程的使用默认使用了串口一,所以这里也配置一下

在这里插入图片描述

10、配置SPI,二线全双工主模式

在这里插入图片描述

11、SPI参数配置

在这里插入图片描述

12、生成代码

在这里插入图片描述

13、点击Close

在这里插入图片描述

14、关掉CubeMX

在这里插入图片描述

15、点击确定

在这里插入图片描述

16、复制CubeMX自动生成的HAL_SPI_MspInit这段代码

在这里插入图片描述

17、粘贴到board.c的末尾

在这里插入图片描述

18、复制CubeMX自动生成的MX_SPI2_Init这段代码

在这里插入图片描述

19、粘贴到board.c的末尾,记得把static关键字去掉

在这里插入图片描述

20、编译一下,有如下报错

在这里插入图片描述

21、回到cubemx文件夹下的main.c文件中复制spi2句柄

在这里插入图片描述

22、粘贴到board.c文件的前面,并加上extern关键字

在这里插入图片描述

23、再编译一下,报错说函数重定义

在这里插入图片描述

24、双击错误,跳转进去后在cubemx文件夹下刚刚CubeMX自动生成的HAL_SPI_Msp_Init函数注释掉

在这里插入图片描述

25、再编译,无报错

在这里插入图片描述

26、在man.c主函数中输入如下代码

/*
 * Copyright (c) 2006-2023, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2023-12-21     RT-Thread    first version
 */

#include <rtthread.h>
#include <rtdevice.h>
#include <drv_common.h>
#include <board.h>
#include "drv_spi.h"

//NRF24L01寄存器操作命令
#define SPI_READ_REG    0x00  //读配置寄存器,低5位为寄存器地址
#define SPI_WRITE_REG   0x20  //写配置寄存器,低5位为寄存器地址
#define R_RX_PL_WID     0x60
#define RD_RX_PLOAD     0x61  //读RX有效数据,1~32字节
#define WR_TX_PLOAD     0xA0  //写TX有效数据,1~32字节
#define FLUSH_TX        0xE1  //清除TX FIFO寄存器.发射模式下用
#define 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊猫 .

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值