S3C2440读写大容量SD卡

发布者:朝霞暮雨最新更新时间:2016-11-27 来源: eefocus关键字:S3C2440  读写  大容量SD卡 手机看文章 扫描二维码
随时随地手机看文章

先了解一下SD卡协议方面的东西

一、SD卡协议概要

命令(Command):在CMD线上,由主机发出

响应(Response):在CMD线上,由被寻址的卡发出。

数据(data):              在数据线上,用DAT0或DAT0~DAT3。

CRC校验响应及忙指示(The CRC status response and Busy indication)只能经过DAT0发送

二、命令格式:

高位,第48位                                                                                                                 低位,第1位


0

1

contents

CRC7

1

起始位,总为0

传输方向,

1:主机发出

0:设备发出

内容,由具体命令决定

七位CRC

终止位,

总为1


 

响应格式:R1、R3、R6与命令格式同,只是第47位为0;而R2为136位,只是contents与上表的位数多而已。

四条数据线时的传输格式:略

数据经过总线的顺序:高位在前,低位在后。

 

SD卡寄存器:

名称

宽度

说明

CID

128

Card identification number; 卡标识

RCA

16

Relative card address; 局部地址,在初始化时由主机和卡决定

DSR

16

Driver Stage Register;配置卡的输出驱动

CSD

128

Card Specific Data; 关于卡的操作信息

SCR

64

SD Configuration Register; 卡配置信息

OCR

32

Operation conditions register

SSR

512

SD Status; information about the card proprietary features

CSR

32

Card Status; information about the card status


红色为V2.0曾加的寄存器。绿色为SPI用,蓝色为V1.0用

 

三、命令种类:广播命令、点对点寻址命令。

    操作模式:标识卡模式、数据传输模式。

卡的标识过程:1、复位。上电或发送CMD0使卡进入空闲状态。

                       2、发ACMD41、CMD2、CMD3使之进入数据传输模式的等待状态。

对于大容量的SD卡,在发送ACMD41后要检查CCS是否为1来确定大容量SD卡否。为了能够识别各种卡,最始的时钟设置不能高于400kHz

 

数据传输:

对大容量SD卡操作的差异

存储器访问命令包括读块命令(CMD17、CMD18)、写块命令(CMD24、CMD25)及块擦除命令(CMD32、CMD33)。

下面是标准容量SD卡和大容量SD卡在存储器访问时的功能差别:

1 . 命令变量

大容量SD卡,存储器访问命令的32位变量是对块寻址的存储器访问(是决定块的块变量)。块的固定大小为512字节。而标准容量的SD卡,32位变量是对字节寻址,块长度由CMD16命令决定。

即:

(a),标准容量的SD卡,变量0001h是对0001h字节单元寻址,而在大容量SD卡中是对0001h块寻址。

(b),标准容量的SD卡,变量0002h是对0002h字节单元寻址,而在大容量SD卡中是对0002h块寻址。

2. 局部寻址和非对齐寻址。在大容量SD卡中,不允许作为块寻址的局部寻址和非对齐寻址(跨跃块边界),只允许对整个块寻址。

3.设置块长度

当使用块寻址模式的存储器读写命令,块长度为512字节,不关心CMD16设置的块长度。块长度设置对存

储器访问命令无效。CMD42不属于存储器访问命令。CMD16指定的数据块大小和块长度,置为512字节。大于

512字节将里将置位BLOCK_LEN_ERROR,且忽略卡容量。

4. 写保护分组

大容量SD卡不支持。发送命令CMD28、CMD29和CMD30将产生ILLEGAL_COMMAND错误

5、读写超时检查

读:对标准容量的SD卡,读超时的时间设定为大于典型读出时间的100倍,或者设置为100mS。卡参数的读时间为:CSD中的TAACT NSAC参数的两倍。

写:对标准容量的SD卡,写超时的时间设定为大于典型编程时间的100倍,或者设置为250mS。卡参数的写时间为:CSD中的R2W_FACTOR

对于大容量卡,CSD中的参数为因定值,因此最好使用>100mS作为读超时,>250mS作为写超时。

 

 

 

四、命令格式

 


位序

47

46

[45:40]

[39:8]

[7:1]

0

宽度

1

1

6

32

7

1

数值

‘0’

‘1’

x

x

x

‘1’

备注

起始位

1发送、0接收

命令索引

变量

CRC7

终止位


 

 

五、关于命令索引

“命令索引”在SD协议中并没有明确指出,但综合参考三星程序及网上文章,认为这种说法是正确的:“命令索引”中的数字就是其“索引值”。对于ACMD类的命令,可以看作为“复合命令”,即在执行时,前面先执行CMD55,然后再执行“去掉ACMDn前的‘A’的命令”

二、S3C2440手册中关于SD卡的操作说明

 串行时钟对数据线的信息进行移位同步并采样,设置SDIPRE来控制传输频率。

 

基本编程过程:1、设置SDICON来选择时钟和中断。

2、将SDIPRE设置为适当的数值。

3、等待74个SDCLK,让SD卡初始化完毕

命令的发送过程:  1、写32位命令变量到SDICmdArg

2、设置SDICmdCon寄存器,选择命令类型并启动传输

3、检查SDICmdSta的指定位是否置位,判断命令是否传输完毕。

4、若有响应,检查响应寄存器SDIRSPn

5、对SDICmdSta寄存器相应的位写1,清除标志位

数据通道编程:1、写超时寄存器SDIDTimer

2、写入要操作的块大小到SDIBSize

3、设置块模式,总线宽度,DMA等,设置SDIDatCon.启动传输

4、发送数据时,当TCFIFO有效、过半、空时,将数据写入SDIDAT中,

5、接收数据时,当RXFIFO有效、过半、空时,将数据写入SDIDAT中,

6、确认数据是否传送完毕。

7、清除SDIDatSta中相应的标志

 

一、初始化命令的差别:

1、加入CMD8命令,以识别是否为大容量卡,如果是,则响应为R7,返回可接受的电源范围及和发送一致的检验码。

2、ACMD41与V1.0版本稍有不同,它的响应一般是rSDIRSP0=0xc0ff8000,为了兼容要多增加一个分支。

3、发送CMD2,响应为CID。如某卡的rSDIRSP0:rSDIRSP1:rSDIRSP2:rSDIRSP3值为:0x1b534d30:0x30303030:0x10b1846c:0xdc00879d意义如下:

127                                                                                                          0

位数

8

16

40

8

32

4

12

7

1

1b

534d

3030303030

10

b1846cd

c

008

79d


意义

MID

“SM

00000”

PRV

PSN

RSV

MDT

CRC



 

二、读写差别

V2.0是对块操作,每块512字节。V1.0是可以对字节操作,用CMD16设置块的大小。用CMD17,CMD18分别对单个块、多块操作。

值得注意的是,三星的例程比较经典,但不能读大容量SD卡,原因是没有设置SDI Data Control Register,对于大容量卡,一定要设置该寄存器,使之等于0x200,且必须是此值。

 

以下是对某大容量卡的起始扇区的读出数据:

0x  0: Rx-0xeb068005,0x2039ffff,0xe800005b,0xc1eb048c

0x  4: Rx-0xc801c38e,0xdb536a19,0xcbf60602,0x   4740f

0x  8: Rx-0x31c08ec0,0xbffc0566,0xb8445543,0x4566ab68

0x  c: Rx-0x  2017bc,0x  9031c9,0x51ba8000,0x52b408f9

0x 10: Rx-0xcd135a58,0x16077217,0x80e13ff9,0x741191b4

0x 14: Rx-0x 289c531,0xdb4152f9,0xcd135a72,0x 2f6dc0e

0x 18: Rx-0x1f9c31f6,0x31ffb9df,0x  fcf3a5,0xbbfc1966

0x 1c: Rx-0xb8475255,0xaaea7a00,0x  20161f,0x66390775

0x 20: Rx-0x549d723c,0x e1fad88,0xe6ad89c1,0x243f741f

0x 24: Rx-0x29e848f6,0xd8bf0300,0xb4026800,0x d0731db

0x 28: Rx-0x60cd1361,0x730a6031,0xc0cd1361,0x4f75e9f9

0x 2c: Rx-0xe8c50977,0x2883c60c,0x81fefe01,0x72c67715

0x 30: Rx-0xbeb231b4,0x 89952cd,0x13587209,0x9991243f

0x 34: Rx-0x740341eb,0xc0be5101,0xe86f00eb,0xfe1e0666

0x 38: Rx-0x608cc3fa,0x f011660,0x a0f20c0,0x c010f22

0x 3c: Rx-0xc0be0800,0x8ec66631,0xf66631ff,0x66b90024

0x 40: Rx-0x    fcf3,0x66a5be10,0x  8ec624,0xfe0f22c0

0x 44: Rx-0x8ec3b900,0x 231f656,0xbf007c57,0x 61f5607

0x 48: Rx-0xfcf3a5bf,0x107ebe00,0x ab91e00,0xfcf3662e

0x 4c: Rx-0xa5061ffb,0xcbfab800,0x208ed0bc,0xdc8ffb66

0x 50: Rx-0x61071fe9,0x6fffb40e,0xcd102eac,0x3c0075f6

0x 54: Rx-0xc30d0a4d,0x69737369,0x6e67204d,0x42522d68

0x 58: Rx-0x656c7065,0x722e0000,0x       0,0x       0

0x 5c: Rx-0x       0,0x       0,0x       0,0x       0

0x 60: Rx-0x       0,0x       0,0x       0,0x       0

0x 64: Rx-0x       0,0x       0,0x       0,0x       0

0x 68: Rx-0x       0,0x       0,0x       0,0x       0

0x 6c: Rx-0x       0,0x       0,0x9bb43b00,0x    8001

0x 70: Rx-0x 1000cfe,0x7ff23f00,0x    c17f,0x7a000000

0x 74: Rx-0x       0,0x       0,0x       0,0x       0

0x 78: Rx-0x       0,0x       0,0x       0,0x       0

0x 7c: Rx-0x       0,0x       0,0x       0,0x    55aa


关键字:S3C2440  读写  大容量SD卡 引用地址:S3C2440读写大容量SD卡

上一篇:STM32笔记SD卡的读写和FatFS文件系统
下一篇:ARM开发步步深入之MMU初窥

推荐阅读最新更新时间:2024-03-16 15:22

GNU ARM汇编--(十一)小结一下
对s3c2440的一部分做了学习,更深的了解了汇编以及arm体系,还有中断,调试底层汇编过程的最大感触就是仔细阅读datasheet,因为那是英文文档. 前面写的都是嵌入式底层比较基础的东西,后面要做的内容: 1.先裸机搞定iic,iic包括用控制器实现的和用GPIO模拟的,这样可以加深时序的理解. 2.spi也想看一下,虽然2440有spi,但是没有外设,这个比较麻烦. 3.搞清楚嵌入式系统中的存储系统,主要是内存(MMU)和flash 4.在前面的基础上可以整体上把握bootloader了 5.因为对linux的文件系统和设备模型有一定的了解,在3的基础上可以开始
[单片机]
STM32模拟IIC读写AT24CXX
以前只用51做过AT24C02,后来才接触到容量更大的型号,发现了很多和以前的不一致的东西,现总结如下。 在上一篇博客中已经写好了STM32用IO口模拟IIC的基本驱动代码,下面结合数据手册用上一篇博客提到的函数编写AT24CXX全系列通用的驱动代码。 我们先来看AT24CXX的中文手册。 这是写操作的步骤。 而上面提到的从器件的地址信息由下图所示。 不同的容量的AT24CXX的从器件地址位是不同的。这在后面的基本的读写函数的关于器件的不同就有所体现。 下面先初始化AT24CXX: void AT24CXX_Init() { IIC_Init(); } 这里只需要初始化IIC总线即可。 下面写出AT24CXX基本
[单片机]
STM32模拟IIC<font color='red'>读写</font>AT24CXX
125KHz RFID读写器的FSK解调器设计
引言   很多工作在125KHz载波频率的RFID芯片,如Microchip公司的MCRF200、MCRF250以及Atmel公司的e5551、T5557等都可以将其调制方式设置为FSK方式。若芯片设置为FSK调制方式,那么读写器(PCD)必须具有FSK解调电路。FSK解调电路将FSK调制信号解调为NRZ码。   本文给出一种FSK解调电路,该电路的特点是电路简单可靠,很适宜PCD中应用。 FSK调制   工作在125KHz的RFID的FSK调制方式都很相似,图1给出了一种FSK调制方式的波形图。从图中可见,此时数据速率为:载波频率fc/40=125K/40=3125bps,在进行FSK调制后,数据0是
[网络通信]
s3c2440裸机-I2c编程-3.i2c程序框架
1.iiC设备的功能 很显然,IIC控制器提供了传输数据的能力,至于数据有什么含义,IIC控制器并不知道,数据的含义有外部i2c从设备,我们需要阅读芯片手册,才知道IIC控制器应该发出怎样的数据。 下图是AT24cxx的操作方法: 2.I2c程序框架 显然我们的程序应该分为两层(IIC设备层,IIC控制器层),框架如下图所示: 最上层是i2c_test层,用来对i2c的功能进行测试和验证。 第2层是i2c设备层,用来对具体某一型号的从设备进行i2c读写 第3层是通用i2c控制器层,用来提供对具体某一型号的i2c主控进行管理操作 最底层是i2c控制器具体的型号层 在通用i2c控制层,我们提供一个统一的接口i2c_transf
[单片机]
<font color='red'>s3c2440</font>裸机-I2c编程-3.i2c程序框架
51单片机读写AT24C02串行E2PROM
24C02中带有片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。 ;这是将0600H地址中以下的8个数据写到24C02的01H为首址单元中去的汇编程序 ORG 0000H SCL BIT P3.4;定义24C02的串行时钟线 SDA BIT P3.5;定义24C02的串行数据线 LJMP START START:LCALL STAR;调用 MOV R2,#08H;一个数据有8位 MOV DPTR,#0600H;定义源数据的位置 LOOP:MOV A,#00H MOVC A,@A+DPTR LCALL
[单片机]
MSP430 SD卡SPI读写操作(1) —— SD卡命令
本节介绍SD卡常用命令,包括SD卡的初始化、读、写等操作的命令及其响应的介绍。 首先附上SD相关文档下载地址: https://www.sdcard.org 快速导航: 一、SD卡介绍 二、SD卡寄存器 三、SPI模式命令格式 四、SPI模式命令响应 五、常用SD命令 一、SD卡介绍 MMC:是MultiMediaCard的缩写,即多媒体卡。 SD:是Secure Digital Memory Card的缩写,即安全数码卡。SD卡又可细分为SDSC (Standard Capacity SD Memory Card, 0 - 2GB)、SDHC (High Capacity SD Memory Card, 2 - 32GB)和S
[单片机]
基于STC15W408AS单片机内部EEPROM读写接口函数
#include reg51.h #include intrins.h #define uint unsigned int #define uchar unsigned char #define ulong unsigned long typedef uchar BYTE; typedef uint WORD; sfr P1M1 = 0x91; //PxM1.n,PxM0.n =00--- Standard, 01--- push-pull sfr P1M0 = 0x92; // =10--- pure input, 11--- open drain sfr P0M1 = 0x93; sfr
[单片机]
PIC单片机的EEPROM读写实例及说明
; PIC单片机的EEPROM读写实例及说明 ;**************************************************************************** ; This is a program to test the function of reading&writting for EEPROM. ; You can observe the value of register(30H--?) buy changing VALU and WRC_ . ; Notice that:it must be { ADDR+WRC_ =0ffh } ! ;********************
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved