理解ESP32 Flash烧写的DOUT/DIO/QOUT/QIO配置

一、目的

        刚接触ESP32开发的同学如果不是使用Ubuntu进行烧写的话,可能在使用乐鑫的Flash烧写工具时可能会有这样的疑问

        Flash工具下载地址

        工具 | 乐鑫科技 (espressif.com.cn)https://www.espressif.com.cn/zh-hans/support/download/other-tools

        

        上图中的SPI Mode如何选择,到底什么意思呢?

        另外在Ubuntu下开发时,我们执行下面两条命令时

idf.py set-target esp32
idf.py menuconfig

命令行界面会弹出一个菜单,如下

  

        注意上图中Flash SPI mode选项

        这边就是我们可以选择的mode配置项 

下面的截图的是ESP32S3芯片上的,增加了一个QPI选项

        其实要搞清楚这个,需要的基础知识还是蛮多的,本篇就给大家讲解一下里面涉及到的知识点。

        关于乐鑫Flash工具如何使用,官方工具包里面有对应的使用文档,后面我会结合具体的例子给大家讲解下。

        需要特别注意的是DoNotChgBin这个选项,因为我们编译固件时候已经通过menuconfig进行过Flash相关配置,故我们编译出来的固件里面已经有了设定的信息,所以稍写工具其实就不用再设置了。

        另外需要注意的是每个ESP32模组并不是都是同时支持这些SPI Mode的,有些可能是因为使用的Flash本身不支持,有些可能是Flash本身的WP/HOLD这些引脚并没有接到模组上,使用时一般建议DIO或者DOUT,如果明确知道模组的信息,就选择其最优的配置。

        当然并不是说QIO一定比DIO快,时钟频率的设置也是一个重要项。

二、介绍

        要理解DOUT/DIO/QOUT/QIO这些含义,首先需要了解SPI/Dual SPI/Quad SPI/QPI这些知识点,请参考这篇博文(一定要看

        理解SPI/Dual SPI/Quad SPI/QPI之间的区别_coder.mark的博客-CSDN博客https://blog.csdn.net/tianizimark/article/details/124608851

        乐鑫官网的资料

        SPI Flash Modes - ESP32 - — esptool.py latest documentation (espressif.com)https://docs.espressif.com/projects/esptool/en/latest/esp32/advanced-topics/spi-flash-modes.html#spi-flash-modes 

三、实战

        有了上面的知识点后,我们再来看下esp-idf里面关于Flash SPI mode的配置项

        查看文件components/hal/include/hal/spi_flash_types.h

    SPI_FLASH_SLOWRD 标准SPI,对时钟速度有限制(速率较慢)
    SPI_FLASH_FASTRD 标准SPI
    SPI_FLASH_DOUT 双线SPI(Dual SPI)只在数据阶段使用两根数据线通信
    SPI_FLASH_DIO 双线SPI(Dual SPI)地址、数据阶段都使用两根数据线通信
    SPI_FLASH_QOUT 四线SPI(Qual SPI)只在数据阶段使用四根数据线通信
    SPI_FLASH_QIO 四线SPI(Qual SPI)地址、数据阶段使用四根数据线通信
    SPI_FLASH_OPI_STR 四线SPI(Qual SPI)命令、地址、数据阶段(所有阶段)都使用四根数据线通信,并且一个时钟传输一位
    SPI_FLASH_OPI_DTR 四线SPI(Qual SPI)命令、地址、数据阶段(所有阶段)都使用四根数据线通信,并且一个时钟传输两位

        好,本篇的内容基本结束,相信大家现在都能理解这些选项的含义了。

  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DOUT、DIO、QOUT和QIOSPI闪存芯片的四种不同的接口模式。其中,DOUT和QOUT是输出模式,DIOQIO是双向模式。这些模式的选择取决于具体的应用场景和性能需求。 DOUT模式下,数据从主设备输出到闪存器件,闪存器件的输出数据也是从单个数据线上输出。DIO模式下,数据可以在单个数据线上进行双向传输,但是在传输过程中需要切换数据线的输入输出方向。QOUT模式下,数据从主设备输出到闪存器件,闪存器件的输出数据是从四个数据线上同时输出。QIO模式下,数据可以在四个数据线上进行双向传输。 以下是四种模式的示例代码: DOUT模式: ```python import spidev spi = spidev.SpiDev() spi.open(0, 0) spi.mode = 0b00 spi.max_speed_hz = 1000000 address = 0x00 data = [0x01, 0x02, 0x03, 0x04] spi.xfer2([0x02, (address >> 16) & 0xff, (address >> 8) & 0xff, address & 0xff]) spi.xfer2(data) ``` DIO模式: ```python import spidev spi = spidev.SpiDev() spi.open(0, 0) spi.mode = 0b11 spi.max_speed_hz = 1000000 address = 0x00 data = [0x01, 0x02, 0x03, 0x04] spi.xfer2([0x02, (address >> 16) & 0xff, (address >> 8) & 0xff, address & 0xff]) spi.xfer2(data) ``` QOUT模式: ```python import spidev spi = spidev.SpiDev() spi.open(0, 0) spi.mode = 0b01 spi.max_speed_hz = 1000000 address = 0x00 data = [0x01, 0x02, 0x03, 0x04] spi.xfer2([0x6b, (address >> 16) & 0xff, (address >> 8) & 0xff, address & 0xff]) spi.xfer2(data) ``` QIO模式: ```python import spidev spi = spidev.SpiDev() spi.open(0, 0) spi.mode = 0b10 spi.max_speed_hz = 1000000 address = 0x00 data = [0x01, 0x02, 0x03, 0x04] spi.xfer2([0xeb, (address >> 16) & 0xff, (address >> 8) & 0xff, address & 0xff]) spi.xfer2(data) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值