16.HAL库之SPI和QSPI

16.HAL库之SPI和QSPI1 SPI 协议 以 RN8302 为例 SPI 是串行外设接口 SerialPeriph 的缩写 SPI 是一种高速的 全双工 同步的通信总线 并且在芯片的管脚上只占用四根线 SCSN SCLK SDI SDO 总结传输流程 a 写时序 SCSN 拉低 开启通讯 主机依次写入地址 命令 数据 高位在前 低位在后 CS 校验 主机在 SCLK 下降沿将数

1.SPI协议(以RN8302为例)

SPI是串行外设接口(Serial Peripheral Interface)的缩写。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线(SCSN,SCLK,SDI,SDO).

16.HAL库之SPI和QSPI

总结传输流程:

a.写时序

16.HAL库之SPI和QSPI

16.HAL库之SPI和QSPI

SCSN拉低,开启通讯。主机依次写入地址,命令,数据(高位在前,低位在后),CS校验。主机在SCLK下降沿将数据通过SDI写入从机。最后SCSN拉高结束通讯。

b.读时序

16.HAL库之SPI和QSPI

16.HAL库之SPI和QSPI

SCSN拉低开启通讯,主机先写入地址+命令共两个字节,随后在SCLK下降沿读取从机从SDO输出的数据(高位在前,低位在后)。最后SCSN拉高结束通讯。

驱动程序编写:头文件中需定义管脚控制命令,寄存器地址,芯片命令。c文件中依次编写读写字节,读写帧数据,读写寄存器,芯片初始化等函数。

RN8302具体驱动程序见: https://download.csdn.net/download/weixin_/

主机(STM32F746)只需配置SPI接口即可,具体流程为:开启时钟,GPIO管脚配置,SPI配置。

2.QSPI

QSPI是Queued SPI的简写,是Motorola公司推出的SPI接口的扩展,比SPI应用更加广泛。在SPI协议的基础上,Motorola公司对其功能进行了增强,增加了队列传输机制,推出了队列串行外围接口协议(即QSPI协议)。QSPI 是一种专用的通信接口,连接单、双或四(条数据线) SPI Flash 存储介质。共有SNCS,SCLK,BK0,BK1,BK2,BK3共6根接线,可以实现多种通信模式。

16.HAL库之SPI和QSPI

16.HAL库之SPI和QSPI

主机需进行QSPI接口的配置,QSPI协议主要通过发送命令来进行通讯,因此主机的配置包括管脚配置,QSPI初始化。

QUADSPI通过命令和FLASH通讯,命令包括:指令+地址+交替字节+空周期+数据五个阶段,并且各阶段可省略。

 

单线SPI模式:BK_IO0即SO,BK_IO1即SI,加上NCS和SCLK,类似于SPI模式。

16.HAL库之SPI和QSPI

双线SPI模式:BK_IO0和BK_IO1实现数据的双入双出。

16.HAL库之SPI和QSPI

四线SPI模式:BK_IO0,BK_IO1,BK_IO2,BK_IO3四根线实现数据的传输。

16.HAL库之SPI和QSPI

SDR模式:QSPI驱动IO0~IO3在SCLK的下降沿进行数据变化。

DDR模式:在该模式下,指令阶段在SCLK下降沿发送数据,而在地址,交替字节,数据阶段在SCLK上升沿和下降沿均发送数据。

16.HAL库之SPI和QSPI

双闪存模式:使用两个外部SPI四线,可将flash扩大一倍。

QSPI配置:

时钟使能,管脚定义,QSPI配置,flash初始化,QSPI读/写函数定义。

void Qspi_Config() { __HAL_RCC_QSPI_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); Flash_GPIO.Pin=GPIO_PIN_2; Flash_GPIO.Mode=GPIO_MODE_AF_PP; Flash_GPIO.Speed=GPIO_SPEED_FREQ_MEDIUM; Flash_GPIO.Pull=GPIO_NOPULL; Flash_GPIO.Alternate=GPIO_AF9_QUADSPI; HAL_GPIO_Init(GPIOB,&Flash_GPIO); //QSPI_CLK, PB2 Flash_GPIO.Pin=GPIO_PIN_6; Flash_GPIO.Mode=GPIO_MODE_AF_PP; Flash_GPIO.Speed=GPIO_SPEED_FREQ_MEDIUM; Flash_GPIO.Pull=GPIO_PULLUP; Flash_GPIO.Alternate=GPIO_AF10_QUADSPI; HAL_GPIO_Init(GPIOB,&Flash_GPIO); //QSPI_NCS, PB6 Flash_GPIO.Pin=GPIO_PIN_8; Flash_GPIO.Mode=GPIO_MODE_AF_PP; Flash_GPIO.Speed=GPIO_SPEED_FREQ_MEDIUM; Flash_GPIO.Pull=GPIO_NOPULL; Flash_GPIO.Alternate=GPIO_AF10_QUADSPI; HAL_GPIO_Init(GPIOF,&Flash_GPIO); //QSPI_IO0, PF8 Flash_GPIO.Pin=GPIO_PIN_9; Flash_GPIO.Mode=GPIO_MODE_AF_PP; Flash_GPIO.Speed=GPIO_SPEED_FREQ_MEDIUM; Flash_GPIO.Pull=GPIO_NOPULL; Flash_GPIO.Alternate=GPIO_AF10_QUADSPI; HAL_GPIO_Init(GPIOF,&Flash_GPIO); //QSPI_IO1, PF9 Flash_GPIO.Pin=GPIO_PIN_7; Flash_GPIO.Mode=GPIO_MODE_AF_PP; Flash_GPIO.Speed=GPIO_SPEED_FREQ_MEDIUM; Flash_GPIO.Pull=GPIO_NOPULL; Flash_GPIO.Alternate=GPIO_AF9_QUADSPI; HAL_GPIO_Init(GPIOF,&Flash_GPIO); //QSPI_IO2, PF7 Flash_GPIO.Pin=GPIO_PIN_6; Flash_GPIO.Mode=GPIO_MODE_AF_PP; Flash_GPIO.Speed=GPIO_SPEED_FREQ_MEDIUM; Flash_GPIO.Pull=GPIO_NOPULL; Flash_GPIO.Alternate=GPIO_AF9_QUADSPI; HAL_GPIO_Init(GPIOF,&Flash_GPIO); //QSPI_IO3, PF6 QSPI_Flash.Instance=QUADSPI; QSPI_Flash.Init.ClockPrescaler=2; QSPI_Flash.Init.FifoThreshold=4; QSPI_Flash.Init.SampleShifting=QSPI_SAMPLE_SHIFTING_HALFCYCLE; QSPI_Flash.Init.FlashSize=25; QSPI_Flash.Init.ChipSelectHighTime=QSPI_CS_HIGH_TIME_8_CYCLE; QSPI_Flash.Init.ClockMode=QSPI_CLOCK_MODE_0; HAL_QSPI_Init(&QSPI_Flash); }

 

void QSPI_Read(uint8_t *data,uint32_t addr, uint32_t size) { QSPI_CommandTypeDef flash_command; flash_command.InstructionMode=QSPI_INSTRUCTION_1_LINE; flash_command.Instruction=0x13; flash_command.Address=addr; flash_command.AddressMode=QSPI_ADDRESS_1_LINE; flash_command.AddressSize=QSPI_ADDRESS_32_BITS; flash_command.AlternateByteMode=QSPI_ALTERNATE_BYTES_NONE; flash_command.DataMode=QSPI_DATA_1_LINE; flash_command.DummyCycles=0; flash_command.NbData=size; flash_command.DdrMode=QSPI_DDR_MODE_DISABLE; flash_command.DdrHoldHalfCycle=QSPI_DDR_HHC_ANALOG_DELAY; flash_command.SIOOMode=QSPI_SIOO_INST_EVERY_CMD; HAL_QSPI_Command(&QSPI_Flash,&flash_command,HAL_QPSI_TIMEOUT_DEFAULT_VALUE); HAL_QSPI_Receive(&QSPI_Flash,data,1000); //读取的数据放入*data中,共size个字节 QSPI_AutoPollingMemReady(); } void QSPI_WritePage(uint8_t *pData,uint32_t WriteAddr, uint32_t Size) { QSPI_CommandTypeDef flash_command; QSPI_WriteEnable(); flash_command.InstructionMode = QSPI_INSTRUCTION_1_LINE; flash_command.Instruction = 0x12; flash_command.AddressMode = QSPI_ADDRESS_1_LINE; flash_command.AddressSize = QSPI_ADDRESS_32_BITS; flash_command.Address = WriteAddr; flash_command.NbData = Size; flash_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE; flash_command.DataMode = QSPI_DATA_1_LINE; flash_command.DummyCycles = 0; flash_command.DdrMode = QSPI_DDR_MODE_DISABLE; flash_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY; flash_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; HAL_QSPI_Command(&QSPI_Flash, &flash_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE); HAL_QSPI_Transmit(&QSPI_Flash, pData, HAL_QPSI_TIMEOUT_DEFAULT_VALUE); QSPI_AutoPollingMemReady(); }

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207098.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午2:27
下一篇 2026年3月19日 下午2:27


相关推荐

  • Subversion+RabbitVCS 版本控制「建议收藏」

    Subversion+RabbitVCS 版本控制「建议收藏」Ubuntu10.04学习笔记(4)——Subversion+RabbitVCS版本控制2011年04月19日星期二17:281、安装Subversion软件sudoapt-getinstallapache2%先安装apache,配合阅读svn用,并且平时开发也是要用到的sudoapt-getinstallsubversion%svn…

    2022年7月18日
    15
  • 服务器网络io性能_服务器热备份方案

    服务器网络io性能_服务器热备份方案介质(HDD/SSD)接口sata/scsicontroller,raid卡or南桥,是否有缓存文件系统xfs,或其他brtfs之类的磁盘队列算法deadlinecfqnoopdm内存缓存设置RAID形式性能RAID0磁盘空间使用率:100%,故成本最低。读性能:N单块磁盘的读性能。写性能:N单块磁盘的写性能。冗余:无,任何一块磁盘损坏都将导致数据不可用…

    2026年2月1日
    3
  • AutoEventWireup属性

    AutoEventWireup属性aspx页面第一行page指令中包含了一个AutoEventWireup属性2008-09-1417:15使用Asp.NET时,新建的aspx页面第一行page指令中包含了一个AutoEventWireup属性。网上的很多教程认为这一属性,甚至这一行代码都是没用的。其实,这是不了解Asp.NET事件处理模型的表现。简单来说,这一属性决定了当前页是否自动关联某些特殊事件。…

    2022年5月8日
    42
  • 最新kali之dirbuster

    最新kali之dirbuster描述 目录扫描工具 DirBuster 支持全部的 Web 目录扫描方式 它既支持网页爬虫方式扫描 也支持基于字典暴力扫描 还支持纯暴力扫描 该工具使用 Java 语言编写 提供命令行 Headless 和图形界面 GUI 两种模式 其中 图形界面模式功能更为强大 用户不仅可以指定纯暴力扫描的字符规则 还可以设置以 URL 模糊方式构建网页路径 同时 用户还对网页解析方式进行各种定制 提高网址解析效率 选项 h 显示帮助信息 H 以无头模式 无 GUI 启动 DirBuster 报告将在退出时自动保存

    2025年11月29日
    6
  • 前端开发技术(vscode怎么下载)

    前言   在前端开发中,有一个非常好用的工具,VisualStudioCode,简称VScode。   都不用我安利VScode,大家就会乖乖的去用,无数个大言不惭的攻城狮,都被VScode比德芙还丝滑的强大功能所折服。   我是来给大家安利插件的,想做个比较全面的插件集合给大家。网上的我也看过一些,但是都比较零散,时间也久了一些,我结合最近的情况,总结一下,造福大家,才是我…

    2022年4月10日
    57
  • 手把手教你用Coze搭建智能体:30分钟完整教程+详细操作步骤

    手把手教你用Coze搭建智能体:30分钟完整教程+详细操作步骤

    2026年3月12日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号