7-1_MSPI_NANDFLASH SDK例程详解

2023-09-21 10:39:53

1.代码示例路径

PRJ_M66_4.3.3\boards\apollo4l_blue_eb\examples\interfaces\mspi_ds35x1ga_quad_example\src\mspi_ds35x1ga_quad_example.c

本文中主要讲解初始化流程内容

2.MSPI通信示意图

SCK(Serial Clock):串行时钟,用于同步数据传输。主设备通过控制SCK的上升沿和下降沿来确定数据传输时机。

CS(Chip Select):片选信号,用于选择要与主设备通信的从设备。当CS被拉低时,表示当前从设备被选中,可以进行数据传输。

WP(Write Protect):WP引脚用于写保护控制。当WP引脚处于高电平时,NAND Flash芯片的写操作将被禁止,即无法对芯片进行写入操作,保护数据的安全性。当WP引脚处于低电平时,芯片可以进行正常的写入操作。

HOLD:HOLD引脚用于暂停NAND Flash的操作。当HOLD引脚处于低电平时,芯片会暂停当前的操作,但会保持状态和数据。这在某些情况下非常有用,例如当需要处理其他优先级更高的任务时,可以通过将HOLD引脚拉低来暂停芯片的操作,等到任务完成后再恢复操作。

D0-D7:数据传输总线,基于不同的外设需要配置不同的数量的通路进行传输。

3.开发板硬件信息

(1)本实验基于Apollo4BlueLite EB板进行调试的,注意调整拨码开关如下图所示:

(2)Apollo4BlueLite有3组MSPI控制器,在该示例中采用了Apollo4BlueLite芯片的MSPI2和nandflash进行通信。引脚定义如下图所示

#define AM_BSP_GPIO_MSPI2_SCK    82 
#define AM_BSP_GPIO_MSPI2_CE0    91 
#define AM_BSP_GPIO_MSPI2_D0     74
#define AM_BSP_GPIO_MSPI2_D1     75 
#define AM_BSP_GPIO_MSPI2_D2     76 
#define AM_BSP_GPIO_MSPI2_D3     77 
#define AM_BSP_GPIO_NAND_FLASH_WP 76 
#define AM_BSP_GPIO_NAND_FLASH_HOLD 77

(3)该示例中采用了东芯厂家的nandflash,型号为ds35x1ga,芯片信息可以参考下图中命名规则得到。

4.例程分析

(1)例程运行log如下:

MSPI NAND Flash Driver example @ 48 MHz, Mode: QUAD 1-1-4 !

Vendor Name: AMBQ

Device type: Apollo4 Lite

Starting MSPI SDR Timing Scan for MSPI2:

Configure the MSPI and Flash Device correctly!

NAND flash ID is 0xefba!

block 4 erase status 0x0!

page 256 write status 0x0!

page 256 read status 0x0!

page 256 read ECC status 0x0!

succeed and read data equals to the write data

从运行log可以看到MSPI运行时钟配置为48MHz(当前nandflash支持的最大时钟频率为104MHz)

配置模式为AM_HAL_MSPI_FLASH_QUAD_CE0_1_1_4

(2)构造测试数据

代码开始构造了2048字节的测试数据和64字节的OOB buffer(这是根据使用的nandflash设备端构造的)

■ PAGE READ / PROGRAM- (2048+64 spare) byte

(3)初始化

  • am_devices_mspi_ds35x1ga_init

初始化MSPI2,初始化配置参数如下:

这里默认配置eClockFreq为48MHz,AM_HAL_MSPI_FLASH_QUAD_CE0_1_1_4(这里1_4_4表示1线发送cmd,4线发送address,4线发送data)

const am_devices_mspi_ds35x1ga_config_t MSPI_Quad_Flash_Config =

{

.eDeviceConfig = AM_HAL_MSPI_FLASH_QUAD_CE0_1_1_4,

.eClockFreq = MSPI_TEST_CLKFREQ,

.pNBTxnBuf = DMATCBBuffer,

.ui32NBTxnBufLength = (sizeof(DMATCBBuffer) / sizeof(uint32_t)),

.ui32ScramblingStartAddr = 0,

.ui32ScramblingEndAddr = 0,

};
  • am_hal_mspi_initialize

初始化一个pMspiHandle的数据结构

  • am_hal_mspi_power_control

使能MSPI电源控制

  • am_hal_mspi_configure

主要配置了MSPI XIP功能的相关配置,这里默认是关闭XIP功能的。同时还检查了DMA transfer buffer

  • am_hal_mspi_device_configure

通过该函数配置MSPI Device,这里首次将MSPI Device配置为串行模式

  • am_hal_mspi_enable

使能MSPI模块,包括初始化MSPI的command queue

  • am_bsp_mspi_pins_enable

根据外围存储设备的类型设置MSPI pin,这里配置AM_HAL_MSPI_FLASH_SERIAL_CE0模式,如下图配置

  • am_devices_mspi_ds35x1ga_wp_hold_pinconfig

配置MSPI2的WP和HOLD管脚,使用4线传输数据时WP和SIO2引脚复用,HOLD和SIO3引脚复用

  • am_devices_mspi_ds35x1ga_reset

发送复位指令给nandflash,根据下表只需要发送复位指令0xFF给device即可

FUNCTION

Command Code

Address Bytes

Dummy Bytes

Data Bytes

Comments

RESET

FFh

0

0

0

Reset the device

  • am_device_init_flash

该接口通过发送set feature和get feature指令来实现对nandflash的初始化,具体实现需要根据不同厂商的flash来确定

  • am_hal_mspi_disable

MSPI disable,包括disable Command Queue,复位Command queue。这里是为了重新配置MSPI做准备

  • am_hal_mspi_device_configure

在这里重新配置了MSPI Device为AM_HAL_MSPI_FLASH_QUAD_CE0_1_1_4模式

  • am_hal_mspi_enable

重新使能MSPI,主要是对command queue的初始化

  • am_bsp_mspi_pins_enable

在这里配置MSPI PIN为AM_HAL_MSPI_FLASH_QUAD_CE0_1_1_4,可以看到这里设置了4根数据线

  • am_hal_mspi_interrupt_clear
  • am_hal_mspi_interrupt_enable

清除MSPI中断再使能相应的中断,这里主要配置了CQUPD中断和MSPI的ERR相关中断

(4)read ID

  • am_devices_mspi_ds35x1ga_enter_command_mode

进入到指令模式,主要是需要对配置mspi为串口模式进行指令发送,另外需要注意这里会配置MSPI CLK为4MHz

  • am_devices_mspi_ds35x1ga_command_read

发送read ID指令,在函数中会通过查询CTRL寄存器状态bit的方式,阻塞等待指令执行完成并拿到对应的2byte的device ID

指令结构如下

FUNCTION

Command

Code

Address

Bytes

Dummy

Bytes

Data

Bytes

Comments

READ ID

9Fh

0

1

2

Read device ID

  • am_devices_mspi_ds35x1ga_exit_command_mode

退出指令模式,配置MSPI为4线模式

更多推荐

Oracle,高斯创建自增序列

某些时候,需要获取到一个自增值然后点击左下Apply也可以通过SQL语句执行dual在Oracle中是张虚拟表,通常用于执行这样的查询Oracle中查询语句:select序列名.nextvalfromdual在高斯数据库中:查询是selectmy_sequence.nextval不需要加formxxx例如:Oracle

JVM 第一章:Java运行时数据区

目录一.了解JVM1.1什么是JVM1.2JRE/JDK/JVM1.3JVM的整体结构二.Java运行时数据区2.1程序计数器(PC寄存器)2.2Java虚拟机栈(JavaVirtualMachineStacks)2.2.1栈帧的组成2.2.2问题辨析2.2.3逃逸分析①栈上分配②标量分析③同步消除2.2.4内存溢出2

IP代理与加速器:理解它们的区别与共同点

目录一、IP代理的基本概念与作用1、IP代理的定义2、IP代理的作用二、加速器的基本概念与作用1、加速器的定义2、加速器的作用三、IP代理与加速器的异同点1、相同点2、不同点四、都有什么优缺点五、各自在什么场合下使用六、该怎么选择总结在互联网的汪洋大海中,我们有时会遇到各种网络问题,如地区限制、网络延迟、封锁等。这时,

网页订货系统的诸多优势|企业APP订单管理软件

1.订单信息,发货信息,账目信息一目了然生产企业(总代理)和分销商之间可以清楚直观的了解到商品和货款的实时状态,以便高效的订货,发货,进行货款催收以及商品的物流跟踪。2.建立稳固的客户关系,避免客户被竞争对手挖墙脚有了网上订货系统,企业(总代理)和分销商之间的联系更加紧密,账目更加清晰,客户信任度和忠诚度大大提升,有效

单片机操作系统,按键与FIFO

前言1.之前做按键,在中断判断并进入回调函数,但是经常会导致其他任务来不及处理,或者是按键触发了但没有执行回调,即用户操作时感觉按键失灵。2.这里更新了一下代码,思路是这样的:中断进入按键扫描,有消抖,不阻塞,如果按键事件触发时即入列,然后操作系统每隔10ms进行一次轮询,若队列不为空,则出列并执行按键回调。有纰漏请指

AI AIgents时代-(四.)应用上手

HuggingGPT&MetaGPT.🟢HuggingGPTHuggingGPT是一个多模型调用的Agent框架,利用ChatGPT作为任务规划器,根据每个模型的描述来选择HuggingFace平台上可用的模型,最后根据模型的执行结果生成总结性的响应。这个项目目前已在Github上开源,并且有一个非常酷的名字叫做JA

python经典百题之统计字符数

题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。方法一:str_input=input("请输入一行字符:")count_letter,count_space,count_digits,count_other=0,0,0,0forcharinstr_input:ifchar.isalpha():

文举论金:黄金原油全面走势分析策略指导。

市场没有绝对,涨跌没有定势,所以,对市场行情的涨跌平衡判断就是你的制胜法宝。欲望!有句意大利谚语:让金钱成为我们忠心耿耿的仆人,否则,它就会成为一个专横跋扈的主人。空头,多头都能赚钱,唯有贪心不能赚。是你掌控欲望还是欲望掌控你?古人云:不积硅步无以至千里,不积小流无以成江海。希望这句话成为我们之间的共勉。自知!人贵自知

乐观锁与悲观锁

概述悲观锁总会假设最坏的情况,乐观锁总会假设最好的情况。悲观锁和乐观锁最终都是为了保证线程的安全,避免在并发场景下的资源竞争问题,但是,相对于乐观锁,悲观锁对性能的影响更大!悲观锁共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其他线程。高并发的场景下,激烈的锁竞争会造成线程阻塞,大量阻塞线程会导致系统

Python从入门到放弃系列教程01

Python从入门到放弃系列教程01第一章01初识PythonPython的起源1989年,为了打发圣诞节假期,吉多·范罗苏姆(龟叔)决定开发一个新的解释程序(Python雏形),1991年,第一个Python解释器诞生;之所以选中单词Python(意为大蟒蛇)作为该编程语言的名字,是因为英国20世纪70年代首播的电视

AndroidStudio 安装与配置【安装教程】

1.下载软件进入官网https://developer.android.google.cn/studio,直接点击下载2.阅读并同意协议书直接下滑至最底部如果这里出现了无法访问官方地址:https://redirector.gvt1.com/edgedl/android/studio/install/2022.3.1.

热文推荐