【第五届集创赛备赛】九、SD卡控制器开发总结

举报
ReCclay 发表于 2022/02/21 23:25:06 2022/02/21
【摘要】 文章目录 一、SDIO+DMA方案1.1、目标与初衷1.2、过程与成果1.2.1、平台测试 二、SPI+FIFO方案2.1、目标和初衷2.2、过程与成果2.2.1、测试平台 参...

一、SDIO+DMA方案

在这里插入图片描述

1.1、目标与初衷

最初的设计追求最大化传输速度的SD卡控制器,保证能够在读取SD卡上的高码率视频数据实现流畅的传输。

  1. 阻塞的SDIO的读写速度远远慢于AHB总线的传输速度,不能发挥AHB的传输优势
  2. 在FreeRTOS上进行长时间的阻塞的数据等待并不合适,对于低速的IO操作可以配合中断的方式,实现异步的IO任务调度:SD卡控制器使用DMA+中断,在传输完成时使用使用中断通知FreeRTOS的任务,能够有效提升CPU效率和系统实时性。
  3. SDIO速度快于SPI传输,带宽更大,需要自接额外的SDIO模块。

由于AHB3-Lite缺少Arbiter,一个AHB总线上不支持多个AHB Master(主机)和AHB Matrix矩阵的方式,只能通过一个双口RAM来实现DMA的方式传输数据。好在pango的DDR提供了一个额外的AHB接口用于操作内存,所以这种方式是可行的。

  • 初始化

将CMD命令、CMD参数写入到SD-Card Controller寄存器,在操作完成后会产生一个中断信号给CPU,可以在结果寄存器中读取SD对CMD命令相应的结果。使用初始化的命令序列,就可以初始化SD卡,并获取SD卡的相关信息。

  • 读取数据

只需要将要读取的SD卡块的CMD命令、块地址、数据目标地址写入到SD-Card Controller寄存器中,控制器便开始读取SD卡数据,并将数据自动写入内存之中。读取数据完成后,向CPU产生一个中断信号。

  • 写入数据

只需要将要写入的SD卡块的CMD命令、块地址、数据目标地址写入到SD-Card Controller寄存器中,控制器便开始读取内存数据,并将数据自动写入SD卡之中。读取数据完成后,向CPU产生一个中断信号。

1.2、过程与成果

使用Testbench方式通过了测试,能够从SD卡模块中读取数据,并将数据写入到RAM中,实现SD卡数据的读取,也可以将RAM中的数据写入到SD卡的指定块中。在Modelsim、iVerilog验证测试中达到了设计目标,上机设计中的由于pango综合时间过长,需要30分钟以上,就优先使用Xilinx和Altera平台进行了验证。

1.2.1、平台测试

  1. ZYNQ 7020

    使用Vivado创建ip封装,框图连结AXI4 to AHB3-Lite Bridge,AHB3-Lite to AXI4 Bridge,AXI4 Interconnect,将ARM核心连接到SD卡控制器Slave接口,SD卡控制器Master连接到HP接口访问DDR内存。编写初始化和读写测试代码,可以实现SD卡的读写操作,并在串口打印输出。

  2. Cyclone IV EP4CE10

    使用Qsys创建NIOS II,编写Avalone to AHB Bridge,双口RAM,将NIOS II软核连接到SD卡控制器Slave接口和双口RAM,SD卡控制器Master连接到双口RAM。可以实现SD卡的数据读取和写入,并有串口打印。

  3. Pango

    综合完成后,在实现阶段存在无法布通线路的情况。修改实现参数以后,存在一定概率CPU无法启动的情况,或者启动过程中死机。于是最终放弃该方案。

二、SPI+FIFO方案

2.1、目标和初衷

  1. SDIO + DMA方案消耗资源过多,板上剩余资源不多,导致可以综合但无法实现。于是选择使用最简单的SPI方案,软件实现SD卡读写的逻辑,从而完成SD卡的读写功能。所有的读写操作会被存储在FIFO中,所有的读写操作完成时会产生一个中断信号。读取的数据会被存储在FIFO中,发送的数据从FIFO全部发送出去。
  2. 使用FIFO缓冲和中断的方式,避免AHB总线长时间阻塞等待SPI的数据的读写过程。去除DMA模块,降低资源消耗。

2.2、过程与成果

使用Testbench方式通过了测试,能够从进行基本的SPI数据读写。由于缺少SPI接口的SD卡模型的,所以直接选择上机测试。

2.2.1、测试平台

  1. ZYNQ7020

    同第一个方案,在ARM核对SPI控制器进行读写时,可以在对应的端口上使用示波器检测到SPI信号。

  2. Cyclone IV EP4CE10

    同第一个方案,在NIOS II核对SPI控制器进行读写时,可以在对应的端口上使用示波器检测到SPI信号。

  3. Pango

    SPI控制器在连接到Cortex m1核心上时发生了两种情况:

    1. 可以读取寄存器的值,与默认值相等。但是在写入操作时会直接导致系统司机。
    2. 在调整AHB读写的寄存器的相关Verilog代码和时序后,可以写入数据到寄存器并且不会死机,但是读取的寄存器值永远为0。最终没能解决SPI控制器的挂载问题。

参考

文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。

原文链接:recclay.blog.csdn.net/article/details/118677277

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。