EMMC 简介
EMMC:全称为 embedded MultiMedia Card,是一种嵌入式非易失性存储器系统,由Nand flash和Nand flash控制器组成。EMMC 则在其内部集成了Flash Controller,包括了协议、擦除均衡、坏块管理、ECC校验、电源管理、时钟管理、数据存取等功能。
EMMC 内部寄存器
EMMC里面的几个主要寄存器,如下表所示:
EMMC 通信协议
- CLK:这是设备的输入时钟,由主机提供的信号,在时钟到来的时候才可以发送接收命令和数据。在SDR模式下,一个时钟周期可以传输1位的信号。在DDR模式下,可以在一个时钟周期传输2位的信号。CLK的频率在0到最大的频率之间。
- CMD:它是双向传输的命令线,用于主机和设备的数据通信。它有开漏和推挽两种模式,分别用来应对初始化和应对快速的命令传输。它能够双向传输,当主机发送命令之后,设备会给主机应答,通过CMD线可以返回给主机。
- Reset:单向的复位信号线,是用主机发送的。
- DAT0~DAT7:EMMC的双向数据总线,用于主机和设备之间的数据通信。它工作在应对快速的命令传输的推挽模式。DAT线在某一时刻只能支持单向传输,只能被设备或EMMC HOST一方控制。默认下,当用户上电或者复位的时候,仅能用DAT0一根线传输数据。同时,用户可以自己配置想要使用的DAT线的数量,也可以选择4根或者8根。当用户选择4根时,EMMC设备会断DAT1-3的内部上拉,如果用户选择的是8根,那么同理会断开DAT1-7的上拉。
一般SD卡在接收到命令行,都会有一个应答(CMD0例外),这个应答我们也称之为响应。STM32的SDIO接口,支持2种响应类型:短响应(48位)和长响应(136位)。SD卡总共有6类响应(R1、R1b、R2、R3、R6、R7),我们这里以R1为例简单介绍一下。R1(普通响应命令)响应属于短响应,其长度为48位,如下表所示。在收到R1响应后,我们可以从SDIO_RESPCMD寄存器和SDIO_RESP1寄存器分别读出命令索引和卡状态信息。
EMMC 使用的是SDIO接口,SDIO总线上都是HOST端发起请求,然后DEVICE端回应请求,其中请求和回应中会包含数据信息: - Command:用于开始传输的命令,是由HOST端发往DEVICE端的,其中命令是通过CMD信号线传送的;
- Response:回应是DEVICE返回的HOST命令作为Command 的回应。也是通过CMD线传送的;
- Data:数据是双向传输的。可以设置为1线模式,也可以设置为4线模式或者8线模式。数据是通过DAT0~DAT7信号线传输的。
对于读命令,首先HOST会向DEVICE发送命令,紧接着DEVICE会返回一个握手信号,此时当HOST收到回应的握手信号后,会将数据放在4位的数据线上,在传送数据的同时会跟随着CRC校验码,CRC校验由硬件自动处理。单个数据块读的时候,在收到1个数据块以后即可以停止了,不需要发送停止命令(CMD12)。但是多块数据读的时候,EMMC卡将一直发送数据给主机,直到接到主机发送的STOP命令(CMD12)。
数据块写操作同数据块读操作基本类似,只是数据块写的时候,多了一个繁忙判断,新的数据块必须在SD卡非繁忙的时候发送。这里的繁忙信号由SD卡拉低SDIO_D0,以表示繁忙,SDIO硬件自动控制,不需要我们软件处理。
EMMC可供选择的速率模式:
EMMC接线
工作流程
初始化
1、 初始化EMMC管脚,按照默认参数设置SDIO,然后再用命令设置EMMC,再次设置SDIO(按照要求的规格设置)。EMMC支持的频率区间是 375000 ~ 96000000,刚开始使用375000HZ,设置1bit 访问EMMC。Muses 中EMMC 大小是4G,频率48MHZ。
a. 设置总线电压为1.8V
b. 设置48MHZ
c. 设置4bit的带宽
d. 设置SDR50模式
- MMC_CMD_GO_IDLE_STATE(0) 设置EMMC为空闲状态。
- MMC_CMD_SEND_OP_COND(1) 配置电源寄存器,查询EMMC Device 是否已经完成初始化,同时进行工作电压和寻址模式协商(是块操作还是字节操作)。
- MMC_CMD_ALL_SEND_CID(2) 获取CID寄存器,128位的设备识别寄存器,包括一个特有的设备识别号码,可以通过这个寄存器区分是哪家厂商的芯片。
- MMC_CMD_SET_RELATIVE_ADDR(3) 设置EMMC的地址,如果总线上挂在多个EMMC,就通过这个地址区分操作哪个设备。
- MMC_CMD_SEND_CSD(9) 获取 CSD寄存器。
- MMC_CMD_SELECT_CARD(7) 选择刚才设置的地址。
- MMC_CMD_SEND_TUNING_BLOCK(19) 测试写操作,写512字节。
- MMC_CMD_READ_TUNING_BLOCK(14) 测试读操作。
- MMC_CMD_SEND_EXT_CSD(8) 读取 EXT_CSD寄存器。
- MMC_CMD_SWITCH(6) 打开cache缓存。
EMMC读取数据
EMMC 写数据
数据擦除
读写速度测试
读写稳定性测试
固件升级方案
EMMC对外接口
EMMC 给fat32提供的接口在ff_gen_drv.c、ff_gen_drc.h中。
对外提供EMMC_Initialize、EMMC_Status、EMMC_Read、EMMC_Write、EMMC_loctl这5个接口。通过FATFS_LinkDriver这个函数把文件系统和驱动联系到一起。
MC_S32 FATFS_LinkDriver(const DiskioDrvTypeDef *drv,MC_U8 partNum)
参数1 drv 是所有操作接口;
参数2 partNum表示第几个分区。