RT-Thread配置SPI-Flash(W25Q256)

RT-Thread配置SPI-Flash(W25Q256)

1.开启SPI总线

新建一个空白的RT-Thread项目,本文基于STM32F103芯片。
首先在drivers目录下打开board.h文件,找到SPI对应部分。根据指导,一步一步做下去。

在这里插入图片描述

1.1打开SPI及SFUD

打开RT-Thread Settings,点击更多配置来到组件一栏,勾选如下。

在这里插入图片描述

1.2打开SPI宏定义

board.h文件中,打开SPI宏定义。

在这里插入图片描述

1.3产生初始化函数

使用stm32cubemx产生初始化函数,将其粘贴于board.c文件末尾。

在这里插入图片描述

然后选择芯片型号->填写项目名称,双击IOC文件后如图操作。

在这里插入图片描述

复制初始化函数到board.c文件。在这里插入图片描述

1.4打开SPI驱动

在drivers目录下的stm32f1xx_hal_conf.h文件中打开SPI驱动。

在这里插入图片描述

配置完成,编译下载,使用list_device指令查看设备,可以看到SPI总线已经存在了。

在这里插入图片描述

2.挂载片外flash

接下来,我们将片外flash(W25Q256)挂到SPI总线上。

在application目录下,新增flash.c文件。

static int rt_hw_spi_flash_init(void)
{
    //此处为片选引脚
    rt_hw_spi_device_attach(W25Q_SPI_BUS_NAME, W25Q_SPI_DEVICE_NAME, GPIOA, GPIO_PIN_4);
    
    //flash名称要正确
    if (RT_NULL == rt_sfud_flash_probe("W25Q256", W25Q_SPI_DEVICE_NAME))
    {
        return -RT_ERROR;
    };

    return RT_EOK;
}

/* 导出到自动初始化 */
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);

经过验证,flash已经挂载成功.

在这里插入图片描述

下面开始搭建FAL。

3.搭建FAL抽象层

FAL是RT-Thread的一个软件包,主要是用于Flash 抽象层的实现,负责管理 Flash 设备和 Flash 分区。关于FAL的详细功能,大家可以参考RT-Thread软件包友情链接。文档非常详细,这里也参考了文档中的内容。

3.1添加FAL

打开RT-Thread Settings点击立即添加,然后搜索FAL。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.2配置FAL

因为我们只用到了片外flash,所以可以将fal_cfg.h中关于片外flash的部分删除,并且定义自己的分区表。

samples->porting->fal_cfg.h复制到inc中并修改为:

#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_

#include <rtconfig.h>
#include <board.h>

#define NOR_FLASH_DEV_NAME             "W25Q256"    /*一定要改为自己的flash名称*/

/* ===================== Flash device Configuration ========================= */
extern struct fal_flash_dev nor_flash0;

/* flash device table(定义设备表,删掉了片上flash) */
#define FAL_FLASH_DEV_TABLE                                          \
{                                                                    \
    &nor_flash0,                                                     \
}
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table ps:可根据需要自行分区*/ 
#define FAL_PART_TABLE                                                               \
{                                                                                   \
    {FAL_PART_MAGIC_WORD, "easyflash", NOR_FLASH_DEV_NAME,         0, 1024*1024, 0}, \
    {FAL_PART_MAGIC_WORD,  "download", NOR_FLASH_DEV_NAME, 1024*1024, 1024*1024, 0}, \
}
#endif /* FAL_PART_HAS_TABLE_CFG */

#endif /* _FAL_CFG_H_ */


此处暂时并未做太大改动,可以根据需要自行分区、命名。

3.3初始化FAL

main.c文件中,包含fal.h并调用fal_init()初始化程序。

在这里插入图片描述

3.4验证

在这里插入图片描述

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
作者:杨红超 绪论 本章主要阐述多功能气压计的应用背景,包括根据大气压强判断和确定建筑工人的楼层位置、帮助建筑工人感知周围环境温度变化等,同时也可根据大气压强判断无人机的GPS定位。其次着重介绍气压计的具体功能,如可以通过对工人周围的气压和温度的采集计算出当前所在的楼层位置,并将数据信息通过ONENET上传到云服务器上,通过语音识别实现设备在线升级功能。最后对本次设计的组织结构进行介绍,以表明每章节的主要内容和作用。 1.1应用背景 为确保建筑工人在工地施工时的人身安全,故此设计一款工人们的“运行手环”——多功能气压计。它内置气体压强检测装置可实时检测建筑工人身处的大气压强和周围的环境温度,进而根据采集的数据推算出工人所在的楼层高度,并将数据实时上传到云服务器上通过管理者对数据的检测给建筑工人提供一份双保险。 此外,该多功能气压计还具有无人机GPS定位和判断吸尘器吸力大小等应用于多对象、多环境的特点。 1.2实现功能 本次多功能气压计的设计硬件采用ART-Pi开发板、LPS22HH气压传感器和LD3320语音识别模块,操作系统使用RT-Thread 4.0.3,软件使用RT-Thread Studio 1.1.5开发平台和使用C语言实现软件编程,具有如下功能: (1)利用LPS22HH气压传感器实时对大气压的压强进行采集,并通过SPI4接口将采集的数据传给单片机。 (2)利用AP6212 WIFI模块实时将经过处理后的数据,如温度值和楼层信息等上传到云服务器;同时通过WIFI模块实现在线升级用户程序。 (3)语音识别模块通过SPI2实现与开发板的数据交互,完成语音重启设备和语音在线升级功能。 1.3设计组织结构 本次基于ART-Pi开发板的多功能气压计设计,主要分为五个章节其具体设计组织结构如下: 第一章绪论,主要介绍多功能气压计的实际应用背景和具有的具体功能,以及设计组织结构的规划。 第二章RT-Thread概述,主要对在本设计中涉及的RT-Thread内核、及其组件和软件包进行阐述,欲以说明对RT-Thread操作系统的使用情况和了解程度,同时对其内容作些简单的介绍。 第三章硬件设计,主要阐述硬件模块的电气连接和本次设计使用的硬件电路,如LPS22HH气压传感器、ART-Pi开发板和语音识别模块等。 第四章软件设计,主要阐述软件实现的设计流程和各个软件模块设计的框架,以及模块之间的通讯方式。 第五章总结与展望,主要阐述对本次设计的评估,即软件设计存在的不足和功能与性能存在的不足,以及针对不足之处提出的具体改进措施和方案、参加比赛的感悟和心得。 1.4本章小节 本章主要介绍多功能气压计的应用背景和具体的应用功能,以及对软硬件开发环境和该设计文档的组织结构进行阐述。 RT-Thread概述 本章主要阐述在软件设计中关于RT-Thread操作系统的应用情况,如与线程运行有关的采用动态方式创建线程,与线程同步有关的信号量的动态创建、释放和获取,以及与网络有关的SAL组件、OneNET软件包等。 2.1内核 为了提高软件运行的并发性和数据采集的实时性,故使用内核中的核心部分——线程,使其维护和管理每个任务的运行,同时以使用信号量和事件集等的同步方式,以及使用邮箱和消息队列等的通信方式来确保每个任务在运行过程中能“自由飞翔”。 不仅如此,为增加任务在运行状态中的时间和提高每个任务响应的快慢速度,故使用线程中重要的两个属性即线程优先级和时间片,并根据应用的具体环境和软实时性的要求将每个任务赋予各自该具有的任务优先级和时间片。同时,使用rt_thread_mdelay延迟函数来定时释放线程(任务)确保在其处于非运行态时可以退出时间片以让其它任务能及时运行。 2.2驱动 在bootloader程序中主要初始化SPI和SFUD驱动实现对外部SPI FLASH的读写操作,同时结合使用FAL软件包将操作FLASH的函数进行分层,进而实现在bootloader程序中读取“download”分区的升级固件,以及使用ota_downloader软件包完成升级固件的下载,最后使用出厂W25QXX函数实现固件搬运工作进而完成在线升级应用。 2.3组件 SAL组件完成并提供了基于RT-Thread操作系统的对不同网络协议栈或网络实现接口的抽象和与上层应用有关的一组标准BSD Socket API,在网络开发设计时可只需关心和使用网络应用层提供的网络接口,而无需关心底层具体网络协议栈类型和具体实现,如TCP/IP协议栈、LWIP和AT Socket网络。SAL组件不仅提高了软件系统对底层驱动的兼容性,而且缩短了网络开发周期。此外,SAL组件还具有一下功能特点[1]: 抽象、统一多种网络协议栈接口; 提供Socket层面的TLS加密传输特性; 支持标准BSP S
SPI(Serial Peripheral Interface)是一种串行通信协议,可以用于与外设进行数据交互。W25Q64是一款64Mb的串行Flash存储器,支持SPI接口。 以下是使用C语言进行SPI读写W25Q64的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/spi/spidev.h> #define SPI_DEVICE "/dev/spidev0.0" // SPI设备节点路径 #define BUFFER_SIZE 256 // 缓冲区大小 int main() { int fd, ret; uint8_t tx_buffer[BUFFER_SIZE], rx_buffer[BUFFER_SIZE]; struct spi_ioc_transfer tr; // 打开SPI设备 fd = open(SPI_DEVICE, O_RDWR); if (fd < 0) { perror("Failed to open SPI device"); exit(1); } // 初始化SPI传输结构体 memset(&tr, 0, sizeof(tr)); tr.tx_buf = (unsigned long)tx_buffer; tr.rx_buf = (unsigned long)rx_buffer; tr.len = BUFFER_SIZE; tr.speed_hz = 10000000; tr.bits_per_word = 8; // 发送写命令 tx_buffer[0] = 0x06; // 写使能 ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 0) { perror("Failed to send write enable command"); exit(1); } tr.len = 4; tx_buffer[0] = 0x02; // 写指令 tx_buffer[1] = 0x00; // 地址高位 tx_buffer[2] = 0x00; // 地址中位 tx_buffer[3] = 0x00; // 地址低位 memcpy(tx_buffer + 4, "Hello", 5); // 写入数据 // 发送写数据命令 ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 0) { perror("Failed to send write command"); exit(1); } // 发送读命令 tr.len = 4; tx_buffer[0] = 0x03; // 读指令 tx_buffer[1] = 0x00; // 地址高位 tx_buffer[2] = 0x00; // 地址中位 tx_buffer[3] = 0x00; // 地址低位 ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 0) { perror("Failed to send read command"); exit(1); } printf("Data read from flash memory: %s\n", rx_buffer + 4); // 关闭SPI设备 close(fd); return 0; } ``` 以上代码演示了如何使用SPI接口读写W25Q64芯片。其中,首先通过ioctl函数设置SPI传输参数和指令,然后通过ioctl函数发送指令,并通过缓冲区读取或写入数据。 需要注意的是,通过SPI接口读写W25Q64芯片需要按照其通信协议进行操作,具体指令和数据格式可参考W25Q64的数据手册。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

范子琦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值