8.1.3. 编程指南
8.1.3.1. 初始化流程
在进行数据传输之前,需要对控制器进行初始化,主要包括时钟配置,引脚配置,中断配置,以及工作模式等。
8.1.3.2. 时钟配置流程
建议按照以下流程进行时钟配置:
8.1.3.3. 数据传输
读数据流程图
写数据流程图
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窗口的流程如下:
8.1.3.5. DDR模式编程
对于eMMC设备,控制器支持HS-DDR模式,支持4线和8线模式。由于控制器硬件逻辑限制,使用DDR模式时需要 将时钟控制寄存器的clk_divider0配置为0,才能通过调整相位和delay chain找到正确的采样点。 此时,时钟频率配置有两种方式:
通过CMU模块分频配置外部PLL_FRA0的输入到SDMC模块的时钟,最大支持32分频;
通过外部时钟输入选择控制寄存器,配置输入到SDMC模块的时钟,仅支持1/2/4分频。
DDR模式tuning最佳采样点工作流程如下:
初始化SDMC控制器和eMMC,在SDR模式下正确读写多个block数据;
配置clk_divider0分频寄存器为0,配置工作时钟为50MHz;
配置EMMC工作模式为HS-DDR模式,总线配置为4线或8线ddr模式;
先tuning读数据,遍历配置采样相位和delay chain,采样并比较数据,选择窗口最大的一组连续正确的采样点,并计算中间值作为最佳采样点;
配置最佳采样点的相位值和delay chain值,tuning写操作,选择窗口最大的一组连续正确的驱动值,并计算中间值作为最佳的驱动值;
配置最佳的驱动值,进行读写测试。