[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> <p>周末做了QSPI协议的典型应用,周一上班项目的进度就有保证了,</p>
<p>休息工作两不误啊</p>
<p>用CubeMX配置就是比较快,基本不用写什么代码,也能把一些难的外设配置成功。</p>
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>
wangerxian 发表于 2023-10-30 18:29
用CubeMX配置就是比较快,基本不用写什么代码,也能把一些难的外设配置成功。
<p>它的HAL驱动有一定的示范作用。</p>
页:
[1]