jobszheng5 发表于 2023-10-29 14:23

[STM32F769IDISCO返场]QSPI协议也不难

<div class='showpostmsg'> 本帖最后由 jobszheng5 于 2023-10-29 14:28 编辑

# QSPI协议也不难

## 提纲

1. 新项目有一个功能,QSPI协议通讯
2. QSPI协议的优势
3. STM32F769芯片片上包含QSPI外设
4. QSPI协议测试与验证方案:读写板载QSPI存储器
5. 测试结果

# 标题

QSPI协议也不难

# 正文

真是不爽!大周末的收到项目任务,分析了一下,项目任务里面有一项是通过QSPI接口与芯片通讯。回想一下,我还没有使用过QSPI协议接口的芯片呢!看了看STM32F769,强大的F769原生支持QSPI协议。小宝宝睡着了,我也空闲出来了,那就搞起来呗!

## QSPI协议简介

何为QSPI协议?下面是我摘录互联网内容:

> QSPI协议是Queued SPI的简写,是Motorola公司推出的SPI接口的扩展,比SPI应用更加广泛。在SPI协议的基础上,Motorola公司对其功能进行了增强,增加了队列传输机制,推出了队列串行外围接口协议(即QSPI协议)。
>
> QSPI是一种专用的通信接口,可以连接单、双或四条SPI Flash存储介质。该接口可以在以下三种模式下工作:
>
> 1. 间接模式:使用QSPI寄存器执行全部操作。
> 2. 状态轮询模式:周期性读取外部Flash状态寄存器,而且标志位置1时会产生中断(如擦除或烧写完成,会产生中断)。
> 3. 内存映射模式:外部Flash映射到微控制器地址空间,从而系统将其视作内部存储器。
>
> 采用双闪存模式时,将同时访问两个Quad-SPI Flash,吞吐量和容量均可提高二倍。

SPI外设的接口速度可以达到18Mbps,这4线制后,读写速度直接飚升至72Mbps——飞一般的感觉啊!

## 硬件连接图



阅读了datasheet后,STM32F769的QSPI外设支持上述3种模式。

上述原理图为STM32F769工作在单bank模式(硬件上U12未焊接)。



QSPI的命令序列分为5个状态:指令,地址,附加字节,填充位,数据。如下图所示:



阅读到这里,QSPI协议的部分就差不多了,剩下就是QSPI Flash Macronix MX25L51245G芯片数据规格的事情了。

## 实验验证

对于STM32F769芯片QSPI外设的参数配置与初始化,我们仍然使用STM32CubeMX软件来生成,具体参数如下图所示:



实验方案我们仍然采用与SDRAM测试方案相关的步骤。即初始化完成后,在指定地址(0x0100)写入一个常数(0x12345678),

核心代码如下:

~~~c
status = BSP_QSPI_Init();
if (status == QSPI_NOT_SUPPORTED)
{
    JDEBUG_PRINTF("1. QSPI Initialization : FAILED.\r\n");
    goto qspi_end;
}
else if (status == QSPI_ERROR)
{
    JDEBUG_PRINTF("2. QSPI Initialization : FAILED.\r\n");
    goto qspi_end;
}
JDEBUG_PRINTF("1. QSPI Initialization : PASSED.\r\n");
BSP_QSPI_GetInfo(&pQSPI_Info);
status = BSP_QSPI_Erase_Block(WRITE_READ_ADDR);
if (status != QSPI_OK)
{
    JDEBUG_PRINTF("QSPI ERASE : FAILED.\r\n");
    goto qspi_end;
}
JDEBUG_PRINTF("QSPI ERASE : PASSED.\r\n");
tx_buf = 0x12345678;
status = BSP_QSPI_Write(tx_buf, WRITE_READ_ADDR, 4);
if (status != QSPI_OK)
{
    JDEBUG_PRINTF("QSPI WRITE : FAILED.\r\n");
    goto qspi_end;
}
JDEBUG_PRINTF("QSPI WRITE : PASSED.\r\n");

status = BSP_QSPI_Read(rx_buf, WRITE_READ_ADDR, 4);
if (status != QSPI_OK)
{
    JDEBUG_PRINTF("QSPI READ : FAILED.\r\n");
    goto qspi_end;
}
JDEBUG_PRINTF("QSPI READ : PASSED.\r\n");
JDEBUG_PRINTF("read result = %08X\r\n", rx_buf);
~~~

## 实验结果

实验结果符合预期:



## 总结

QSPI协议与SPI协议几乎相同。理解QSPI需要注意其5个状态的逻辑序列,其余的,对于我们软件编辑来说,几乎没有区别了。

周末做了QSPI协议的典型应用,周一上班项目的进度就有保证了。

各位小伙伴们,周末快乐^_^</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                               
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

Jacktang 发表于 2023-10-30 07:32

<p>周末做了QSPI协议的典型应用,周一上班项目的进度就有保证了,</p>

<p>休息工作两不误啊</p>

wangerxian 发表于 2023-10-30 18:29

<p>用CubeMX配置就是比较快,基本不用写什么代码,也能把一些难的外设配置成功。</p>

jobszheng5 发表于 2023-10-31 09:15

Jacktang 发表于 2023-10-30 07:32
周末做了QSPI协议的典型应用,周一上班项目的进度就有保证了,

休息工作两不误啊

<p>唉!人家slave端使用的自有协议!我TMD还是看时序图然后使用GPIO模拟的。</p>

<p><img height="53" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/sad.gif" width="54" /></p>

jobszheng5 发表于 2023-10-31 09:17

wangerxian 发表于 2023-10-30 18:29
用CubeMX配置就是比较快,基本不用写什么代码,也能把一些难的外设配置成功。

<p>它的HAL驱动有一定的示范作用。</p>
页: [1]
查看完整版本: [STM32F769IDISCO返场]QSPI协议也不难