2024年4月1日发(作者:)

SD卡读写包括两种模式:SD模式和SPI模式。其中SD模式又可以分为1bit 和4bit

两种传输模式。SD卡缺省使用专有的SD模式。SD卡规范中主要讲了一 些命令,响

应和CRC效验等等,整个规范的内容还是很多的。

SD卡上电后,卡处于空闲状态,主机发送CMD复位SD卡,然后通过CMD55

和ACMD4判断当前电压是否在卡的工作范围内。在得到了正确的响应后,主机 可以

继续通过CMD1读取SD卡的CID寄存器,通过CMD1设置数据块长度,通 过CMD

读取卡的CSD寄存器。从CSD寄存器中,主机可以获知卡容量,支持的 命令集等重

要参数。此时,卡以进入了传输状态,主机就可以通过 CMD17/18和

CMD24/25对卡进行读写。CRC校验是为了防止SD卡的命令,应答,数据传输出 现

错误。每个命令和应答信号都会产生 CRC效验码,每个数据块的传输也会长生 CRC

效验码。

这段程序是友善之臂推出的 mini2440开发板中带的ADS测试源码。整个阅 读代

码的过程是对这S3C2440的芯片手册和SD卡规范来看的,对于 MM咪没有 给出注

释,其实和SD卡是大同小异。由于是初次接触ARM对SD规范的认识也 不是很深

入,再加上自己水平有限,还不能完全读懂源代码,其中的肯定存在一 些错误,欢迎

大家一起交流讨论。

#in clude

#in clude

#in clude "def.h"

#in clude "optio n.h"

#in clude "2440addr.h"

#in clude "2440lib.h"

#in clude "sdi.h"

#define INICLK 300000

#define SDCLK 24000000 〃PCLK=49.392MHz

#define MMCCLK 15000000/PCLK=49.392MHz

#define POL 0

#defi ne INT 1 #define DMA 2

int CMD1$void ); // Send card status int CMDQvoid);

un sig

ned

un sig

ned

volatile

volatile

volatile

int *Tx_buffer ;

128[word]*16[blk]=8192[byte]

128[word]*16[blk]=8192[byte]

int * Rx_buffer ;

un sig

ned

un sig

ned

un sig

ned

int rd ent

;//读数据计数器

int wt ent

;//写数据计数器

int

block ;

//读写块总数

volatile

un sig

int

TR_e

ned nd=0;

int

Wide=0; // 0:1bit, 1:4bit int MMC0; // 0:SD , 1:MMC

int Maker_ID;

char Produet_Name[ 7];

int Serial_Num ;

volatile int RCA

void Test_SDI (void )

{

U32 save_rGPEUP save_rGPECON

RCA =0;

MMC=O;

block =3072; 〃3072Blocks=1.5MByte,

((2Block=1024Byte)*1024Block=1MByte)

save_rGPEUP=rGPEUP

save_rGPECO NrGPECON