历史上的今天
返回首页

历史上的今天

今天是:2024年12月18日(星期三)

正在发生

2020年12月18日 | STM32F7xx —— QSPI

2020-12-18 来源:eefocus

一、QSPI

        SPI 是 Queued SPI 的简写,是 Motorola公司推出的 SPI 接口的扩展,比 SPI 应用更加广泛。在 SPI 协议的基础上,Motorola 公司对其功能进行了增强,增加了队列传输机制,推出了队列串行外围接口协议(即 QSPI 协议),使用该接口,用户可以一次性传输包含多达16个8位或16位数据的传输队列。一旦传输启动,直到传输结束,都不需要CPU干预,极大的提高了传输效率。该协议在ColdFire系列MCU得到广泛应用。与SPI相比,QSPI的最大结构特点是以80字节的RAM代替了SPI的发送和接收寄存器。QSPI 是一种专用的通信接口,连接单、双或四(条数据线) SPI Flash 存储介质。

 该接口可以在以下三种模式下工作:
① 间接模式:使用 QSPI 寄存器执行全部操作
② 状态轮询模式:周期性读取外部 Flash 状态寄存器,而且标志位置 1 时会产生中断(如擦除或烧写完成,会产生中断)
③ 内存映射模式:外部 Flash 映射到微控制器地址空间,从而系统将其视作内部存储器。

QSPI通过6根线与SPI芯片通信,下图是内部框图:

QSPI每条命令,必须包含一个或多个阶段:指令、地址、交替字节、空指令和数据。

QSPI发送命令:等待QSPI空闲;设置命令参数。

QSPI读数据:设置数据传输长度;设置QSPI工作模式并设置地址;读取数据。

QSPI写数据:设置数据传输长度;设置QSPI工作模式并设置地址;写数据。

二、几个重要的函数

HAL_StatusTypeDef     HAL_QSPI_Init     (QSPI_HandleTypeDef *hqspi); // 初始化

 

HAL_StatusTypeDef HAL_QSPI_Command(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t Timeout); // 发送命令

 

HAL_StatusTypeDef     HAL_QSPI_Transmit     (QSPI_HandleTypeDef *hqspi, uint8_t *pData, uint32_t Timeout); // 发送数据

 

HAL_StatusTypeDef     HAL_QSPI_Receive      (QSPI_HandleTypeDef *hqspi, uint8_t *pData, uint32_t Timeout); // 接收数据

 

三、几个重要的结构

// QSPI操作句柄

typedef struct

{

  QUADSPI_TypeDef            *Instance;        /* QSPI registers base address        */

  QSPI_InitTypeDef           Init;             /* QSPI communication parameters      */

  uint8_t                    *pTxBuffPtr;      /* Pointer to QSPI Tx transfer Buffer */

  __IO uint16_t              TxXferSize;       /* QSPI Tx Transfer size              */

  __IO uint16_t              TxXferCount;      /* QSPI Tx Transfer Counter           */

  uint8_t                    *pRxBuffPtr;      /* Pointer to QSPI Rx transfer Buffer */

  __IO uint16_t              RxXferSize;       /* QSPI Rx Transfer size              */

  __IO uint16_t              RxXferCount;      /* QSPI Rx Transfer Counter           */

  DMA_HandleTypeDef          *hdma;            /* QSPI Rx/Tx DMA Handle parameters   */

  __IO HAL_LockTypeDef       Lock;             /* Locking object                     */

  __IO HAL_QSPI_StateTypeDef State;            /* QSPI communication state           */

  __IO uint32_t              ErrorCode;        /* QSPI Error code                    */

  uint32_t                   Timeout;          /* Timeout for the QSPI memory access */ 

}QSPI_HandleTypeDef;

 

// Instance:QSPI基地址  ---  QUADSPI

// Init:设置QSPI参数

// pTxBuffPtr,TxXferSize,TxXferCount:发送缓存指针 发送数据量 剩余数据量

// pRxBuffPtr,RxXferSize,RxXferCount:接收缓存指针 发送数据量 剩余数据量

// hdma与DMA相关, 其他为过程变量不需要关心

// 参数配置 时钟分频系数  FIFO阈值  采样移位  FLASH大小  片选高电平时间  时钟模式  闪存ID  双闪存模式设置

typedef struct

{

  uint32_t ClockPrescaler;     /* Specifies the prescaler factor for generating clock based on the AHB clock.

                                  This parameter can be a number between 0 and 255 */ 

                                  

  uint32_t FifoThreshold;      /* Specifies the threshold number of bytes in the FIFO (used only in indirect mode)

                                  This parameter can be a value between 1 and 32 */

                                  

  uint32_t SampleShifting;     /* Specifies the Sample Shift. The data is sampled 1/2 clock cycle delay later to 

                                  take in account external signal delays. (It should be QSPI_SAMPLE_SHIFTING_NONE in DDR mode)

                                  This parameter can be a value of @ref QSPI_SampleShifting */

                                  

  uint32_t FlashSize;          /* Specifies the Flash Size. FlashSize+1 is effectively the number of address bits 

                                  required to address the flash memory. The flash capacity can be up to 4GB 

                                  (addressed using 32 bits) in indirect mode, but the addressable space in 

                                  memory-mapped mode is limited to 256MB

                                  This parameter can be a number between 0 and 31 */

                                  

  uint32_t ChipSelectHighTime; /* Specifies the Chip Select High Time. ChipSelectHighTime+1 defines the minimum number 

                                  of clock cycles which the chip select must remain high between commands.

                                  This parameter can be a value of @ref QSPI_ChipSelectHighTime */ 

                                    

  uint32_t ClockMode;          /* Specifies the Clock Mode. It indicates the level that clock takes between commands.

                                  This parameter can be a value of @ref QSPI_ClockMode */

                                 

  uint32_t FlashID;            /* Specifies the Flash which will be used,

                                  This parameter can be a value of @ref QSPI_Flash_Select */

                                 

  uint32_t DualFlash;          /* Specifies the Dual Flash Mode State

                                  This parameter can be a value of @ref QSPI_DualFlash_Mode */                                               

}QSPI_InitTypeDef;

// 采样移位

#define QSPI_SAMPLE_SHIFTING_NONE           ((uint32_t)0x00000000U)        /*!#define QSPI_SAMPLE_SHIFTING_HALFCYCLE      ((uint32_t)QUADSPI_CR_SSHIFT) /*!<1/2 clock cycle shift to sample data*/

四、QSPI接口设计(仅供参考)

#define QSPI_CLK_ENABLE()         __HAL_RCC_QSPI_CLK_ENABLE();

 

#define QSPI_BK1_NCS_PORT         GPIOB

#define QSPI_BK1_NCS_PIN          GPIO_PIN_6

#define QSPI_BK1_NCS_AF           GPIO_AF10_QUADSPI

#define QSPI_BK1_NCS_CONFIG()     GPIOConfigExt(QSPI_BK1_NCS_PORT, QSPI_BK1_NCS_PIN, GPIO_MODE_AF_PP, GPIO_PULLUP, QSPI_BK1_NCS_AF)

 

#define QSPI_BK1_CLK_PORT         GPIOB

#define QSPI_BK1_CLK_PIN          GPIO_PIN_2

#define QSPI_BK1_CLK_AF           GPIO_AF9_QUADSPI

#define QSPI_BK1_CLK_CONFIG()     GPIOConfigExt(QSPI_BK1_CLK_PORT, QSPI_BK1_CLK_PIN, GPIO_MODE_AF_PP, GPIO_NOPULL, QSPI_BK1_CLK_AF)

 

#define QSPI_BK1_IO0_PORT         GPIOF

#define QSPI_BK1_IO0_PIN          GPIO_PIN_8

#define QSPI_BK1_IO0_AF           GPIO_AF10_QUADSPI

#define QSPI_BK1_IO0_CONFIG()     GPIOConfigExt(QSPI_BK1_IO0_PORT, QSPI_BK1_IO0_PIN, GPIO_MODE_AF_PP, GPIO_NOPULL, QSPI_BK1_IO0_AF)

 

#define QSPI_BK1_IO1_PORT         GPIOF

#define QSPI_BK1_IO1_PIN          GPIO_PIN_9

#define QSPI_BK1_IO1_AF           GPIO_AF10_QUADSPI

#define QSPI_BK1_IO1_CONFIG()     GPIOConfigExt(QSPI_BK1_IO1_PORT, QSPI_BK1_IO1_PIN, GPIO_MODE_AF_PP, GPIO_NOPULL, QSPI_BK1_IO1_AF)

推荐阅读

史海拾趣

B&B Electronics Manufacturing Company公司的发展小趣事

在国内市场取得一定成绩后,B&B公司开始将目光投向国际市场。通过参加国际电子展会、建立海外销售网络等方式,公司逐渐打开了国际市场的大门。其产品以高品质和可靠性赢得了海外客户的信赖,为公司的进一步发展奠定了坚实的基础。

C-MEDIA公司的发展小趣事

随着公司业务的不断扩展,C-MEDIA开始实施全球化战略,积极寻求与国际知名企业的合作。通过与全球领先的电子企业、内容提供商和媒体平台建立战略合作关系,C-MEDIA成功地将自己的技术和产品推向了更广阔的市场。这些合作不仅提升了公司的品牌知名度和市场份额,也为公司的长期发展奠定了坚实的基础。

以上只是C-MEDIA公司在电子行业中的一些重要发展节点和故事的概括性描述。实际上,公司的发展过程中还涉及到许多其他的细节和因素,包括市场竞争、技术创新、人才引进等等。这些故事共同构成了C-MEDIA在电子行业中的发展轨迹,展示了其不断进取、追求卓越的精神风貌。

BITECH公司的发展小趣事

随着数字化时代的到来,C-MEDIA公司敏锐地捕捉到文化传媒市场的潜力。公司以法国主流电视台为传播平台,积极与中国主流媒体展开合作,成功开创了海外华人经营国际文化传媒的新模式。特别是在2014年,中国国务院新闻办独家授权C-MEDIA在欧洲播放中国影视数据库节目,这一举措极大地提升了公司在国际文化传媒领域的影响力。

意普(ESPE)公司的发展小趣事

意普(ESPE)公司成立于XXXX年,初期专注于光电保护技术的研发。在创始人XXX的领导下,公司凭借对光电技术的深入理解和创新,成功研发出首款红外线安全保护装置,并在行业内获得了广泛的认可。这一技术的突破不仅为公司赢得了市场份额,也为后续的发展奠定了坚实的基础。

敦泰(FOCALTECH)公司的发展小趣事
调节冰箱温度时,应根据季节和存放食物的需求进行调整。一般来说,冷藏室的温度应设置在2-8℃之间,冷冻室的温度应设置在-18℃以下。可以通过冰箱上的温度调节按钮或触摸屏进行设置。同时,注意避免将温度设置过低或过高,以免影响食物的保鲜效果和冰箱的能耗。
First Switchtech公司的发展小趣事

面对日益激烈的全球竞争,First Switchtech公司(或类似公司)制定了积极的国际化战略。公司首先在欧洲市场设立了分支机构,通过深入了解当地市场需求和文化背景,成功推出了符合欧洲标准的电子开关产品。随后,公司进一步拓展北美、亚洲等市场,通过本地化生产和营销策略,实现了全球市场的覆盖。这一过程中,公司不仅提升了品牌知名度,还积累了丰富的国际市场运营经验。

问答坊 | AI 解惑

ChinaEDA--嵌入式Linux操作系统学习规划

嵌入式Linux操作系统学习规划 ARM+LINUX路线,主攻嵌入式Linux操作系统及其上应用软件开发目标: (1) 掌握主流嵌入式微处理器的结构与原理(初步定为arm9) (2) 必须掌握一个嵌入式操作系统 (初步定为uclinux或linux,版本待定) (3) ...…

查看全部问答>

在VxWorks下如何打印文件

最近在做VxWorks下的打印功能,可是VxWorks不像Windows或Linux那样提供“所见即所得”的GDI函数接口, 所以对于在VxWorks下做可打印和可显示的GDI函数接口一头雾水,无从下手,最近看到了介绍打印机控制语言 PCL和PostScript,感觉里面介绍的东西 ...…

查看全部问答>

建文件

怎么才能在建立的项目中.c文件中添加一子文件如.h文件…

查看全部问答>

怎样知道菜单

比如,点击 文件 下的 打开  ,我想在点击文件之前,重新生成菜单,我该怎么做啊?谢谢…

查看全部问答>

版主:STM32外部中断EXTI调试失败

使用万利开发板进行EXTI简单调试:设置PD3,PD4引脚作为中断输入端口,他们分别与板载按键KEY2,KEY3相连。设置好后主程序运行正常,可一旦按下KEY2或KEY3任何一个产生中断信号时,主程序死掉,中断也进不去!! 附EXTI设置源码: *********** ...…

查看全部问答>

寻wince50驱动开发人员

需要寻求wince50开发人员,有驱动需要开发。有兴趣联系 sigwell@126.com,上海。…

查看全部问答>

定位ARM Hard Fault 的方法

  1,  用Keil的话,可以做如下操作: 先将fault中断函数的内容改为:   HardFault_Handler\\                 PROC   &n ...…

查看全部问答>

求9B96开发板光盘资料

因光盘不小心遗失,求9B96开发板光盘资料。邮箱wzpstudy@126.com 片子是C3的,例程最好为6288版本的。。。谢谢了 …

查看全部问答>