s3c2440的SD/MMC的应用

 

SD(全名为Secure Digital Memory Card,安全数码卡),是一种存储卡的标准,它被广泛地用于便携式设备上,如数码相机、个人数字助理(PDA)和多媒体播放器等。它的技术是基于MMCMultiMedia Card)格式,因此SD兼容MMC

 

       s3c2440集成了SD控制器,可以方便地读写SDMMC和对SDIO进行操作。在这里,我们只研究对SD/MMC的操作。

 

       要想能够使s3c2440正确读写SD/MMC,就首先要清楚SD的规范协议,由于SD兼容MMC,所以两者的协议差别不大。SD的协议较为繁琐,下面只简略介绍最基本的内容:

 

       SD进行操作包括两个阶段:卡的识别和卡的数据传输。主机通过各种命令对SD进行操作,绝大多数命令都需要SD进行应答响应。在卡的识别阶段,用到的命令只有CMD1(得到主机的操作电压)、CMD2(得到卡的识别码)和CMD3(配置或得到卡的相对地址),其中也可以使用CMD0命令使卡进入空闲状态。CMD1只能用于MMCSD要用ACMD41辅助命令。在正确配置完该阶段后,卡进入待机状态。在卡的数据传输阶段可以完成对卡内存地址的读写等操作。

 

       卡内还配备了几个寄存器,主要有OCR寄存器,用于配置操作电压范围,使用命令CMD1可以获得;CID寄存器,用于得到卡的基本信息,使用命令CMD2CMD10可以获得;CSD寄存器,用于提供卡特性信息,使用CMD9可以获得;RCA寄存器,保存卡的相对地址。另外在卡应答响应信息中,会包括卡的状态信息,主机可以利用该信息获知卡的各种状态,以便进一步操作。

 

       s3c2440只要按照SD的协议去操作,就能正确读写SD。在初始化阶段,要配置SDICON寄存器以及负责传输频率的SDIPRE寄存器,并且还要等待一段时间,以保证初始化正确执行。在命令传输阶段,SDICmdArg寄存器负责传输命令参数,SDICmgCon寄存器负责传输命令索引值,通过SDICmdSta寄存器可以获知命令传输过程中的各种状态,命令的响应信息存储在SDIRSPn中。在数据传输阶段,SDIDTimer寄存器可以设置数据传输的超时时间,SDIBSize寄存器用于设置数据传输块的大小,寄存器SDIDatConSDIDatSta用于数据传输的控制和状态,而数据是通过SDIDAT寄存器利用内部的FIFO来进行传输的,其中寄存器SDIFSTA用于获知FIFO的各种状态。

 

       下面就具体给出一个读写SD的测试实例。该段程序是先对SD进行写操作,然后再从SD中读取该组数据,检查写入的数据和读取的数据是否一致,其中我们利用UART来获知一些必要的传输状态。我们只用查询方式进行数据传输,并且使用的是块操作模式。该段程序是针对MMC所编写,并不适用于SD,但只需做少许改动(在设置相对地址的地方)就可以用于SD

 

 

unsigned int *Tx_buffer;             

unsigned int *Rx_buffer;      

 

……  ……

 

void Main(void)

{

       int i;

       int tempSta;

       int block=16;                //传输数据块大小

       char flag;

       int response;

 

       //UART0的基本配置

……   ……

   

//SDI端口配置

rGPEUP = 0xf83f;               //SDCMD, SDDAT[3:0]上拉有效.

       rGPECON = 0xaaa<<10;             //SDCMD, SDDAT[3:0], SDCLK

 

//初始化SDI

rSDIPRE=124;             //SDI初始阶段传输频率为400KHz

rSDICON=(3<<4)|1;     //SDCLKMMC类型,字节顺序为Type B,使能SDCLK输出

rSDIFSTA|=1<<16;              //FIFO复位

rSDIBSIZE=0x200;              //传输数据块大小为512字节(128)

       rSDIDTIMER=0x7fffff;              //设置数据传输的超时时间

      

       flag=1;

      

       for(i=0;i<0x1000;i++)

              ;            //等待74SDCLK

   

//卡的识别阶段

//CMD0   GO_IDLE_STATE

rSDICARG=0x0;                 //设置CMD0参数为0

       rSDICCON=(1<<8)|0x40;     //无响应,开始传输CMD0,命令信息为命令索引值加0x40

       //等待

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 70
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 70
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值