SD(Secure Digital)传输根据块数量的指定方式,基本上可以分为以下三种类型:

  1. 单块传输(Single Block Transfer)

在传输之前,向主机控制器指定块的数量。指定的块数量始终为一个。

  1. 多块传输(Multiple Block Transfer)

在传输之前,向主机控制器指定块的数量。指定的块数量可以是一个或多个。

  1. 无限块传输(Infinite Block Transfer)

在传输之前,不向主机控制器指定块的数量。这种传输会持续进行,直到执行一个中止事务(abort transaction)。

对于SD存储卡,中止事务通过CMD12命令执行;对于SDIO卡,则通过CMD52命令执行。

无DMA的数据传输

图13-3显示了不使用DMA的数据传输。

在不使用直接存储器访问(DMA)的情况下,数据传输的序列如下:

  1. 设置块大小寄存器:将一块数据已执行字节长度的对应值设置到块大小寄存器中。

  2. 设置块计数器寄存器:将已执行数据块数量的对应值设置到块计数器寄存器中。

  3. 设置参数寄存器:将发出的命令对应的值设置到参数寄存器中。

  4. 配置数据传输控制寄存器

设置Multi/Single Block Select 的值和Block Count使能位。

根据发出的命令设置数据传输方向位、自动CMD12使能位和DMA使能位。

     5. 设置命令寄存器:将发出的命令对应的值设置到命令寄存器中。注意,当写入命令寄存器的上字节时,SD命令被发出。

     6. 等待命令完成中断:等待SD卡控制器发出命令完成中断信号。

     7. 清除命令完成位:向正常中断状态寄存器中的命令完成位写入1,以清除该位。

     8. 读取响应寄存器:读取响应寄存器,并根据发出的命令获取必要的信息。

     9. 根据操作类型继续

  • 如果是向卡写入数据,则转到步骤(10-W)。
  • 如果是从卡读取数据,则转到步骤(10-R)。

    (10-R) 等待缓冲区读取就绪中断

  • 非DMA写入传输流程:

当SD卡控制器的FIFO_1为空且准备好接收数据时,它会向Arm处理器发送一个缓冲区写入就绪中断。Arm处理器作为主设备,响应这个中断并开始通过缓冲区数据端口寄存器(FIFO_1)传输数据。当FIFO_1中填充了一个完整的数据块时,发射器(可能是SD卡控制器的一部分)开始在SD总线上发送这个数据块。在FIFO_1的数据正在SD总线上传输的同时,SD卡控制器会检查FIFO_2的状态。如果FIFO_2也是空的并且准备好接收数据,那么它会再次向Arm处理器发送缓冲区写入就绪中断,请求下一个数据块。Arm处理器再次作为主设备,通过缓冲区数据端口寄存器开始发送第二个数据块到FIFO_2。这个过程会重复进行,直到所有需要写入SD卡的数据块都被传输完毕。每次FIFO_1或FIFO_2为空且准备好接收数据时,都会触发相应的中断,Arm处理器就会响应这个中断并发送下一个数据块。

      (11-W) 清除缓冲区写入就绪位

当Arm处理器接收到缓冲区写入就绪中断时,它需要在正常中断状态寄存器中找到对应的缓冲区写入就绪位,并向该位写入1以清除该中断标志。这是告诉SD卡控制器,Arm处理器已经知道了FIFO准备好接收数据,并且已经准备好发送数据。

      (12-W) 向缓冲区数据端口寄存器写入数据块

清除中断位后,Arm处理器需要按照在步骤(1)中指定的字节数,向缓冲区数据端口寄存器写入一个数据块。这个数据块将被SD卡控制器发送到SD卡上。

      (13-W) 重复直到所有块发送完毕

Arm处理器需要重复步骤(11-W)和(12-W),直到所有需要写入SD卡的数据块都被发送完毕。然后进入到步骤14。

每次发送一个数据块后,SD卡控制器可能会再次触发缓冲区写入就绪中断,以请求下一个数据块。

  • 非DMA读传输流程

当SD卡控制器的一个FIFO中有一个完整的数据块时,它会向Arm处理器发送一个缓冲区读取就绪中断。接收到中断后,Arm处理器作为主设备,开始通过缓冲区数据端口寄存器(FIFO_1)读取数据。只有当FIFO为空且准备好接收下一个数据块时,接收器才会从SD总线上开始读取数据。如果两个FIFO都满了,主机控制器会通过某种机制(如读等待机制,如果SD卡支持的话,或者通过停止时钟)来停止从SD卡接收数据。这是为了防止数据溢出或丢失。

      (10-R) 等待缓冲区读取就绪中断

Arm处理器需要等待SD卡控制器发送缓冲区读取就绪中断。

      (11-R) 清除缓冲区读取就绪位

当Arm处理器接收到缓冲区读取就绪中断后,它需要在正常中断状态寄存器中找到对应的缓冲区读取就绪位,并向该位写入1以清除该中断标志。

      (12-R) 从缓冲区数据端口寄存器读取数据块

清除中断位后,Arm处理器需要从缓冲区数据端口寄存器读取一个数据块。这个数据块的大小应该在步骤(1)中已经指定。

      (13-R) 重复直到所有块接收完毕

Arm处理器需要重复步骤(10-R)、(11-R)和(12-R),直到所有需要读取的数据块都被接收完毕,然后转到步骤(14)。

      14.  判断传输类型

如果这个序列是用于单个或多个块传输,则继续到步骤(15)。如果是无限块传输,则继续到步骤(17)。

     15. 等待传输完成中断

当外部设备完成一次数据传输时,它会向处理器发送一个传输完成中断。这个中断表明数据已经成功传输到目标位置,或者达到了某个预定的传输终点。

处理器需要等待这个中断,以便知道何时可以开始处理传输的数据或执行后续操作。

     16. 向正常中断状态寄存器的传输完成位写入1以清除该位

向这个位写入1通常是为了清除该中断标志,告诉处理器和外部设备,这个中断已经被识别和处理。

     17. 执行事务中止序列

注意:步骤(1)和步骤(2)可以同时执行。步骤(4)和步骤(5)可以同时执行。

使用DMA进行数据传输

图13-4显示了使用DMA的数据传输。

在数据传输过程中,使用诸如8拍递增突发传输或4拍递增突发传输这样的突发类型,或者采用单次传输,主要是为了从系统内存中传输或接收数据时,减少主设备长时间占用AHB(Advanced High-performance Bus)总线的情况。

DMA传输流程如下:

  1. 设置系统地址:在系统地址寄存器中设置DMA传输的起始系统内存地址。
  2. 设置块大小:在块大小寄存器中设置每个数据块执行的字节长度。
  3. 设置块计数:在块计数寄存器中设置要执行的数据块的数量。
  4. 设置参数:向参数寄存器写入与发出的命令相对应的值。
  5. 配置传输参数:设置多/单块选择、块计数使能、数据传输方向(读/写)、自动CMD12使能和DMA使能。
  6. 发出命令:向命令寄存器写入与发出的命令相对应的值。注意,当向命令寄存器的上字节写入时,会发出SD命令。
  7. 等待命令完成中断:等待SD卡控制器发出命令完成中断。
  8. 清除命令完成位:在正常中断状态寄存器中向命令完成位写入1以清除该位。
  9. 读取响应:从响应寄存器中读取并根据发出的命令获取必要的信息。
  • DMA写传输

当SD卡接收到来自主机的写命令的响应结束位(数据从主机流向卡)时,SD主机控制器作为主设备请求AHB总线。在获得总线授权后,主机控制器开始从系统内存中读取一个数据块,并将这个数据块填充到FIFO(先入先出队列)的前半部分。每当一个数据块准备好后,发送器开始在SD总线上发送数据。

在SD总线上传输数据的同时,主机控制器请求总线以将下一个数据块填充到FIFO的后半部分。这里使用了“乒乓”FIFO来提高吞吐量。同样地,每当一个FIFO为空时,主机控制器就会从系统内存中读取一个数据块。这个过程会一直持续到系统内存中的所有数据块都被读取完毕。

只有在所有数据块都被成功传输到卡上之后,才会设置一个传输完成中断。

  • DMA读传输

当从SD卡接收数据块(数据从卡流向主机)时,这个数据块被存储在FIFO的前半部分。每当一个数据块准备好后,SD主机控制器作为主设备请求AHB总线。在获得总线授权后,主机控制器开始从FIFO的前半部分将一个数据块写入系统内存。

在向系统内存传输数据的同时,主机控制器接收第二个数据块并将其存储在FIFO的后半部分。同样地,每当数据准备好时,主机控制器就将一个数据块写入系统内存。这个过程会一直持续到所有数据块都被传输到系统内存。

只有在所有数据块都被成功传输到系统内存之后,才会设置一个传输完成中断。

注意:主机控制器只有在FIFO中有空间存储一个数据块时,才会从SD卡接收数据块。当两个FIFO都满时,主机控制器会通过“读取等待”机制(如果卡支持读取等待)或停止时钟来阻止数据从卡继续传输。这种机制确保了数据不会丢失,并且系统能够有序地处理接收到的数据。如果SD卡不支持读取等待机制,主机控制器可能需要通过其他方式来管理数据的接收,例如通过软件轮询或中断来检测FIFO的空闲空间,并在适当的时候请求更多的数据。

    10. 等待传输完成中断和DMA中断。

    11. 检查中断类型

  • 如果传输完成被设置为1,则跳到步骤14。
  • 如果DMA中断被设置为1,则跳到步骤12。传输完成具有比DMA中断更高的优先级。

    12. 清除DMA中断位:在正常中断状态寄存器中向DMA中断位写入1以清除该位。

    13. 设置下一个数据位置的系统地址:将下一个数据位置的系统地址设置到系统地址寄存器,并返回步骤10(对于连续传输)。

    14. 清除传输完成和DMA中断位:在正常中断状态寄存器中向传输完成和DMA中断位写入1以清除这些位。

注意事项

  • 步骤2和步骤3可以同时执行。
  • 步骤5和步骤6也可以同时执行。

例如,如果主机想要向SD卡传输4KB的数据,并且假设最大数据块大小为256字节,那么主机驱动程序会将块大小寄存器设置为256,并将块计数寄存器设置为16(因为4KB除以256字节等于16个块)。SD2.0/SDIO2.0主机控制器内部的AHB主控制器和发送器会从这些寄存器中获取要传输多少数据的信息。

基于上述信息,AHB主控制器作为主设备,并启动一个数据读取事务(从系统内存中读取一个256字节的数据块)。为了避免主设备长时间占用AHB总线,主要使用以下类型的突发传输:

  • 单次传输
  • 4拍递增突发传输
  • 8拍递增突发传输

第一个数据块被接收并存储在FIFO的前半部分,第二个数据块被接收并存储在FIFO的后半部分。同样地,剩余的数据块会交替地接收并存储在两个FIFO中。每当FIFO中有一个数据块准备好时,发送器就会开始将这个256字节的数据块传输到SD总线上。在向卡传输完整个数据块后,发送器会等待来自卡的状态响应。只有在接收到前一个数据块的好状态响应后,发送器才会发送下一个数据块;否则,事务将被中止,主机将尝试进行新的事务。

这种机制确保了数据传输的可靠性和有效性。如果某个数据块传输失败,主机不会继续传输后续的数据块,而是会中止当前事务并尝试重新进行事务,以确保数据的完整性和准确性。这种错误处理机制对于保持SD卡与主机之间通信的稳定性至关重要。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部