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
目的:导出所有表和列的名字和注释 很多时候没有正规的数据库文档,为了快速交流啊,需要一个快捷的基础。数据库建表的时候可能有注释,也可能没有注释。有当然好,查看注释就能清楚很多,没有的话最好一个一个补…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...
ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...
结构化文件管理实战:实现目录自动创建与归类
手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题,进而引发后续程序异常。使用工具进行标准化操作,能有效降低出错概率。 需要快速整理大量文件的技术用户而言,这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB,…...
【threejs】每天一个小案例讲解:创建基本的3D场景
代码仓 GitHub - TiffanyHoo/three_practices: Learning three.js together! 可自行clone,无需安装依赖,直接liver-server运行/直接打开chapter01中的html文件 运行效果图 知识要点 核心三要素 场景(Scene) 使用 THREE.Scene(…...
开疆智能Ethernet/IP转Modbus网关连接鸣志步进电机驱动器配置案例
在工业自动化控制系统中,常常会遇到不同品牌和通信协议的设备需要协同工作的情况。本案例中,客户现场采用了 罗克韦尔PLC,但需要控制的变频器仅支持 ModbusRTU 协议。为了实现PLC 对变频器的有效控制与监控,引入了开疆智能Etherne…...
