前言
本文目的,了解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=0和CPHA=0时,空闲时时钟为低电平,第一个时钟沿采样,因此模式0是在时钟上升沿进行采样

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

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

- 模式3:当CPOL=1和CPHA=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

&spm=1001.2101.3001.5002&articleId=135127665&d=1&t=3&u=0a87692df9a247d6b06962510a4e2db0)
3301

被折叠的 条评论
为什么被折叠?



