SD/MMC卡初始化及读写流程
二、MMC/SD卡的模型和工作原理 PIN脚、SD卡总线、SD卡结构、SD卡寄存器、上电过程 SD卡寄存器:
---------------------------------------------------------------------------
static void sd_init(void)
{
int retries;
u8 *resp;
unsigned int cardaddr;
/
resp = mmc_cmd(, , MSC_CMDAT_RESPONSE_R2, MSC_CMDAT_RESPONSE_R2);
//serial_puts(" SD carsd CID =R2= "); serial_dump_data(resp, 15);
resp = mmc_cmd(, , MSC_CMDAT_RESPONSE_R1, MSC_CMDAT_RESPONSE_R1);
cardaddr = (resp[] << ) | resp[]; //发生3命令 来或者rca
rca = cardaddr << ;
//serial_puts("rca="); serial_puts_hex(rca);
resp = mmc_cmd(, rca, MSC_CMDAT_RESPONSE_R2, MSC_CMDAT_RESPONSE_R2);
sd2_0 = (resp[] & ;
//serial_puts("sd2_0====="); serial_puts_hex(sd2_0);
//serial_puts(" SD carsd CSD Register =R2= "); serial_dump_data(resp, 16);
OUTREG16(A_MSC_CLKRT(), );
resp = mmc_cmd(, rca, MSC_CMDAT_BUSY | MSC_CMDAT_RESPONSE_R1, MSC_CMDAT_RESPONSE_R1);
resp = mmc_cmd(, rca, MSC_CMDAT_RESPONSE_R1, MSC_CMDAT_RESPONSE_R1);
resp = mmc_cmd(, 0x2, MSC_CMDAT_BUS_WIDTH_4BIT | MSC_CMDAT_RESPONSE_R1|MSC_CMDAT_BUSY, MSC_CMDAT_RESPONSE_R1);//应答类型R1b
//while(!(INREG16(A_MSC_STAT(0))&(1<<13)));//等待编程完成
}
------------------------------------------------------------
//从这儿开始看
int mmc_init(void) //
{
int retries;
u8 *resp;
OUTREG32(A_CPM_MSCCDR,);
SETREG32(A_CPM_CPCCR, CPCCR_CHANGE_EN);
MMC_INIT_GPIO();
__msc_reset();
MMC_IRQ_MASK();
OUTREG32(A_MSC_CLKRT(), );//extclk/128
//OUTREG32(A_MSC_LPM(0),0x01);
//sd2_0 = 0; //默认为标准SD卡
resp = mmc_cmd(, , , ); //先80个时钟
resp = mmc_cmd(, 0x1aa, 0x1, MSC_CMDAT_RESPONSE_R1); //判断是sd2(返回0x1)以后的卡还是sd1(返回0x5)现在基本都是sd2以后 的所以都没有对返回值判断
resp = mmc_cmd(, , MSC_CMDAT_RESPONSE_R1, MSC_CMDAT_RESPONSE_R1); //根据cmd55来判断是mmc卡还是sd卡,只有卡才有55命令 才能正确有返回值 返回值有command index =0x37=55 的话说明是sd
//serial_puts(" Application Specific Commands =R1= "); serial_dump_data(resp, 6);
] != 0x37) { //是mmc卡
//serial_puts("MMC card found!\n");
retries = ;
do{
resp = mmc_cmd(, 0x40ff8000, MSC_CMDAT_RESPONSE_R3, MSC_CMDAT_RESPONSE_R3); //匹配电压 mmc卡是CMD1 SD卡是CMD41 因为上电是要一个时间的 所以就利用一个do{}while 来延时
sd_mdelay();
}
] & 0x80)); //直到r3中的ocr回复值中的31位为1的时候表示上电完成了
]&0x40)//电压验证最后一次应答中带有数据访问模式位,如果为1,则类似SDHC卡基于块地址访问
{
sd2_0 = ; // 也可以利用r3 返回值中的ocr的30位来检查是高容量卡(>2G)还是标准卡 其实也可以利用cmd9命令读取cds来判断 在sd就是这么做的
}
#if 0
serial_puts();
]& 0x80)
serial_puts("\n\nMMC init ok\n\n");// 表示上电完成
else
serial_puts("\n\nMMC init fail\n\n");
#endif
resp = mmc_cmd(, , MSC_CMDAT_RESPONSE_R2, MSC_CMDAT_RESPONSE_R2); //获取CID
//serial_puts(" CID CSD =R2= "); serial_dump_data(resp, 16);
resp = mmc_cmd(, 0x10, MSC_CMDAT_RESPONSE_R1, MSC_CMDAT_RESPONSE_R1); //这个东西就很恶心了 在sd卡和mmc卡的参数不一样 mmc卡的参数是自己设定一个rca值 ,但是sd卡是通过回复值中读取rca,上面sd卡的初始化中有描述
OUTREG16(A_MSC_CLKRT(), );
resp = mmc_cmd(, 0x10, MSC_CMDAT_RESPONSE_R1, MSC_CMDAT_RESPONSE_R1);//设置新地址为有效地址 这样就进入了tarnsport mode .只有发送了7号命令 还有设置位宽CMD6 才能发生正在的进行读写发生16 17 18等
resp = mmc_cmd(, 0x3b70101, MSC_CMDAT_BUS_WIDTH_4BIT|MSC_CMDAT_RESPONSE_R1|MSC_CMDAT_BUSY, MSC_CMDAT_RESPONSE_R1);//应答类型R1b,设置位宽 为4BIT模式
resp = mmc_cmd(, rca, MSC_CMDAT_RESPONSE_R1, MSC_CMDAT_RESPONSE_R1);
card_status = (resp[] << ) | (resp[] << ) | (resp[] << ) | resp[];
serial_puts("mmc_cmd 13\n");
if((card_status & 0x900) != 0x900) //ready && tran
{
return OPEN_CARD_INIT_CHECK_STATUS_ERROR;
}
//对于mmc卡经常要加CMD13,不然经常会出现问题的,CMD13在发生玩cmd3后就可以随时发送
))&(<<)));//等待编程完成
}
else//如果是sd卡
sd_init();
;


当卡发生完CMD3后进入待机状态(stand-by state),cmd7可以让卡进入transport状态,



SD/MMC卡初始化及读写流程的更多相关文章
- 在SD/MMC卡上实现hive (Implement WinCE HIVE&ROM system on NAND or SD system )
本是个很简单的topic,但无奈的是很多客户都没有实现.所以只能写一个guide给客户,让他们依葫芦画瓢. 在SD卡上实现hive以及实现binfs最精髓的思想是,在boot stage 1依次加载s ...
- (linux)MMC 卡驱动分析
最近花时间研究了一下 MMC 卡驱动程序,开始在网上找了很多关于 MMC 卡驱动的分析文章,但大都是在描述各个层,这对于初学者来讲帮助并不大,所以我就打算把自己的理解写下来,希望对大家有用.个人觉得理 ...
- MA8621带SD读卡的USB 2.0高速3端口HUB方案芯片|MA8621中文规格书|USB 2.0方案
MA8621说明 MA8621是USB 2.0高速3端口集线器的高性能解决方案,带有SD卡控制器,完全符合通用串行总线规范2.0.控制器继承了先进的串行接口技术,当3个DS(下游)端口同时工作时,功耗 ...
- 带SD读卡的USB HUB方案芯片MA8621|用于带读卡的USB HUB拓展坞方案芯片MA8621
MA8621是一款带SD读卡器控制器的USB 2.0高速3端口集线器方案芯片,主要用在USB TYPEC拓展坞或者USB typec扩展底座上面. 1. MA8621功能概述 MA8621是USB 2 ...
- SD卡spi读写流程
SD卡spi读写流程 1.SD卡的命令格式: SD卡的指令由6字节(Byte)组成,如下: Byte1:0 1 x x x x x x(命令号,由指令标志定义,如CMD39为100111即16进制0x ...
- SD卡初始化以及命令详解
SD卡是嵌入式设备中很常用的一种存储设备,体积小,容量大,通讯简单,电路简单所以受到很多设备厂商的欢迎,主要用来记录设备运行过程中的各种信息,以及程序的各种配置信息,很是方便,有这样几点是需要知道的 ...
- 单元测试+内存、SD卡、SP读写+XmlPullParser
测试: 测试的相关概念 1.根据是否知道源代码分类: 黑盒测试: a - b - c 边值测试 测试逻辑业务 白盒测试: 根据源代码写测试方法 或者 测试用例; 2.根据测试的粒度分类: 方法测试:写 ...
- Smart210学习记录-----SD/MMC/SDIO驱动
转自:http://jingpin.jikexueyuan.com/article/23369.html http://blog.csdn.net/evilcode/article/details/7 ...
- Linux SD/MMC/SDIO驱动分析
一.SD/MMC/SDIO概念区分 SD(SecureDigital)与 MMC(MultimediaCard) SD 是一种 flash memory card 的标准,也就是一般常见的 SD 记忆 ...
随机推荐
- BZOJ 2007 海拔
http://www.lydsy.com/JudgeOnline/problem.php?id=2007 思路: 显然海拔是一片0,另一片1,答案就是01的分界线的流量. 本题中的图是平面图,所以求最 ...
- Send竞争对手:百度云一小时,QQ超大附件最多支持2G,邮件附件20M到50M不等(附国外所有storage列表)——痛点是,最大传输2G,最大容量只有3G(和微云不是一回事),转存到微云文件不能超过1G
QQ邮箱最大可发送50M普通附件(群邮件则限制在2M).此外也可以使用超大附件功能,支持将1G的文件发往任意邮箱.QQ邮箱根据你的QQ邮箱容量的不同制定相应的接受附件限制,包括附件在内,2G用户所发送 ...
- PowerShell3.0中,所有的命令
Get-Command * >> cmd.txt CommandType Name ModuleName ----------- ---- ---------- Alias % -> ...
- 【转】【Android】HAL分析
原文网址:http://www.cnblogs.com/lcw/p/3335505.html HAL概述 以下是基于android4.0.3,对应其他低版本的代码,可能有所差异,但基本大同小异. An ...
- 2015第14周日WebSocket
清明时节雨纷纷,路上行人欲断魂,借问酒家何处是?牧童遥指杏花村.每次清明都不禁想起杜牧这首诗缅怀先人,此时第一句写时间天气,第二句写人物心情,第三句写解决方法,第四句给出解决方案,脍炙人口. 刚没事看 ...
- MFC 消息的分类
来源:孙鑫 c++ 第6集
- Windows通用应用平台
什么是 UWP? 很多程序员都有一个梦想:希望自己开发的软件能够轻而易举的在所有平台上运行,而不是把同样的需求,用不同的技术.工具重新开发才能够运行在所有平台上.这就是跨平台,很多软件从业者都在为这个 ...
- Colorful Lecture Note(手工栈)
题目1 : Colorful Lecture Note 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Little Hi is writing an algorithm ...
- 【POJ1581】A Contesting Decision(简单模拟)
没有什么弯路,直接模拟即可.水题. #include <iostream> #include <cstring> #include <cstdlib> #inclu ...
- Linux优化,history增加详细历史记录
主要功能: 1, 可以记录哪个ip和时间(精确到秒)以及哪个用户,作了哪些命令 2,最大日志记录增加到4096条 把下面的代码直接粘贴到/etc/profile后面就可以了 #history mo ...