7-1_MSPI_NANDFLASH SDK例程详解

news2025/1/10 19:04:24

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线模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1030706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web:[HCTF 2018]WarmUp

题目 点进页面&#xff0c;页面只有一张滑稽脸&#xff0c;没有其他的提示信息 查看网页源代码&#xff0c;发现source.php&#xff0c;尝试访问一下 跳转至该页面&#xff0c;页面显示为一段php代码&#xff0c;需要进行代码审计 <?phphighlight_file(__FILE__);class emm…

BCC源码下载

接前一篇文章&#xff1a;BCC介绍 1. GitHub地址 上一篇文章中已提到&#xff0c;BCC的github地址是&#xff1a;https://github.com/iovisor/bcc。 页面如下所示&#xff1a; 2. 源码下载 打开终端&#xff0c;创建好要存放BCC源码的目录&#xff0c;进入此目录。 然后&…

【计算机网络】——传输层

//图片取自王道&#xff0c;仅做交流学习 一、传输层提供的服务 物理层、数据链路层、网络层是通信子网。 传输层&#xff1a;它属于面向通信部分的最高层&#xff0c;同时也是用户功能的最低层 为应用层提供通信服务使用网络层的服务 网络层提供主机之间的逻辑通信。 1、传输…

go sync.Map包装过的对象nil值的判断

被sync.Map包装过的nil 对象&#xff0c;是不能直接用if xxx nil的方式来判断的 func testnil() *interface{} {return nil }func main() {var ptr *interface{}test : testnil()//p &Person{}fmt.Printf("ptr 的值为 : %v\n", ptr)fmt.Printf("ptr 的值…

控价与数据分析的关系

品牌在做线上控价时&#xff0c;会面对许多的数据&#xff0c;如店铺数据、行业数据&#xff0c;当这些数据仅仅只是拿来做监测低价输出低价报表使用&#xff0c;是没有发挥其最大作用的&#xff0c;因为商品链接的字段较丰富&#xff0c;涉及的内容会包含销量、评价量、促销信…

pytorch环境搭建到pycharm项目映射配置(成功后回顾性记录/自用)

利用Anaconda创建pytorch虚拟环境 前提&#xff1a;成功安装Anaconda&#xff0c;确保可以打开NVIDIA控制面板 开始-》搜索“Anaconda Prompt” 打开后输入&#xff1a;conda create -n 你的虚拟环境名 python3.9。输入y&#xff0c;继续安装&#xff0c;完成。 输入&#…

容器适配器

除了顺序容器外&#xff0c;标准库还定义了三个顺序容器适配器&#xff1a;stack、queue和priority_queue适配器。适配器是标准库中的一个通用概念。容器、迭代器和函数都有适配器。适配器本质上是一种机制&#xff0c;能使某种事物的行为看起来像另外一种事物一样。 所有容器…

C++笔记之尾置返回类型(trailing return type)

C笔记之尾置返回类型(trailing return type) 文章目录 C笔记之尾置返回类型(trailing return type)1.尾置返回类型的一些示例用法2.尾置返回类型对泛型编程的好处3.尾置返回类型通常在以下情况下派上用场4.既然auto可以自动类型推断&#xff0c;那为什么还需要尾置返回类型&…

微调大型语言模型(一):为什么要微调(Why finetune)?

今天我们来学习Deeplearning的在线课程 微调大型语言模型(一)的第一课&#xff1a;为什么要微调(Why finetune)。 我们知道像GPT-3.5这样的大型语言模型(LLM)它所学到的知识截止到2021年9月&#xff0c;那么如果我们向ChatGPT询问2022年以后发生的事情&#xff0c;它可能会产生…

K8S-Pod 进阶

Pod 进阶 一、资源限制&#xff08;业务cpu 内存&#xff09;1.定义2.Pod 和 容器 的资源请求和限制3.CPU 资源单位4.内存 资源单位5.示例 二、健康检查&#xff1a;又称为探针&#xff08;Probe&#xff09;1.定义2.探针的三种规则&#xff1a;3.Probe支持三种检查方法4.示例 …

一位autosar开源爱好者(非本博主)

https://github.com/autoashttps://github.com/autoas该爱好者 Email&#xff1a; paraifoxmail.com 另外在https://club.rt-thread.org/ask/question/a124ee65268bed5f.html 汽车电子嵌入式操作系统符合Autosar规范的静态os&#xff1a;GaInOS 发布于 2013-01-03 22:09:11 …

vite + vue3 + js 搭建组件库 + 核心配置与使用

vite.config.js 这个官网有写 import { defineConfig } from vite import vue from vitejs/plugin-vue import path from "path" // https://vitejs.dev/config/ export default defineConfig({plugins: [vue()],server:{open:true, //自动打开浏览port:8088 //默认…

「大数据-0」虚拟机VMware安装、配置、使用、创建大数据集群教程

目录 一、下载VMware Wworkstation Pro 16 二、安装VMware Wworkstation Pro 16 三、检查与设置VMware的网卡 1. 检查 2. 设置VMware网段 四、在VMware上安装Linux虚拟机 五、对安装好的虚拟机进行设置 1. 打开设置 2. 设置中文 3. 修改字体大小 4. 修改终端字体大小 5. 关闭虚…

机器学习(18)---朴素贝叶斯

朴素贝叶斯 一、概述1.1 概率分类器1.2 贝叶斯工作原理1.3 贝叶斯的性质 二、sklearn中的朴素贝叶斯2.1 贝叶斯分类器2.2 高斯朴素贝叶斯GaussianNB2.3 探索贝叶斯&#xff1a;高斯朴素贝叶斯擅长的数据集2.4 探索贝叶斯&#xff1a;高斯朴素贝叶斯的拟合效果与运算速度 一、概…

Three.js 实现导出模型文件(.glb,.gltf)功能 GLTFExporter

Three.js提供了导出&#xff08;.glb,.gltf&#xff09;文件的API GLTFExporter 用于实现场景内容导出模型文件的功能 导出模型文件主要使用 parse 方法&#xff0c;该方法接收三个参数&#xff1a; 1.scene&#xff1a;要导出的场景对象。 2.onComplete&#xff1a;解析完成…

Deformable DETR(2020 ICLR)

Deformable DETR&#xff08;2020 ICLR&#xff09; detr训练epochs缩小十倍&#xff0c;小目标性能更好 Deformable attention 结合变形卷积的稀疏空间采样和Transformer的关系建模能力 使用多层级特征层特征,不需要使用FPN的设计&#xff08;直接使用backbone多层级输出&a…

cgroup version jdk version k8s

bug info: in centos, linux 3.10, cgroup:v1, service works well. in ubuntu 22.04 LTS, linux 5, systemd:v2, service is always crash on boot, or running some minutes then killed by OOM. deploy.yaml文件相关内容: specify limits:memory 1000M in yaml, killed …

区域气象-大气化学在线耦合模式(WRFChem)在大气环境领域实践技术应用

随着我国经济快速发展&#xff0c;我国面临着日益严重的大气污染问题。近年来&#xff0c;严重的大气污染问题已经明显影响国计民生&#xff0c;引起政府、学界和人们越来越多的关注。大气污染是工农业生产、生活、交通、城市化等方面人为活动的综合结果&#xff0c;同时气象因…

Redis缓存相关问题

目录 缓存穿透 缓存雪崩 缓存击穿 Redis集群方案 主从复制Replication 哨兵sentinel 高可用介绍 Redis sentinel介绍 Redis sentinel使用 配置sentinel 启动sentinel 测试sentinel Redis内置集群cluster Redis cluster介绍 哈希槽方式分配数据 Redis cluster的…

ubuntu18.04 编译edk2项目下的intel架构bios

看了国内的edk2编译文章. 大不部分都是编译 用于虚拟机(qemu)或者模拟器上运行的 很少有编译edk2项目 出 真机的 bios 希望本文章对你有帮助, 请注意 github,com因为被墙了. 所有需要用gitee代替 参考来源 https://gitee.com/binout/edk2-platforms/tree/master https:/…