美文网首页协议学习
MPC5748G : eMMC调试笔记

MPC5748G : eMMC调试笔记

作者: yuan6441952 | 来源:发表于2018-10-29 18:16 被阅读0次

    开发板:

    开发板

    原理图:

    eMMC原理图

    开发工具:S32 Design Studio for Power Architecture

    调试内容:MPC5748G通过SDHC模块读写eMMC

    eMMC:

            嵌入式多媒体卡 (Embedded Multi Media Card)是MMC协会订立、主要针对手机或平板电脑等产品的内嵌式存储器标准规格。eMMC在封装中集成了一个控制器,提供标准接口并管理闪存。eMMC的应用是对存储容量有较高要求的消费电子产品。

            带有MMC(多媒体卡)接口、快闪存储器设备及主控制器。所有都在一个小型的BGA 封装。接口速度高达每秒52MBytes,eMMC具有快速、可升级的性能。同时其接口电压可以是1.8v 或者是3.3v。

    SDHC:

            MPC5748G支持一个超安全数字主机控制器(uSDHC:ultra Secure Digital Host Controller)模块,uSDHC提供主系统与SD/SDIO/ MMC卡通信的接口。uSDHC充当桥梁的作用,以发送命令的方式,通过主机总线传输到SD/SDIO/ MMC卡中,执行数据访问(读写操作),它遵循SD/SDIO/MMC卡的传输协议。

    注意:为了 uSDHC 外部接口的正常运行,uSDHC_VEND_SPEC [ CMD_OE_PRE_EN ]  【Vendor Specific Register :此寄存器包含供应商特定的控制/状态寄存器位应该被编程为 1 。

    设备寄存器的特定复位值如下表所示:

    uSDHC_BLK_ATT:Block Attributes (uSDHC_BLK_ATT),这个寄存器用于配置数据块的数量每一块的字节数

    uSDHC_PRES_STATE:Present State (uSDHC_PRES_STATE),该只读寄存器获得uSDHC的状态。当一个数据发送期间,DAT lines 处于忙状态,主驱动可以发送 CMD0, CMD12, CMD13 (for memory)  和 CMD52 (for SDIO)。这些命令能够被发送,当 Command Inhibit (DAT)【命令抑制位,uSDHC_PRES_STATE[CIHB]:如果此状态位为0,则表示CMD线未使用,uSDHC可以使用CMD线发出SD/MMC命令。在写入传输类型寄存器Command Transfer Type (uSDHC_CMD_XFR_TYP)后立即设置此位。当接收到命令响应时,此位被清除。即使这个Command Inhibit (DAT) 【CDIHB】被设置为 1,仅仅 CMD 线能用于发送命令(如果该位为0)。

    打开调试工程:

    安装完成开发工具:S32DS_Power_Win32_v2017.R1_b171019.exe

    1、双击打开开发工具:

    软件开发环境

    2、打开File --> New --> S32DS Project  from Example,选择如下工程。

    选择调试工程

    3、打开SDHC调试工程如下:

    打开调试工程

    一、配置SDHC工程:

    1、配置SDHC的引脚

    配置引脚信息

    2、配置SDHC时钟

    配置时钟

    3、配置uSDHC参数信息

    配置uSDHC参数信息

    二、SDHC  Pads  初始化:

    代码截图

    1、设置 Pins Output Buffer:

    (1) 调用接口描述

    调用接口一 调用接口二

    (2) 寄存器描述

    MSCR(Multiplexed Signal Configuration Register):多路信号配置寄存器,选择哪一个信号源连接到寄存器相关联的目的地,即这是一个芯片引脚,是或可以配置为一个输出。对于相关联的芯片引脚目的地,该寄存器也可以指定这个引脚的电气属性。

    MSCR pin connection 

    MSCR 寄存器中的字段根据其关联的目的地(芯片引脚)变化而变化。 对于 芯片引脚 的 MSCR 寄存器分配,引脚类型,APC (Analog Pad Control)支持,SSS(Source Signal Select)等等。这个寄存器只支持32位访问。字节和半字写访问不支持。

    注:参见I/O信号描述和输入多路复用附属于 MPC5748GRM 手册的表格(excel文件)。

    I/O信号描述和输入多路复用 excel文件  位置 寄存器描述,具体看芯片手册

    2、设置 Pins Input Buffer:

    (1) 调用接口描述

    调用接口一 调用接口二

    (2) 寄存器描述

    IMCR(Input Multiplexed Signal Configuration Register):输入多路复用信号配置寄存器,选择哪一个信号源连接到寄存器相关联的目的地,即这是一个内部模块端口(internal module port),是或可以配置为一个输入。

    IMCR module-port connection

    IMCR 寄存器中的字段根据其关联的目的地(module port)变化而变化,对于 IMCR 的分配和SSS (Source Signal Select)的值参见I/O信号描述和输入多路复用表。

    寄存器描述,具体看芯片手册

    3、设置 Pins Pull 选择:

    (1) 调用接口描述

    调用接口一 调用接口二

    (2) 寄存器描述见以上描述

    三、SDHC  初始化:

    SDHC  初始化代码截图

    1、uSDHC 初始化代码解析:

    (1)去初始化:调用接口  uSDHC_DRV_Deinit();

    去初始化接口 启用所有自动关闭功能 VEND_SPEC寄存器关闭时钟的位描述 配置 uSDHC 交换的字节 GPR_CTL寄存器中 USDHC_BS位的描述 禁止所有状态和信号中断,mask=0xFFFFFFFF 禁止 uSDHC 中断

     (2)uSDHC驱动初始化:调用接口  uSDHC_DRV_Init();     

    /* Reset  uSDHC. */

    Reset  uSDHC SYS_CTRL寄存器中的RSTD、RSTC、RSTA位描述

    /* Configures the usdhc protocol */

    Configures the usdhc protocol   PROT_CTRL寄存器中 EMODE、D3CD位描述 PROT_CTRL寄存器中 DMASEL 位描述

    /* Disable all clock auto gated off feature because of DAT0 line logic(card buffer full status) can't be updated correctly when clock auto gated off is enabled. */

    禁止时钟自动关闭特性 VEND_SPEC寄存器关闭时钟的位描述 配置 uSDHC 交换的字节 使能中断 需要使能的错误中断 使能中断函数 INT_STATUS_EN 寄存器对应发送中断位描述 INT_STATUS_EN 寄存器对应 command 错误中断位描述   INT_STATUS_EN 寄存器对应 data 错误中断位描述 INT_SIGNAL_EN 寄存器对应发送位描述 INT_SIGNAL_EN 寄存器对应 command 错误中断位描述  INT_ SIGNAL _EN 寄存器对应 data 错误中断位描述 使能 DMA 中断 INT_STATUS_EN 寄存器 DMAESEN 中断位描述   INT_STATUS_EN 寄存器 DINTSEN 中断位描述  INT_SIGNAL _EN 寄存器 DMAEIEN 中断位描述   INT_ SIGNAL _EN 寄存器 DINTIEN 中断位描述 使能 uSDHC 中断 INT_SYS_EnableIRQ 函数描述

    四、eMMC  初始化:

    1、判断 eMMC卡是否插入:

    读取 uSDHC_PRES_STATE 寄存器中的  CINST 位,判断卡是否插入。

    uSDHC_PRES_STATE 寄存器中 CINST  位描述

    2、如果 eMMC卡插入,则初始化eMMC卡:

    (1)设置 uSDHC 的总线时钟为 400KHZ

    1)首先得到系统时钟:srcClock  ( 例如设置的系统时钟为 40MHZ = 40 000 000 HZ )

    2)禁用 uSDHC时钟。在更改 eMMC  时钟频率之前,应该禁用它。

    uSDHC_VEND_SPEC[ FRC_SDCLK_ON ] = 0;

    3)求 prescaler divisor 的大小。

    Clock Frequency = (srcClock  ) / (prescaler x divisor)

    例如:Clock Frequency = 400 000 hz;srcClock  =  40 000 000 HZ

    即:prescaler x divisor = 100

    参照 MPC5748G数据手册,可知:prescaler <=256;divisor <=16

    并且,在单数据速率模式下,prescaler 只允许以下设置:

    • 80h) Base clock divided by 256

    • 40h) Base clock divided by 128

    • 20h) Base clock divided by 64

    • 10h) Base clock divided by 32

    • 08h) Base clock divided by 16

    • 04h) Base clock divided by 8

    • 02h) Base clock divided by 4

    • 01h) Base clock divided by 2

    • 00h) Base clock divided by 1

    所以,设置 divisor =16 时,求出 prescaler =100/16=6.25,按照上面分析,prescaler =8;当 prescaler =8 时,divisor = 100/8=12.5,约等于13。

    即:uSDHC_SYS_CTRL[SDCLKFS]=prescaler >>1;

            uSDHC_SYS_CTRL[DVS]=divisor-1;

    同时,设置 Data Timeout Counter Value:  uSDHC_SYS_CTRL[DTOCV]=0x0E;

    注:详细 uSDHC_SYS_CTR L描述请见手册。

    4)等待 eMMC 卡的时钟稳定。

    while ( uSDHC_PRES_STATE SDSTB ] == ){  };

    uSDHC_PRES_STATE寄存器中 SDSTB 位描述

    5)使能 uSDHC 时钟。

    uSDHC_VEND_SPEC[ FRC_SDCLK_ON ] = 1;

    (2)发送80时钟周期到卡,以至于激活卡。

    1)写1清除 uSDHC_SYS_CTRL 寄存器中的 INITA

    即: uSDHC_SYS_CTRL [ INITA ] = 1;

    2)等待卡激活。

    while ( uSDHC_SYS_CTRL INITA ] == ) {  };

    (3)参考芯片手册以及 emmc 协议发送 CMD 命令 初始化 eMMC卡。

    1)发送 CMD0 命令,设置卡 空闲状态

    command . index = CMD0        /*!< Go Idle State */

    command . argument = 0;

    CMD0 命令

    2)host发送CMD1后,会从device收到R3,如果R3中busy bit为0,表示device还没准备好。host重复发送CMD1,接收R3这个过程。

    command . index = CMD1          /*!< Send Operation Condition */

    command . argument = 0xFF8000

    command . responseType = uSDHC_RESPONSE_TYPE_R3

    CMD1

    3)host 发送CMD2后,会从device收到获取CIDR2用来用来返回 device's CID

    command . index = CMD2            /*!< All Send CID */

    command . argument = 0U;

    command . responseType = uSDHC_RESPONSE_TYPE_R2;

    CMD2

    4)host 发送 CMD3 用来给设置设备的 relative device address(RCA)

    command . index = CMD3         /*!< Set Relative Address */

    command . argument = 0          /* Relative Address */

    command . responseType = uSDHC_RESPONSE_TYPE_R1;

    CMD3

    5)host 发送 CMD9 用来请求设备发送它的 Device-specific data (CSD) 到 CMD line 上。参数指定设备的RCA [31:16] RCA

    command . index = CMD9          /*!< Send CSD */

    command . argument = (card->relativeAddress << 16U)    /* 参数 */

    command . responseType = uSDHC_RESPONSE_TYPE_R2

    CMD9

    6)host 发送 CMD7 用来选择或取消卡

    当设备处在Stand-by状态,CMD7把设备从Stand-by State切换到Transfer State;也可以把设备从Transfer State切换回Stand-by State。

    当设备处在Disconnect状态,CMD7把设备从Disconnect State切换到Programming State。

    在以上两种情况下,使用当前的RCA会选择设备,任何其他RCA 地址都会取消选择。使用RCA 0x0000表示取消选择。

    command . index = CMD7     /*!< Select Card */

    command . argument = card->relativeAddress << 16U  //选择卡

    command . argument = 0x0000     //取消选择

    command . responseType = uSDHC_RESPONSE_TYPE_R1

    7)host 发送 CMD23 用来设置卡的读写块数目

    参数:

    [30] '0' non-packed '1' packed

    [24] forced programming, 设置为1,强迫数据直接写入存储介质,而不是仅写入cache

    [15:0] number of blocks, 定义读写块数目

    command . index = CMD23                /*!< Set Block Count */

    command . argument = blockCount   

    command . responseType = uSDHC_RESPONSE_TYPE_R1

    8)host 发送 CMD16 设置接下来所有block命令(读和写)的block尺寸。缺省的块长度在CSD中指定。

    参数[31:0] : block长度

    command . index = CMD16 ;      /*!< Set Block Length */

    command . argument = blockSize

    command . responseType = uSDHC_RESPONSE_TYPE_R1

    9)host 发送 CMD6 切换设备的操作模式或者修改EXT_CSD寄存器,SWITCH命令可以用来写EXT_CSD或者改变命令集。如果SWITCH命令用来改变命令集,那么Index和Value被忽略不会修改EXT_CSD; 如果SWITCH用来写EXT_CSD寄存器,Cmd Set被忽略。

    参数

    [31:26] Set to 0

    [25:24] Access, 00 切换command set; 01 设置Value中指定的位; 10 清除Value中指定的位; 11 写入Value指定的值。

    [23:16] Index, EXT_CSD的索引值,index值为0~255,但是仅仅0~191为有效索引值。

    [15:8] Value,

    [7:3] Set to 0

    [2:0] Cmd Set ,要切换的command set

    command . index = CMD6                  /*!< Switch */

    command . argument = 0x3b70100U      //参数

    command . responseType = uSDHC_RESPONSE_TYPE_R1b

    (4)在非高速模式下设置设置 uSDHC最大频率为 52MHZ。参见(1)的设置方法。

    (5)设置uSDHC的数据总线模式为4位。

    uSDHC_PROT_CTRL [DTW] = 0x01

    位描述

    相关文章

      网友评论

        本文标题:MPC5748G : eMMC调试笔记

        本文链接:https://www.haomeiwen.com/subject/ysgbtqtx.html