eMMC5.1入门教程【1】eMMC简介与协议概览

news/2024/12/1 19:46:28/

目录

1 eMMC简介

1.1eMMC的外观图与引脚说明图

1.2eMMC的定义

1.3eMMC的基础操作

2 eMMC5.1协议

2.1 eMMC5.1协议文档的获取

2.2 eMMC的初始化

2.3 eMMC的读写

3 本专栏教程的目标

3.1 内容核心

3.2 教程安排



1 eMMC简介

通俗点说,eMMC就是一个存储芯片,就像SD卡一样,用于存取数据。从普通开发者角度看,只要遵循eMMC协议,就可以对eMMC芯片进行读写操作。(拓展:SD卡、UFS芯片、eMMC芯片、U盘都是类似的功能,从使用角度看,只是接口不同、通信协议不同,本教程只涉及目前最新的eMMC芯片,遵循eMMC5.1协议。)

1.1eMMC的外观图与引脚说明图

下图(图一)是网上搜索到的一款国产eMMC芯片(eMMC采用BGA封装):

eMMC芯片外观
图一 eMMC芯片外观

而关于其引脚定义,笔者也在网上找到一个图(图二):

eMMC引脚定义
图二 eMMC引脚定义图

 

其中,RFU 引脚暂无作用(RFU是 “Reserved for Future Use” 的缩写)

而关于其他引脚的作用,见下图图三(具体作用后续会详细描述):

注:图三出自eMMC5.1协议文档 第5.3章 (e•MMC Device Overview)

eMMC引脚说明图表
图三 eMMC引脚说明

                                                                 

特别说明的是DS引脚,也就是Data Strobe引脚,原文档描述为:

Data Strobe : This signal is generated by the device and used for output in HS400 mode.
The frequency of this signal follows the frequency of CLK. For data output each cycle of this signal
directs two bits transfer(2x) on the data - one bit for positive edge and the other bit for negative edge.
For CRC status response output and CMD response output (enabled only HS400 enhanced strobe
mode), the CRC status and CMD Response are latched on the positive edge only, and don't care on
the negative edge.
简单点说,就是这个引脚只有在HS400的速度模式下才被使用,后续讲到给eMMC调速度模式的时候会详述。目前只需要知道eMMC的速度模式分为SDR50、HS200、HS400,共三种。常用的速度为SDR50模式的26M、52M;HS200模式下的200M;HS400模式下的400M;更详细的如下图图四所示:
总线速度模式
图四 eMMC总线速度模式

 

关于eMMC总线的连线图如下图图五所示:
注:图五出自eMMC5.1协议文档 第10 章 (The e •MMC bus)
eMMC协议总线图
图五 eMMC总线连线图

1.2eMMC的定义

eMMC ,即:Embedded Multi Media Card 的缩写。由一个嵌入式存储解决方案组成,带有MMC接口、快闪存储器设备及主控制器。所有都在一个小型的BGA 封装。接口速度最高可达每秒400MBytes,其接口电压可以是1.8V或者是3.3V。(一般VCCQ 1.8V,VCC 3.3V)

注:eMMC的电压要求如下图图六所示,图六源自协议10.3.3章,其中,The VCCQ must be defined at equal to or less than VCC,也就是VCCQ的电压不可以比VCC大

eMMC电压要求
图六 eMMC电压要求

1.3eMMC的基础操作

对于一般的开发者,eMMC的基础操作包括:初始化操作(CMD0+CMD1+CMD2+CMD3+CMD7)、(多种速率的)读写操作、写保护操作、分区操作。

在此后的章节中将详细展开叙述。本篇为开篇简介与概览,故而只是简单介绍。

2 eMMC5.1协议

2.1 eMMC5.1协议文档的获取

如下链接,无需C币:

eMMC5.1协议文档(目录中重点章节已高亮)

2.2 eMMC的初始化

eMMC上电后,需要先初始化,才能进行后续的读写操作。

初始化的命令序列为:CMD0 发一次、CMD1发多次(直到返回值首位为1)、CMD2、CMD3、CMD7

以上的命令序列发送成功后,eMMC便进入了transfer模式,可进行读写等操作。

2.3 eMMC的读写

eMMC进入了transfer模式后,也就是初始化序列发送成功后,eMMC上盘成功,可进行读写操作。

普通的读写方式有两种:

(1)主控芯片先通过命令指定起始地址,再通过命令指定要传输的块数,然后发送数据;

(2)主控芯片先通过命令指定起始地址,开始发送数据,发完数据再发命令通知eMMC芯片结束读写操作。

后续章节将详细描述。

3 本专栏教程的目标

目标为:从普通开发者角度,描述清楚eMMC的常用功能,使得读者能对eMMC有一个较为全面的了解,并具备一些基本的开发能力。

3.1 内容核心

(1)eMMC芯片的引脚说明;

(2)eMMC芯片的初始化;

(3)eMMC芯片的读写操作;

(4)eMMC芯片的速度模式调整;

(5)eMMC芯片的分区操作;

(6)eMMC芯片的写保护操作。

3.2 教程安排

本教程篇幅计划15篇,其中:

第1-3篇为基础篇,涉及内容为本教程全部内容的简单描述,供入门与了解使用;

第4-5篇为初始化相关内容的专讲;

第6-8篇为读写操作的专讲,包括普通读写与打包读写;

第9-11篇为三种速度模式的专讲(SDR50、HS200、HS400);

第12-13篇为分区操作相关内容;

第13-14篇为写保护操作的相关内容;

第15篇为几个常用寄存器的专讲与全教程的总结

第16-17篇(如果有时间写的话)为命令队列 (CMDQ) 的相关内容

 

 

 

 


http://www.ppmy.cn/news/756908.html

相关文章

二 蓝牙低功耗(BLE)协议栈 之 LL层

一 链路层的状态 链路层定义了两个设备如何利用无线电传输信息。它包含了报文、广播、数据信道的详细定义,也规定了发现其他设备的流程、广播的数据、连接的建立、连接的管理以及连接中的数据传输。 链路层定义了5种状态: Standby,就绪态Advertising…

UHF超高频RFID纸质电子标签与树莓派通信

在物联网领域,我们经常听到 RFID 这个词,接下来讲解一下,什么是 RFID ? RFID 全称为 Radio Frequency Identification,中文称“射频识别”技术。 现实中,我们经常用到这一技术的应用,比如门禁…

CC2640R2F BLE5.0 链路层(LL)空中包格式

空中包格式 BLE5.0链路层(LL)的空中包格式非常简单,它所有的空中包都遵循下图所示的格式: 由上图可见,BLE空中包由4个部分组成,他们分别是: 前导码(Preamble)访问地址(Access Address)链路层协议数据单元(Link Layer P…

科研汪的日常--“键皇”,静电容的又一座高峰(REALFORCE RFU联名版开箱)

REALFORCE RFU联名版开箱 如果你问我,作为一名程序员,是否应该拥有一把机械键盘,我的回答是“是的!” 如果你问我,作为一名上班的程序员,但又是键盘控,该使用什么键盘,我的回答是“…

Apollo坐标系转换

文章目录 RFU和FLU的关系右-前-天坐标(RFU)前-左-天坐标(FLU)欧拉角Pitch、Yaw、Roll坐标系转换计算IMU转World示例代码IMU转FLU坐标系其他坐标转换rslidar-->FLUrslidar-->world参考文章矩阵旋转的讲解RFU和FLU的关系 ​ IMU输出的是一个角速度,加速度之类的东西,是…

自车坐标系下的物体相对和绝对位置和速度计算

自车坐标系与绝对坐标系的速度位置换算原理 自车坐标系坐标系--右-前-天坐标(RFU)坐标系--前-左-上(FLU) 位置换算速度换算示意图情形一情形二 小结参考 自车坐标系 自车坐标系,也叫车身坐标系,通常有一下两种常用定义…

线性代数课程、书籍推荐

线性代数课程、书籍推荐 1 介绍1.1 背景1.2 教材回顾1.3 推荐学习课程 2 公式查找其他数学入门经典书籍 参考 1 介绍 1.1 背景 工作中涉及线性代数越来越多,然后开一篇博客补一下知识点。 1.2 教材回顾 大学用的同济版教材,当时学的不好,教…

爬虫入门04——requests库中的User-Agent请求头

import requests#定义请求的url url https://www.baidu.com/ #https://site.ip138.com/www.xicidaili.com/#发起get请求 res requests.get(url url)#获取响应结果#响应对象 print(res)#获取响应状态码 print(res.status_code)#获取响应数据 print(res.text) #返回的是字符…