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
目的:导出所有表和列的名字和注释 很多时候没有正规的数据库文档,为了快速交流啊,需要一个快捷的基础。数据库建表的时候可能有注释,也可能没有注释。有当然好,查看注释就能清楚很多,没有的话最好一个一个补…...
从任务编排到自动化工作流:OpenClaw与Apache Airflow实战解析
1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫Charpup/openclaw-task-workflow。光看名字,你可能会有点摸不着头脑——“Charpup”是什么?“OpenClaw”又是什么?这其实是一个典型的、由开发者社区驱动的自动化任…...
ARM链接器命令行选项优化与实战技巧
1. ARM链接器命令行选项深度解析 在嵌入式开发领域,ARM链接器(armlink)作为工具链的关键组件,承担着将多个目标文件合并为可执行程序的重任。不同于简单的文件拼接,现代链接器提供了数十种精细控制选项,能够深度优化代码布局、调试…...
中国移联AI元宇宙产业委调研阿尔特汽车科技园 构建高精尖产业的“技术-场景-商业”融合生态
(央链知播 北京讯) 5月7日,中国移动通信联合会人工智能与元宇宙产业工作委员会(简称“中国移联AI与元宇宙产业委”)、中国移动通信联合会数字文化与智慧教育分会、中国通信工业协会区块链专业委员会等机构秘书长何超带…...
本地AI网关实战:统一管理多模型服务,实现智能路由与成本控制
1. 项目概述:一个本地化的AI网关如果你正在同时使用多个AI模型服务商,比如OpenAI、Anthropic、Google Gemini,或者还在本地运行着Ollama、vLLM这样的模型,那你一定体会过那种切换的繁琐。每个客户端、每个脚本都要配置不同的API密…...
自动驾驶安全迷思:从94%人为错误统计到ADAS与系统安全工程实践
1. 项目概述:一场关于自动驾驶安全统计数据的“祛魅”如果你最近几年关注过自动驾驶或者高级驾驶辅助系统的新闻,大概率听过一个被反复引用的“金科玉律”:94%的交通事故是由人为错误造成的。这个数字像一句魔咒,被无数自动驾驶公…...
嵌入式开发十年痛点解析:技术栈、多核与安全的实战解法
1. 从一场会议邀约说起:嵌入式程序员的“午夜惊魂”前几天整理旧资料,翻到了2014年嵌入式系统大会(ESC)编程专题的公开征集帖,发起人是当时ARM的培训经理Chris Shore。帖子标题很有意思,叫“什么让你夜不能…...
PyTorch分类网络实战:从VGG16、MobileNetV2到ResNet50的架构解析与代码实现
1. 分类网络入门:为什么选择PyTorch? 刚接触深度学习时,我也曾被TensorFlow和PyTorch的选择困扰过。直到第一次用PyTorch实现了一个简单的图像分类器,才真正体会到它的魅力。PyTorch就像乐高积木,用动态计算图的方式让…...
AI工作流自动化实践:Claude数据同步工具架构与实现
1. 项目概述与核心价值 最近在折腾AI应用集成的时候,发现一个挺有意思的项目,叫 cam901051/claude-sync 。乍一看这个标题,你可能会有点懵,这到底是干嘛的?简单来说,这是一个旨在实现Claude(…...
光纤偏振测量:从琼斯矢量到庞加莱球,六种工具深度解析与工程实践
1. 从一道周五小测题说起:光纤测量中的偏振态表征上周五,我在整理旧资料时,翻到了EE Times在2015年发布的一篇“周五小测”文章,主题是光纤光学测量。其中第一道题就很有意思,它问的是:“以下哪种工具不能用…...
技术决策的后悔药:选型错误后的补救策略
在软件测试的全生命周期中,技术选型是影响测试效率、质量与项目成败的关键环节。小到一款测试工具的挑选,大到整个测试框架的搭建,每一次决策都如同在迷雾中航行,稍有不慎便可能驶入“选型错误”的漩涡。当测试环境兼容性问题频发…...
