您的位置:首页 > 其它

基于SPI模式的SD卡驱动

2013-05-06 08:54 429 查看
最近调了一个基于spi的sd卡驱动,调完了就记录一下,SPI接口模式是以4线作为接口的模式,分别为cs片选信号线,clk同步时钟线,dout数据输出线,din数据输入线。spi是当cs信号拉低时开始传输,拉高时停止传输,spi分为主和从两种模式,主模式的一端来提供时钟信号,并且cs作为输出拉低用;从的一端接收时钟,识别cs信号。spi有数据发送时,才会有时钟产生,否则不产生时钟。

SD卡支持以spi模式的传输通信,接口只用到sd卡的4个引脚,分别为SD卡的DAT3,DAT0,CLK,CMD;



CLK接SPI的时钟线,DAT3接片选信号线,CMD接另一端的输出dout线(该线主要用来接收命令),DAT0接另一端的din线。

spi一般是以一个字节作为传输单位,在sd卡驱动传输中命令的发送可以以uchar cmd[7]个数组作为传输单位

cmdo[0] = 0xff;
cmdo[1] = MMC_SPI_CMD(cmdidx);
cmdo[2] = cmdarg >> 24;
cmdo[3] = cmdarg >> 16;
cmdo[4] = cmdarg >> 8;
cmdo[5] = cmdarg;
cmdo[6] = (crc7(0, &cmdo[1], 5) << 1) | 0x01;


cmdo[0]放入0xff主要是用来在spi传输过程中的时钟引导,cmdo[1]是用来放入要传输的sd卡命令值,最大为54,cmdo[2]-cmdo[5]主要用来放入跟随命令的传输数据值,这是因为sd卡的有些命令还需要有一个铺助的数据,例如写块命令,它就需要传入需要写入块的地址值,该大小是一个32位的整形数。cmdo[6]主要用来传输一个字节的crc校验值。在传输完一个命令后,还需要读会一个响应值,要读回多少大小的响应值,就得给sd卡发送多少大小的时钟周期。

在sd卡初始化流程里面,和其它的sd卡初始化流程大体上是一样的,一些特别的地方有:

1.在初始化命令发送前,需要发送72个时钟周期的时钟信号给sd卡,作为使能信号

2.发送cmd0时,如果sd卡检测到DAT3为拉低状态,就会自动进入SPI模式,并且发送一个不为0xff的值作为回应

3.在发送acmd41时,命令跟随的值不是0xff8000,而是0

4.在读取sd卡cid寄存器时使用的命令是cmd10而不是cmd2

5.spi模式不支持选择卡命令cmd3

sd卡驱动基本上就以上内容,在调试过程中,注意首先要调通底层spi接口的读写,然后才是它的协议层。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: