8.1.3. 编程指南

8.1.3.1. 初始化流程

在进行数据传输之前,需要对控制器进行初始化,主要包括时钟配置,引脚配置,中断配置,以及工作模式等。

../../../_images/sdmc_init_flow.png

8.1.3.2. 时钟配置流程

建议按照以下流程进行时钟配置:

../../../_images/sdmc_clock_set_flow.png

8.1.3.3. 数据传输

读数据流程图

../../../_images/sdmc_read_flow.png

写数据流程图

../../../_images/sdmc_write_flow.png

CMD寄存器配置表如下:

参数

说明

start_cmd

1

发送命令完成后自动清零

use_hold_reg

1或0

基于速度模式选择是否使能保持寄存器

Update_clk_regs_only

非时钟参数刷新命令

card_number

实际的card序号,默认为card 0

send_initialization

非初始化序列

stop_abort_cmd

非停止或丢弃命令

send_auto_stop

0或1

根据需要选择是否自动发送停止命令

transfer_mode

Block传输

read_write

0或1

0-从Card读数据
1-写数据到Card

data_expected

1

数据命令

response_length

响应长度

response_expect

1

命令有响应返回则置1

参数

说明

cmd_index

命令序列

读或写命令序列

wait_prvdata_complete

1

0-立即发送命令
1-等待之前的数据传输结束后发送命令

check_response_crc

1

0-不检查响应CRC
1-检查响应CRC

8.1.3.4. 软件Tuning采样点

Tuning用于Host纠正读数据时的采样点,利用移相器或Delay Chain来寻找最佳的采样点,用来补偿时序偏差, 该偏差主要由工艺偏差,PCB走线,电压,温度变化等诸多因素引起。

在DDR50模式下,需要进行tuning,即使此时来自card的输出延迟小于一个时钟周期,但是在Host控制器内部输入PAD的延迟足够大, 使整体的读延时大于一个时钟周期。

SD/eMMC协议中都定义了Tuning命令和Tuning数据块:

  • SD Card使用CMD19命令读Tuning数据块;

  • eMMC使用CMD21命令读Tuning数据块。

Tuning最佳采样点,计算Tuning窗口的流程如下:

../../../_images/sdmc_tuning_flow.png

8.1.3.5. DDR模式编程

对于eMMC设备,控制器支持HS-DDR模式,支持4线和8线模式。由于控制器硬件逻辑限制,使用DDR模式时需要 将时钟控制寄存器的clk_divider0配置为0,才能通过调整相位和delay chain找到正确的采样点。 此时,时钟频率配置有两种方式:

  1. 通过CMU模块分频配置外部PLL_FRA0的输入到SDMC模块的时钟,最大支持32分频;

  2. 通过外部时钟输入选择控制寄存器,配置输入到SDMC模块的时钟,仅支持1/2/4分频。

DDR模式tuning最佳采样点工作流程如下:

  1. 初始化SDMC控制器和eMMC,在SDR模式下正确读写多个block数据;

  2. 配置clk_divider0分频寄存器为0,配置工作时钟为50MHz;

  3. 配置EMMC工作模式为HS-DDR模式,总线配置为4线或8线ddr模式;

  4. 先tuning读数据,遍历配置采样相位和delay chain,采样并比较数据,选择窗口最大的一组连续正确的采样点,并计算中间值作为最佳采样点;

  5. 配置最佳采样点的相位值和delay chain值,tuning写操作,选择窗口最大的一组连续正确的驱动值,并计算中间值作为最佳的驱动值;

  6. 配置最佳的驱动值,进行读写测试。