QSPI四线SPI:D0、D1、D2、D3
在SPI(串行外设接口)通信中,D0、D1、D2、D3通常指的是数据线,也叫做数据引脚或通道。这些引脚的使用可能会根据具体设备或配置的不同而有所变化。
标准的SPI通信接口通常包含以下四个主要引脚:
- MOSI(Master Out Slave In) - 主设备输出从设备输入,也称D0或数据线0(Data Line 0)。
- MISO(Master In Slave Out) - 主设备输入从设备输出,也称D1或数据线1(Data Line 1)。
- SCLK(Serial Clock) - 串行时钟信号,用于同步主设备和从设备之间的数据传输。
- SS/CS(Slave Select/Chip Select) - 从设备选择信号,主设备使用该信号选择与哪个从设备进行通信。
除了上述标准的引脚,有些SPI设备支持双向或四向SPI通信模式,分别称为双SPI(Dual SPI)和四SPI(Quad SPI),这些模式可以利用更多的数据线来提高数据传输速率。以下是这些模式下的引脚描述:
双SPI(Dual SPI)
在双SPI模式下,数据通过两条线进行双向传输:
- D0: 双SPI模式下的第一条数据线,相当于MOSI。
- D1: 双SPI模式下的第二条数据线,相当于MISO。
四SPI(Quad SPI)
在四SPI模式下,数据通过四条线进行传输,以进一步提高传输速率:
- D0: 四SPI模式下的第一条数据线(也称IO0或DQ0)。
- D1: 四SPI模式下的第二条数据线(也称IO1或DQ1)。
- D2: 四SPI模式下的第三条数据线(也称IO2或DQ2)。
- D3: 四SPI模式下的第四条数据线(也称IO3或DQ3)。
四SPI模式允许在一次时钟周期内传输更多的数据,显著提高了数据传输效率。这种模式常用于需要高速数据传输的存储器件,如闪存。
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include "nrf.h"
#include "bsp.h"
#include "app_util_platform.h"
#include "nrfx_qspi.h"
#include "nrf_delay.h"#define QSPI_SCK_PIN   NRF_GPIO_PIN_MAP(0, 19)
#define QSPI_CSN_PIN   NRF_GPIO_PIN_MAP(0, 17)
#define QSPI_IO0_PIN   NRF_GPIO_PIN_MAP(0, 20)
#define QSPI_IO1_PIN   NRF_GPIO_PIN_MAP(0, 21)
#define QSPI_IO2_PIN   NRF_GPIO_PIN_MAP(0, 22)
#define QSPI_IO3_PIN   NRF_GPIO_PIN_MAP(0, 23)#define DATA_SIZE      256
#define ERASE_ADDR     0x00000000static uint8_t m_buffer_tx[DATA_SIZE];
static uint8_t m_buffer_rx[DATA_SIZE];
static volatile bool qspi_done = false;static void qspi_handler(nrfx_qspi_evt_t event, void *p_context) {if (event == NRFX_QSPI_EVENT_DONE) {qspi_done = true;}
}static void qspi_init(void) {nrfx_qspi_config_t qspi_config = NRFX_QSPI_DEFAULT_CONFIG;qspi_config.pins.sck_pin = QSPI_SCK_PIN;qspi_config.pins.csn_pin = QSPI_CSN_PIN;qspi_config.pins.io0_pin = QSPI_IO0_PIN;qspi_config.pins.io1_pin = QSPI_IO1_PIN;qspi_config.pins.io2_pin = QSPI_IO2_PIN;qspi_config.pins.io3_pin = QSPI_IO3_PIN;ret_code_t ret = nrfx_qspi_init(&qspi_config, qspi_handler, NULL);APP_ERROR_CHECK(ret);
}static void wait_for_qspi(void) {while (!qspi_done) {__WFE();}qspi_done = false;
}static void qspi_erase_sector(uint32_t addr) {ret_code_t ret = nrfx_qspi_erase(NRF_QSPI_ERASE_LEN_4KB, addr);APP_ERROR_CHECK(ret);wait_for_qspi();
}static void qspi_write_data(uint32_t addr, const uint8_t *data, size_t size) {ret_code_t ret = nrfx_qspi_write(data, size, addr);APP_ERROR_CHECK(ret);wait_for_qspi();
}static void qspi_read_data(uint32_t addr, uint8_t *data, size_t size) {ret_code_t ret = nrfx_qspi_read(data, size, addr);APP_ERROR_CHECK(ret);wait_for_qspi();
}int main(void) {bsp_board_init(BSP_INIT_LEDS);qspi_init();// 填充数据缓冲区for (uint32_t i = 0; i < DATA_SIZE; i++) {m_buffer_tx[i] = i;}// 擦除扇区qspi_erase_sector(ERASE_ADDR);// 写入数据到闪存qspi_write_data(ERASE_ADDR, m_buffer_tx, DATA_SIZE);// 读取数据从闪存qspi_read_data(ERASE_ADDR, m_buffer_rx, DATA_SIZE);// 验证数据for (uint32_t i = 0; i < DATA_SIZE; i++) {if (m_buffer_rx[i] != i) {bsp_board_led_on(BSP_BOARD_LED_1);  // 如果数据不匹配,点亮LED 1while (true) {// 数据不匹配,停留在此处}}}bsp_board_led_on(BSP_BOARD_LED_0);  // 数据匹配,点亮LED 0while (true) {// 主循环}
}
相关文章:
QSPI四线SPI:D0、D1、D2、D3
在SPI(串行外设接口)通信中,D0、D1、D2、D3通常指的是数据线,也叫做数据引脚或通道。这些引脚的使用可能会根据具体设备或配置的不同而有所变化。 标准的SPI通信接口通常包含以下四个主要引脚: MOSI(Master…...
 
vue3通过vue-video-player实现视频倍速、默认全屏、拖拽进度条等功能
效果图: 1、场景: js原生的video标签在不同浏览器及不同型号手机上都展示的不一样,一部分没有倍速,一部分没有全屏等功能,为了统一视频播放的交互功能,使用vue-video-player插件来完成,vue-vid…...
微信小程序 点击左上角返回弹窗提示
业务需求:当页面表单没有提交直接返回时,要提示用户是否保存当前信息,如果已经提交就不提示了。 由于微信小程序是无法监听右上角按钮返回事件。 所以就换个思路 小程序提供了如下两个Api wx.enableAlertBeforeUnload(Object object)&…...
 
openEuler 22.03 (LTS-SP1)服务器用ntpd同步GPS时间服务器的案例
本文记录了openEuler 22.03 (LTS-SP1)的二级时间服务器用chronyd不能自动同步GPS时间服务器,改用ntpd同步GPS时间服务器成功的案例 一、环境简述 1、本环境中有两台GPS一级时间服务器,IP如下: 192.168.188.66 192.168.188.74 2、有一台o…...
 
Git的安装以及使用
一.简单介绍 1.1版本控制 版本控制是指对软件开发过程中各种程序代码,配置文件及说明文档等文件变更管理,是软件配置管理的核心思想之一。 版本控制最重要的内容是追踪文件的变更,它将什么时候,什么人更改了文件的什么内容等信息忠实的记录…...
 
双路视频同屏显示(拼接)-基于野火Zynq7020开发板
前情提要 米联客FDMA驱动OV5640摄像头—基于野火Zynq7020开发板 本文在此基础上,实现了双路视频拼接。将ov5640输出的1024600的图像数据缩放为512600,分两路写入ddr3,并且显示在1024*600的RGB屏幕中。 纯FPGA也可以按此方法实现。 总体BLOC…...
 
ForkJoinPool浅析
一,概述 相比传统的线程池ExecuteService,ForkJoinPool的优势在于能采用分治算法、工作窃取算法高效利用CPU资源,如下图 Fork即拆分,Join即合并, 通过将大任务拆分成多个小任务,在多个线程中执行后,合并结果即可得到大任务的结果,经典的例子有归并排序、超大数组求和…...
【AI-小米机器狗】Dockerfile包含SSH和SFTP
通过这些步骤,可以在docker容器中安装运行SSH和SFTP服务,设置ssh和sftp的密码,克隆指定的Git仓库到/home目录,并使用bash作为入口点, # 基于原始镜像 FROM cyberdog_sim:v1# 更新包列表并安装OpenSSH服务器和git RUN …...
 
仿真CAN报文发送的CRC校验算法(附CAPL代码)
文章目录 前言一、为什么CAN报文有CRC?二、怎么确定是否需要做CRC校验?三、CAPL代码实现CRC算法 前言 关于CRC校验的基本理论、算法实现网上已经有很多介绍文章,本文不再赘述。只是记录在项目测试中真正开发CRC算法并进行测试的一些体会。 …...
如何在Android应用中最佳实现“Edge to Edge“特性?
Edge to Edge"特性 要在Android应用中最佳实现"Edge to Edge"特性,可以按照以下步骤进行操作: 1. 设置目标版本:将应用的目标版本设置为Android Q或更高版本。在build.gradle文件中,将targetSdkVersion设置为Q。 2. 设置主题样式:在styles.xml文件中,创…...
多租户与低代码开发的应用:解锁企业数字化转型的无限可能
在数字化转型的浪潮中,多租户与低代码开发已经成为推动企业快速、灵活、安全地构建和部署应用的关键技术。本文将深入探讨这两种技术的结合如何为企业带来前所未有的变革和机遇。 多租户架构:资源共享与隔离的艺术 多租户架构,是一种高级的软…...
 
出现身份验证错误,无法连接到本地安全机构 顺利解决这个问题希望能帮助大家
出现身份验证错误,无法连接到本地安全机构,远程计算机:XX,这可能是由于密码过期,如果密码已过期请更新密码。 我们可以在系统属性中对远程进行设置,以解决远程桌面无法连接到本地安全机构这一问题。 步骤…...
 
老师把卷子拍成图片如何打印
如今,老师们经常会把试卷、习题拍成图片分享给学生(如通过微信群或钉钉群的形式)。但随之而来的问题是,这些图片如何方便地打印出来呢?尤其是当面对一张张精美的试卷图片时,许多学生和家长都感到头疼。 一…...
 
MySQL数据库(三):读取数据库数据
上一节,我们介绍了数据库的基本操作,以及最后演示了如何使用库来连接数据库,在实际应用中,我们通常需要按照指定的条件对数据库进行操作,即增删改查操作,这是非常重要的!这一节我们继续通过一个…...
 
分销裂变实战:PLG模式如何助力企业突破增长瓶颈
在竞争激烈的商业环境中,企业如何快速、有效地实现增长,一直是业界关注的焦点。近年来,分销裂变作为一种新兴的商业模式,凭借其独特的优势,逐渐受到企业的青睐。而产品驱动增长(PLG)模式更是为分…...
定积分定义求极限专题
文章目录 定积分定义求极限问题的描述解决方法真题实践(持续更新中,未完结) 定积分定义求极限问题的描述 在定积分定义求极限中,我们可能存在的问题 被积函数不会找积分区间不会定(只会[0,1]的)根本不知道“补系数”…...
 
LLaMA:挑战大模型Scaling Law的性能突破
实际问题 在大模型的研发中,通常会有下面一些需求: 计划训练一个10B的模型,想知道至少需要多大的数据?收集到了1T的数据,想知道能训练一个多大的模型?老板准备1个月后开发布会,给的资源是100张A100,应该用多少数据训多大的模型效果最好?老板对现在10B的模型不满意,想…...
vue3 +elementPlus上传照片墙
获取到照片字符串然后push到fileList对应的URL中 if (formData.value.pictures) {let zz formData.value.pictures.split(",")zz.forEach((item) > {fileList.value.push({ url: item })})}对应表单 <el-form-item label"内容详情图"><el-up…...
 
Charles网络抓包工具安装和web抓包(一)
目录 概述 抓包工具对比 安装 下载 web抓包配置 按键说明 前言-与正文无关  生活远不止眼前的苦劳与奔波,它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中,我们往往容易陷入工作的漩涡,忘记了停下脚步&#…...
 
mysql workbench使用schema视图导出表和列结构到excel
目的:导出所有表和列的名字和注释 很多时候没有正规的数据库文档,为了快速交流啊,需要一个快捷的基础。数据库建表的时候可能有注释,也可能没有注释。有当然好,查看注释就能清楚很多,没有的话最好一个一个补…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
 
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
 
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
 
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
 
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
 
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
