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


发布评论