卡接口模块 (CIF)
16 Aug 2024
Read time: 3 minute(s)
卡接口模块连接 HIF 和 外部 SD/ MMC Card/ SDIO 设备。卡接口模块参与的工作流程如下:
- CPU 向 HIF 的控制寄存器写入命令参数。
- 控制器将命令参数发送至 CIF。
- CIF 根据控制寄存器的值,生成命令和数据。命令和数据会根据不同的设备协议,在对应的通道进行传输。
为了使 CIF
正确的工作,软件必须满足如下要求:
- 同一时间仅能发送一个命令。
- 对于开放式的写数据,如果因为 FIFO 为空造成 Card 时钟停止了,软件必须向 FIFO 填满数据,才能再次启动时钟。
- 对于读数据,如果 Card 时钟因为 FIFO 满而停止,软件应该继续读至少两个 FIFO 地址,再启动 Card 时钟。
- 当 Card 正在处理数据传输时,发送卡复位命令(CMD0、CMD15 或 CMD52),软件必须设置命令寄存器的 STOP_ABORT_CMD 位,确保发送复位命令之前先停止数据传输。
- 对于 SDIO 传输,如果 SDIO 设备挂起,软件想要恢复挂起的传输,在发送新的数据传输命令时,必须复位 FIFO 并发送恢复命令。
- 当 OINTST 寄存器的 EBE 置位,控制器不能及时处理 SDIO 中断。软件应该忽略 SDIO 中断,发送停止或丢弃命令给 SDIO 设备,确保 SDIO 设备停止发送读数据。
CIF 模块主要包括命令通路、数据通路、中断检测单元、时钟控制单元和驱动采样控制单元,框图如下:
命令通道
命令通道主要功能如下:
- 加载时钟参数
- 加载 Card 命令参数
- 发送命令到 Card 总线
- 从 Card 总线接收设备响应
- 发送响应到 HIF
命令通道的工作流程如下:
- 通过对 HIF 寄存器编程发送一个新的命令,将命令寄存器的 STAT_CMD 位置 1。
- HIF 的 STAT_CMD 位有效,表示有新的命令被发送。
- 命令通路加载新的命令,并发送一个应答信号给 HIF。
- 命令加载后,命令通路的状态机发送命令给 SD/ MMC 总线,包括内部产生的 CRC7 校验码,并接收 Device 返回的响应数据。
- 状态机发送接收的响应数据和命令完成信号给 HIF,并等待八个时钟周期,再加载新的命令。
数据通道
数据通路模块加载新的数据参数,包括是否传输数据、读或写数据传输方向、流传输或块传输方式、数据块容量、字节数量、Card 类型和超时时间。
数据通路在发送和接收数据时的行为如下:
- 在发送数据时,从 FIFO 中取出数据通过 cdata 发送数据。
- 在接收数据时,通过 cdata 将接收到的数据送入 FIFO。
如果命令寄存器的 DATA_EXP 位置 1,新的传输命令会根据如下情况在数据通道执行:
- 如果 TRANS_DIR 位为 1,发送数据。
- 如果 TRANS_DIR 位为 0,接收数据。
SDIO 中断检测
所有来自卡的中断请求报告给 HIF,中断信号的有效时间需要维持两个时钟周期。对于 SDIO 设备,在中断周期内通过保持 Data[1] 引脚为低电平来产生中断信号。
通过中断控制状态机决定被选中的设备工作在中断周期内。
- 对于未选中的设备,或被选中的设备工作在 1 线模式下,中断周期总是有效的。
- 对于被选中的设备,且工作在 4
线模式下,需要满足以下条件之一,中断周期才是有效的:
- 设备空闲时产生中断。
- 没有正在处理的数据传输命令时产生中断。
- 在两个数据块之间的结束位之后的第三个时钟产生中断。
- 上一笔数据结束位之后的两个时钟到下一笔数据命令的结束位期间产生中断。
SDIO 中断为电平触发,需要在一个中断周期内进行采样,控制器才不会丢失该中断。当 SDIO 设备工作在 4
线模式时,在以下任意情况下,控制器不会采样被选中卡的
SDIO 中断:
- 读或写恢复:CIF 将恢复命令当作正常的数据传输命令处理。SDIO 中断在恢复命令处理时,与其他数据命令类似。根据 SDIO 协议:
- 对于正常的数据命令,在命令结束位之后中断周期结束。
- 对于恢复命令,在响应结束位之后中断周期结束。在恢复命令的结束位之后,停止中断采样。
- 读数据期间挂起:如果读数据传输被控制器挂起,CPU 将 ABORT_RDATA 位域置 1 并复位数据状态机。
- 在 CIF 中,从恢复命令响应到 ABORT_RDATA 位域置 1 期间,SDIO 中断不会被采样。
- 在 Host 将 ABORT_RDATA 位域置 1 后,SDIO 中断被处理,启动中断采样。
时钟控制单元
时钟控制单元提供了不同的时钟频率来满足 SD/ MMC 不同速度模式下的频率要求。cclk_in 信号是源时钟(频率大于等于 Card 最大工作时钟频率),由 PLL 分频而来,再通过 SDMC 控制器内部的时钟分频器分频后作为输出时钟 cclk_out 发送给 Card。
时钟控制单元包括以下功能:
- 打开和关闭时钟。
- 控制器进入低功耗模式,在传输空闲时,自动关闭时钟。
- 内部包含延时单元和移相器,提供驱动时钟和采样时钟,参考时钟和延时控制的详细描述。
错误检测
SDMC 控制器可检测以下错误类型:错误分类 | 错误详情 |
---|---|
响应错误 | |
响应超时 | 计时器到达超时寄存器配置的超时时间后,未接收到响应的起始位。 |
响应 CRC 错误 | 收到期望的响应并检查响应数据的 CRC 校验码,响应数据中的 CRC7 校验码与内部生成的校验码不匹配。 |
响应错误 | 响应的传输位不为 0,命令序列与发送的命令序列不匹配,或响应的结束位不为 1。 |
数据发送错误 | |
无 CRC 状态信号 | 在一次写数据期间,如果在数据块发出之后的两个时钟周期后,CRC 状态信号的起始位没有接收到,产生无 CRC 状态的错误。 |
无效的 CRC | 如果在写数据块发送之后产生无效的 CRC 状态(非 010),数据 CRC 错误信号会发送到 HIF,数据传输继续进行。 |
由于 FIFO 为空造成的 Data Starvation 错误 | 如果在写数据时 FIFO 为空,或 Card 时钟停止且数据超时后 FIFO 剩余的数据为空,data-starvation 错误信号会发送到 HIF 单元,数据通道继续等待数据写入 FIFO。 |
数据接收错误 | |
数据超时 | 在读数据时,如果计时器到达超时时间后,没有接收到数据的起始位,会发生数据超时错误。 |
数据起始位错误 | 在 4 位或 8 位模式读数据时,如果发生起始位错误,应用程序必须发送 CMD12 或 CMD52 结束错误状态。在命令接收完成后,应用程序必须复位 IDMAC 和 CIF,并清除错误状态。发送任何数据传输命令之前都必须复位 FIFO。 |
数据 CRC 错误 | 在读数据块传输期间,如果接受到的 CRC16 校验码与内部产生的 CRC16 校验码不匹配,数据通道发送数据 CRC 错误的信号给 HIF,继续传输数据。 |
数据结束位错误 | 在读数据期间,如果接收到的数据结束位不为 1,数据通道发送结束位错误信号给 HIF,并终止数据传输,该信号发送 HIF 则数据传输完成。 |
由于 FIFO 满造成的 Data Starvation 错误 | 在读数据传输期间,当 FIFO 为满,Card 时钟停止。如果 FIFO 满并且数据超时,data-starvation 错误信号发送到 HIF(此时 OINTST 寄存器的 bit10 为 1),数据通道继续等待 FIFO 为空。 |
Host 控制器不能正确的采样到数据 | 如果在读操作时 Card 时钟因为 FIFO 满而停止,Host 控制器不能正确的采样到数据。 |