当前位置:文档之家› SD卡读写操作 SD卡电路

SD卡读写操作 SD卡电路

SD卡读写操作  SD卡电路
SD卡读写操作  SD卡电路

SD卡在现在的日常生活与工作中使用非常广泛,时下已经成为最为通用的数据存储卡。在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。既然它有着这么多优点,那么如果将它加入到单片机应用开发系统中来,将使系统变得更加出色。这就要求对SD卡的硬件与读写时序进行研究。对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。下面先来讲解SD卡的读写时序。

(1)SD卡的引脚定义:

SD卡引脚功能详述:

SD卡SPI模式下与单片机的连接图:

SD卡支持两种总线方式:SD方式与SPI方式。其中SD方式采用6线制,使用CLK、CMD、DAT0~DAT3进行数据通信。而SPI 方式采用4线制,使用CS、CLK、DataIn、DataOut进行数据通信。SD方式时的数据传输速度与SPI方式要快,采用单片机对SD卡进行读写时一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。这里只对其SPI方式进行介绍。

(2) SPI方式驱动SD卡的方法

SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。SPI接口的选用是在上电初始时向其写入第一个命令时进行的。以下介绍SD卡的驱动方法,只实现简单的扇区读写。

1)命令与数据传输

1. 命令传输

SD卡自身有完备的命令系统,以实现各项操作。命令格式如下:

命令的传输过程采用发送应答机制,过程如下:

每一个命令都有自己命令应答格式。在SPI模式中定义了三种应答格式,如下表所示:

写命令的例程:

//----------------------------------------------------------------------------------------------- 向SD 卡中写入命令,并返回回应的第二个字节

//-----------------------------------------------------------------------------------------------

unsigned char Write_Command_SD(unsigned char *CMD)

{

unsigned char tmp;

unsigned char retry=0;

unsigned char i;

SPI_CS=1; //禁止SD卡片选

Write_Byte_SD(0xFF); //发送8个时钟信号

SPI_CS=0; //使能SD卡片选

//向SD卡发送6字节命令

for (i=0;i<0x06;i++)

{

Write_Byte_SD(*CMD++);

}

//获得16位的回应

Read_Byte_SD(); //read the first byte,ignore it.

do

{ //读取后8位

tmp = Read_Byte_SD();

retry++;

}

while((tmp==0xff)&&(retry<100));

return(tmp);

}

2)初始化

SD卡的初始化是非常重要的,只有进行了正确的初始化,才能进行后面的各项操作。在初始化过程中,SPI的时钟不能太快,否则会造初始化失败。在初始化成功后,应尽量提高SPI的速率。在刚开始要先发送至少74个时钟信号,这是必须的。在很多读者的实验中,很多是因为疏忽了这一点,而使初始化不成功。随后就是写入两个命令CMD0与CMD1,使SD卡进入SPI模式初始化时序图:

初始化例程:

//-------------------------------------------------------------------------- 初始化SD卡到SPI模式

//-------------------------------------------------------------------------- unsigned char SD_Init()

{

unsigned char retry,temp;

unsigned char i;

unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95}; SD_Port_Init(); //初始化驱动端口

Init_Flag=1; //将初始化标志置1

for (i=0;i<0x0f;i++)

{

Write_Byte_SD(0xff); //发送至少74个时钟信号

}

//向SD卡发送CMD0

retry=0;

do

{ //为了能够成功写入CMD0,在这里写200次

temp=Write_Command_SD(CMD);

retry++;

if(retry==200)

{ //超过200次

return(INIT_CMD0_ERROR);//CMD0 Error!

}

}

while(temp!=1); //回应01h,停止写入

//发送CMD1到SD卡

CMD[0] = 0x41; //CMD1

CMD[5] = 0xFF;

retry=0;

do

{ //为了能成功写入CMD1,写100次

temp=Write_Command_SD(CMD);

retry++;

if(retry==100)

{ //超过100次

return(INIT_CMD1_ERROR);//CMD1 Error!

}

}

while(temp!=0);//回应00h停止写入

Init_Flag=0; //初始化完毕,初始化标志清零

SPI_CS=1; //片选无效

return(0); //初始化成功

}

3)读取CID

CID寄存器存储了SD卡的标识码。每一个卡都有唯一的标识码。

CID寄存器长度为128位。它的寄存器结构如下://WYF:16字节*8位= 128位

它的读取时序如下:

与此时序相对应的程序如下:

//------------------------------------------------------------------------------------

读取SD卡的CID寄存器16字节成功返回0

//-------------------------------------------------------------------------------------

unsigned char Read_CID_SD(unsigned char *Buffer)

{

//读取CID寄存器的命令

unsigned char CMD[] = {0x4A,0x00,0x00,0x00,0x00,0xFF};

unsigned char temp;

temp=SD_Read_Block(CMD,Buffer,16); //read 16 bytes

return(temp);

}

4)读取CSD //WYF:共16字节,128位

CSD(Card-Specific Data)寄存器提供了读写SD卡的一些信息。其中的一些单元可以由用户重新编程。具体的CSD结构如下:

读CSD的时序:

相应的程序例程如下:

//-----------------------------------------------------------------------------------------

读SD卡的CSD寄存器共16字节返回0说明读取成功

//-----------------------------------------------------------------------------------------

unsigned char Read_CSD_SD(unsigned char *Buffer)

{

//读取CSD寄存器的命令

unsigned char CMD[] = {0x49,0x00,0x00,0x00,0x00,0xFF};

unsigned char temp;

temp=SD_Read_Block(CMD,Buffer,16); //read 16 bytes

return(temp);

}

4)读取SD卡信息

综合上面对CID与CSD寄存器的读取,可以知道很多关于SD卡的信息,以下程序可以获取这些信息。如下://-----------------------------------------------------------------------------------------------

//返回

// SD卡的容量,单位为M

// sector count and multiplier MB are in

u08 == C_SIZE / (2^(9-C_SIZE_MULT))

// SD卡的名称

//-----------------------------------------------------------------------------------------------

void SD_get_volume_info()

{

unsigned char i;

unsigned char c_temp[5];

VOLUME_INFO_TYPE SD_volume_Info,*vinf;

vinf=&SD_volume_Info; //Init the pointoer;

/读取CSD寄存器

Read_CSD_SD(sectorBuffer.dat);

//获取总扇区数

vinf->sector_count = sectorBuffer.dat[6] & 0x03;

vinf->sector_count <<= 8;

vinf->sector_count += sectorBuffer.dat[7];

vinf->sector_count <<= 2;

vinf->sector_count += (sectorBuffer.dat[8] & 0xc0) >> 6;

// 获取multiplier

vinf->sector_multiply = sectorBuffer.dat[9] & 0x03;

vinf->sector_multiply <<= 1;

vinf->sector_multiply += (sectorBuffer.dat[10] & 0x80) >> 7;

//获取SD卡的容量

vinf->size_MB = vinf->sector_count >> (9-vinf->sector_multiply);

// get the name of the card

Read_CID_SD(sectorBuffer.dat);

vinf->name[0] = sectorBuffer.dat[3];

vinf->name[1] = sectorBuffer.dat[4];

vinf->name[2] = sectorBuffer.dat[5];

vinf->name[3] = sectorBuffer.dat[6];

vinf->name[4] = sectorBuffer.dat[7];

vinf->name[5] = 0x00; //end flag

}

以上程序将信息装载到一个结构体中,这个结构体的定义如下:

typedef struct SD_VOLUME_INFO

{ //SD/SD Card info

unsigned int size_MB;

unsigned char sector_multiply;

unsigned int sector_count;

unsigned char name[6];

} VOLUME_INFO_TYPE;

5)扇区读

扇区读是对SD卡驱动的目的之一。SD卡的每一个扇区中有512个字节,一次扇区读操作将把某一个扇区内的512个字节全部读出。过程很简单,先写入命令,在得到相应的回应后,开始数据读取。

扇区读的时序:

扇区读的程序例程:

unsigned char SD_Read_Sector(unsigned long sector,unsigned char *buffer)

{

unsigned char retry;

//命令16

unsigned char CMD[] = {0x51,0x00,0x00,0x00,0x00,0xFF}; unsigned char temp;

//地址变换由逻辑块地址转为字节地址

sector = sector << 9; //sector = sector * 512

CMD[1] = ((sector & 0xFF000000) >>24 );

CMD[2] = ((sector & 0x00FF0000) >>16 );

CMD[3] = ((sector & 0x0000FF00) >>8 );

//将命令16写入SD卡

retry=0;

do

{ //为了保证写入命令一共写100次

temp=Write_Command_MMC(CMD);

retry++;

if(retry==100)

{

return(READ_BLOCK_ERROR); //block write Error!

}

}

while(temp!=0);

//Read Start Byte form MMC/SD-Card (FEh/Start Byte)

//Now data is ready,you can read it out.

while (Read_Byte_MMC() != 0xfe);

readPos=0;

SD_get_data(512,buffer) ; //512字节被读出到buffer中

return 0;

}

其中SD_get_data函数如下:

//---------------------------------------------------------------------------- 获取数据到buffer中

//---------------------------------------------------------------------------- void SD_get_data(unsigned int Bytes,unsigned char *buffer) {

unsigned int j;

for (j=0;j

*buffer++ = Read_Byte_SD();

}

6)扇区写

扇区写是SD卡驱动的另一目的。每次扇区写操作将向SD卡的某个扇区中写入512个字节。过程与扇区读相似,只是数据的方向相反与写入命令不同而已。

扇区写的时序:

扇区写的程序例程:

//--------------------------------------------------------------------------------------------

写512个字节到SD卡的某一个扇区中去返回0说明写入成功

//--------------------------------------------------------------------------------------------

unsigned char SD_write_sector(unsigned long addr,unsigned char *Buffer)

{

unsigned char tmp,retry;

unsigned int i;

//命令24

unsigned char CMD[] = {0x58,0x00,0x00,0x00,0x00,0xFF};

addr = addr << 9; //addr = addr * 512

CMD[1] = ((addr & 0xFF000000) >>24 );

CMD[2] = ((addr & 0x00FF0000) >>16 );

CMD[3] = ((addr & 0x0000FF00) >>8 );

//写命令24到SD卡中去

retry=0;

do

{ //为了可靠写入,写100次

tmp=Write_Command_SD(CMD);

retry++;

if(retry==100)

{

return(tmp); //send commamd Error!

}

}

while(tmp!=0);

//在写之前先产生100个时钟信号

for (i=0;i<100;i++)

{

Read_Byte_SD();

}

//写入开始字节

Write_Byte_MMC(0xFE);

//现在可以写入512个字节

for (i=0;i<512;i++)

{

Write_Byte_MMC(*Buffer++);

}

//CRC-Byte

Write_Byte_MMC(0xFF); //Dummy CRC

Write_Byte_MMC(0xFF); //CRC Code

tmp=Read_Byte_MMC(); // read response

if((tmp & 0x1F)!=0x05) // 写入的512个字节是未被接受

{

SPI_CS=1;

return(WRITE_BLOCK_ERROR); //Error!

}

//等到SD卡不忙为止

//因为数据被接受后,SD卡在向储存阵列中编程数据

while (Read_Byte_MMC()!=0xff){};

//禁止SD卡

SPI_CS=1;

return(0);//写入成功

}

此上内容在笔者的实验中都已调试通过。单片机采用STC89LE单片机(SD卡的初始化电压为2.0V~3.6V,操作电压为3.1V~3.5V,因此不能用5V单片机,或进行分压处理),工作于22.1184M的时钟下,由于所采用的单片机中没硬件SPI,采用软件模拟SPI,因此读写速率都较慢。如果要半SD卡应用于音频、视频等要求高速场合,则需要选用有硬件SPI的控制器,或使用SD模式,当然这就

需要各位读者对SD模式加以研究,有了SPI模式的基础,SD模式应该不是什么难事。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 以下内容参考WYF下载的网页资料:

F:\other\NEW2011\STM32\RealView\《基于AT89C52单片机的SD卡读写设计》转- 神奇的日志- 网易博客.htm

SPI工作模式

SD卡在上电初期自动进入SD总线模式,在此模式下向SD卡发送复位命令CMD0。如果SD卡在接收复位命令过程中CS低电平有效,则进入SPI模式,否则工作在SD总线模式。

SD卡的初始化

对SD卡进行操作首先要对SD卡进行初始化,初始化的过程中设置SD卡工作在SPI模式,其流程图如图3所示。

在复位成功之后可以通过CMD55和ACMD41判断当前电压是否在工作范围内。主机还可以继续通过CMD10读取SD卡的CID寄存器,通过CMD16设置数据Block长度,通过CMD9读取卡的CSD寄存器。从CSD寄存器中,主机可获知卡容量,支持的命令集等重要参数。SD卡初始化的C语言程序如下:

unsigned char SD_Init(void)

{ unsigned char retry,temp;

unsigned char i;

for (i=0;i<0x0f;i++)

{ SPI_TransferByte(0xff); //延迟74个以上的时钟

}

SD_Enable(); //开片选

SPI_TransferByte(SD_RESET); //发送复位命令

SPI_TransferByte(0x00);

SPI_TransferByte(0x00);

SPI_TransferByte(0x00);

SPI_TransferByte(0x00);

SPI_TransferByte(0x95);

SPI_TransferByte(0xff);

SPI_TransferByte(0xff);

retry=0;

do{ temp=Write_Command_SD(SD_INIT,0);

//发送初始化命令

retry++;

if(retry==100) //重试100次

{SD_Disable(); //关片选

return(INIT_CMD1_ERROR);

//如果重试100次失败返回错误号

}

}while(temp!=0);

SD_Disable(); //关片选

return(TRUE); //返回成功

}

数据块的读写

完成SD卡的初始化之后即可进行它的读写操作。SD卡的读写操作都是通过发送SD卡命令完成的。SPI总线模式支持单块(CMD24)和多块(CMD25)写操作,多块操作是指从指定位置开始写下去,直到SD卡收到一个停止命令CMD12才停止。单块写操作的数据块长度只能是512字节。单块写入时,命令为CMD24,当应答为0时说明可以写入数据,大小为512字节。SD卡对每个发送给自己的数据块都通过一个应答命令确认,它为1个字节长,当低5位为00101时,表明数据块被正确写入SD卡。

在需要读取SD卡中数据的时候,读SD卡的命令字为CMD17,接收正确的第一个响应命令字节为0xFE,随后是512个字节的用户数据块,最后为2个字节的CRC验证码。

可见,读写SD卡的操作都是在初始化后基于SD卡命令和响应完成操作的,写、读SD卡的程序流程图如图4和图5所示。

结束语

实验结果表明单片机使用12MHz的晶体振荡器时,读写速度和功耗都基本令人满意,可以应用于对读写速度要求不高的情况下。本文详细阐述了用AT89C52单片机对SD卡进行操作的过程,提出了一种不带SD卡控制器,MCU读写SD卡的方法,实现了SD卡在电能监测及无功补偿数据采集系统中的用途。

SD卡工作原理介绍和工作原理图

大容量SD卡在海洋数据存储中的应用 本设计使用8 GB的SDHC(High Capacity SD Memory Card,大容量SD存储卡),为了方便卡上数据在操作系统上的读取,以及数据的进一步分析和处理,在SDHC卡上建立了FAT32文件系统。 海洋要素测量系统要求数据存储量大、安全性高,采用可插拔式存储卡是一种不错的选择。目前,可插拔式存储卡有CF 卡、U盘及SD卡。CF卡不能与计算机直接通信;U盘需要外扩接口芯片才能与单片机通信,增加了外形尺寸及功耗;而SD卡具有耐用、可靠、安全、容量大、体积小、便于携带和兼容性好等优点,非常适合于测量系统长期的数据存储。 1 SD卡接口的硬件设计 STM32F103xx增强型系列是意法半导体公司生产的基于Cortex-M3的高性能的32位RISC内核,工作频率为72 MHz,内置高速存储器(128 KB的闪存和20 KB的SRAM),以及丰富的增强I/O端口和连接到2条APB总线的外设。STM32F103xx系列工作于-40~+105℃的温度范围,供电电压为2.0~3.6 V,与SD卡工作电压兼容,一系列的省电模式可满足低功耗应用的要求。 SD卡支持SD模式和SPI模式两种通信方式。采用SPI模式时,占用较少的I/O资源。STM32F103VB包含串行外设SPI接口,可方便地与SD卡进行连接。通过4条信号线即可完成数据的传输,分别是时钟SCLK、主机输入从机输出MISO、主机输出从机输入MOSI和片选CS。STM32F103VB与SD卡卡座的接口电路如图1所示。 SD卡的最高数据读写速度为10 MB/s,接口电压为2.7~3.6 V,具有9个引脚。SD卡使用卡座代替传输电缆,减少了环境干扰,降低了出错率,而且1对1传输没有共享信道的问题。SD卡在SPI模式下各引脚的定义如表1所列。 2 SD卡接口的软件设计 本设计采用STM32F103VB自带的串行外设SPI接口与SD卡进行通信,这里只介绍SPI模式的通信方式。 2.1SD卡的读写 先对STM32F103VB的SPI_CRl(SPI控制寄存器)以及SPI_SR(SPI状态寄存器)进行初始化设置,使能SPI并使用主机模式;同时设置好时钟,在时钟上升沿锁存数据。SPI通道传输的基本单位是字节,由STM32F103VB控制其和SD卡之间的所有通信。 要读写SD卡,首先要对其进行初始化。初始化成功后,即可通过发送相应的读写命令对SD卡进行读写。SD卡的读写流程如图2所示。 2.2 SD1.x与SD2.0标准的识别 由于大容量SDHC的出现,SD1.x满足不了SDHC的容量要求,标准已经升级为SD2.0。但也因此出现了许多电子设备无法驱动大容量SD卡的情况,如何识别SD1.x与SD2.0就显得尤为重要。SD2.0的SPI模式初始化流程如图3所示。 判断是否为SD2.0卡,CMD8(SD2.0新增的命令)是关键。若卡是SD2.0,则发送CMD8将会返回有效响应;若是SD1.x,则返回非法响应,这样就可以识别SD卡的类型。 SD1.x与SD2.0的最大不同在于命令地址的表示。SD1.x的地址单位是字节,而SD2.0的地址单位是扇区,地址仍然采用32位4个字节来表示。因此在读写操作时应该根据不同的卡对地址进行相应的处理,若是SD1.x则写入字节地址,若为SD2.0则写入扇区地址。 3 FAT32文件系统目前有3种FAT文件系统:FAT12、FAT16和FAT32。它们的区别在于文件分配表(File Allocation Table,FAT)中每一表项的大小(也就是所占的位数):FAT12为12位,FATl6为16位,FAT32为32位。本设

SD卡的使用经验总结

由于自己也在使用SD卡,使用的过程中也遇到了一些问题,通过各方的总结,现将其整理一下,调试关键点: 1. 上电时要延时足够长的时间给SD卡一个准备过程,在我的程序里是5秒,根据不同的卡设置不同的延时时间。SD卡初始化第一步在发送CMD命令之前,在片选有效的情况下首先要发送至少74个时钟,否则将有可能出现SD卡不能初始化的问题。 2. SD卡发送复位命令CMD0后,要发送版本查询命令CMD8,返回状态一般分两种,若返回0x01表示此SD卡接受CMD8,也就是说此SD卡支持版本2;若返回0x05则表示此SD卡支持版本1。因为不同版本的SD卡操作要求有不一样的地方,所以务必查询SD卡的版本号,否则也会出现SD卡无法正常工作的问题。 3. 理论上要求发送CMD58获得SD卡电压参数,但实际过程中由于事先都知道了SD 卡的工作电压,因此可省略这一步简化程序。协议书上也建议尽量不要用这个命令。 4. SD卡读写超时时间要按照协议说明书书上的给定值(读超时:100ms;写超时:250ms),这个值要在程序中准确计算出来,否则将会出现不能正常读写数据的问题。我自己定义了一个计算公式:超时时间=(8/clk)*arg。 5. 2GB以内的SD卡(标准卡)和2GB以上的SD卡(大容量卡)在地址访问形式上不同,这一点尤其要注意,否则将会出现无法读写数据的问题。如标准卡在读写操作时,对读或写命令令牌当中的地址域符初值0x10,表示对第16个字节以后的地址单元进行操作(前提是此SD卡支持偏移读写操作),而对大容量卡读或写命令令牌当中的地址域符初值0x10时,则表示对第16块进行读写操作,而且大容量卡只支持块读写操作,块大小固定为512字节,对其进行字节操作将会出错。 6. 对某一块要进行写操作时最好先执行擦出命令,这样写入的速度就能大大提高。进行擦除操作时不管是标准卡还是大容量卡都按块操作执行,也就是一次擦除至少512字节。 7. 对标准卡进行字节操作时,起始和终止必须在一个物理扇区内,否则将不能进行读写操作。实际操作过程中建议用块操作以提高效率。不管是标准卡还是大容量卡一个读写命令只能对一个块进行操作,不允许跨物理层地址操作。 8. 在写数据块前要先写入若干个dummy data字节,写完一个块数据时,主机要监测MISO数据线,如果从机处于忙状态这根数据线会保持低电平,这样主机就可以根据这根数据线的状态以决定是否发送下一个命令,在从机没有释放MISO数据线之前,主机绝对不能执行其他命令,否则将会导致写入的数据出错,而且从机也不会响应主机的命令。 9. 在SPI模式下,CRC校验是被忽略的,但依然要求主从机发送CRC码,只是数值可以是任意值,一般主机的CRC码通常设为0x00或0xFF。 读多块操作和写多块操作的传输停止形式不一样,读多块操作时用用命令CMD12终止传输,而写多块操作时用Stop Tran Token(停止传输令牌,值为0xFD)终止传输。

单片机读写SD卡API模式读写

单片机读写SD卡最简单最基本的程序 处理器:s3c44b0 (arm7) SD卡与处理器的引脚连接:MISO -->SIORxD MOSI -->SIOTxD CLK -->SCLK CS -->PE5 四个文件::用户API函数,移植时不需修改 :中间层函数,移植时不需修改 :硬件层函数,移植时需修改 :一些功能的宏定义,移植时需修改 第一次读写SD卡时,需调用SD_Init(void),然后就可以条用Read_Single_Block或者Write_Single_Block进行读写操作 注意:进行写操作时,最好不要写前700个扇区,应为这些扇区都是FAT文件系统的重要扇区,一旦误写则可能会导致SD无法被电脑识别,需格式化。 /******************************************************* 文件名: 作用:用户API函数,包括四个函数, 读取一块扇区(512字节)U8 Read_Single_Block(U32 blk_addr, U8 *rx_buf) 写一个扇区(512字节)U8 Write_Single_Block(U32 blk_addr, U8 *tx_buf) 获取SD卡基本信息,即读CSD寄存器信息(16字节):void SD_info() SD卡初始化:U8 SD_Init(void) ********************************************************/

/******************************************** 功能:读取一个block 输入:blk_addr为第几个block,rx_buf为数据缓存区首地址输出:返回NO_ERR则成功,其它则读取失败 ********************************************/ U8 Read_Single_Block(U32 blk_addr, U8 *rx_buf) { U16 rsp = 1; U8 i = 0; SD_sel(); //使能SD卡 while(rsp && (i < 100)) { write_cmd(CMD17, blk_addr << 9); //写命令CMD17 rsp = Get_rsp(R1); //获取答应 send_clk(); } if(i > 99) //如果命令超时,则执行超时处理 {

SD卡-中文学习笔记

SD卡操作 一、概述 1、简介 SD卡是基于flash的存储卡。 SD卡和MMC卡的区别在于初始化过程不同。 SD卡的通信协议包括SD和SPI两类。 SD卡使用卡内智能控制模块进行FLASH操作控制,包括协议、安全算法、数据存取、ECC算法、缺陷处理和分析、电源管理、时钟管理。

2、功能介绍 2.1 特点 1)主机无关的FLASH内存擦除和编程 读或写数据,主机只要发送一个带地址的命令,然后等待命令完成,主机无需关心具体操作的完成。当采用新型的FLASH时,主机代码无需更新。 2)缺陷管理 3)错误恢复 4)电源管理 Flash每个扇区有大约10万次的写寿命,读没有限制。 擦除操作可以加速写操作,因为在写之前会进行擦除。 3 SD总线模式 3.1 Negotiating Operation Conditions 当主机定义了SD卡不支持的电压范围时,SD卡将处于非活动状态,将忽略所有的总线传输。要退出非活动状态唯一的方法就是重新上电。 3.2 SD卡获取和识别 SD卡总线采用的是单主多从结构,总线上所有卡共用时钟和电源线。主机依次分别访问每个卡,每个卡的CID寄存器中已预编程了一个唯一的卡标识号,用来区分不同的卡。 主机通过READ_CID命令读取CID寄存器。CID寄存器在SD卡生产过程中的测试和格式化时被编程,主机只能读取该号。 DAT3线上内置的上拉电阻用来侦测卡。在数据传输时电阻断开(使用ACMD42)。

3.3 卡状态 卡状态分别存放在下面两个区域: 卡状态(Card Status),存放在一个32位状态寄存器,在卡响应主机命令时作为数据传送给主机。 SD状态(SD_Status),当主机使用SD_STATUS(ACMD13)命令时,512位以一个数据块的方式发送给主机。SD_STATUS还包括了和BUS_WIDTH、安全相关位和扩展位等的扩展状态位。 3.4 内存组织 数据读写的基本单元是一个字节,可以按要求组织成不同的块。

STM32读写SD卡要点

3.20SD卡实验 很多单片机系统都需要大容量存储设备,以存储数据。目前常用的有U盘,FLASH芯片,SD卡等。他们各有优点,综合比较,最适合单片机系统的莫过于SD卡了,它不仅容量可以做到很大(32Gb以上),而且支持SPI接口,方便移动,有几种体积的尺寸可供选择(标准的SD 卡尺寸,以及TF卡尺寸),能满足不同应用的要求。只需要4个IO口,就可以外扩一个最大达32GB以上的外部存储器,容量选择尺度很大,更换也很方便,而且方便移动,编程也比较简单,是单片机大容量外部存储器的首选。 ALIENTKE MiniSTM3开发板就带有SD卡接口,利用STM32自带的SPI接口,最大通信速度可达18Mbps,每秒可传输数据2M字节以上,对于一般应用足够了。本节将向大家介绍,如何在ALIENTEK MiniSTM32开发板上读取SD卡。本节分为如下几个部分: 3.20.1 SD卡简介 3.20.2 硬件设计 3.20.3 软件设计 3.20.4 下载与测试

3.20.1 SD卡简介 SD卡(Secure Digital Memory Card)中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。大小犹如一张邮票的SD记忆卡,重量只有2克,但却拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性。 SD卡一般支持2种操作模式: 1,SD卡模式; 2,SPI模式; 主机可以选择以上任意一种模式同SD卡通信,SD卡模式允许4线的高速数据传输。SPI模式允许简单的通过SPI接口来和SD卡通信,这种模式同SD卡模式相比就是丧失了速度。 SD卡的引脚排序如下图所示: 图3.20.1.1 SD卡引脚排序图 SD卡引脚功能描述如下表所示: 表3.20.1.1 SD卡引脚功能表 SD卡只能使用3.3V的IO电平,所以,MCU一定要能够支持3.3V的IO端口输出。 注意:在SPI模式下,CS/MOSI/MISO/CLK都需要加10~100K左右的上拉电阻。 SD卡要进入SPI模式很简单,就是在SD卡收到复位命令(CMD0)时,CS为有效电平(低电平)则SPI模式被启用。不过在发送CMD0之前,要发送>74个时钟,这是因为SD卡内部有个供电电压上升时间,大概为64个CLK,剩下的10个CLK用于SD卡同步,之后才能开始CMD0的操作,在卡初始化的时候,CLK时钟最大不能超过400Khz!。 ALENTEK MiniSTM32开发板使用的是SPI模式来读写SD卡,下面我们就重点介绍一下SD卡在SPI模式下的相关操作。 首先介绍SPI模式下几个重要的操作命令,如下表所示:

SD卡读写包括两种模式

SD卡读写包括两种模式:SD模式和SPI模式。其中SD模式又可以分为1bit 和4bit两种传输模式。SD卡缺省使用专有的SD模式。SD卡规范中主要讲了一些命令,响应和CRC效验等等,整个规范的内容还是很多的。 SD卡上电后,卡处于空闲状态,主机发送CMD0复位SD卡,然后通过CMD55和ACMD41判断当前电压是否在卡的工作范围内。在得到了正确的响应后,主机可以继续通过CMD10读取SD卡的CID寄存器,通过CMD16设置数据块长度,通过CMD9读取卡的CSD寄存器。从CSD寄存器中,主机可以获知卡容量,支持的命令集等重要参数。此时,卡以进入了传输状态,主机就可以通过CMD17/18和CMD24/25对卡进行读写。CRC校验是为了防止SD卡的命令,应答,数据传输出现错误。每个命令和应答信号都会产生CRC效验码,每个数据块的传输也会长生CRC效验码。 这段程序是友善之臂推出的mini2440开发板中带的ADS测试源码。整个阅读代码的过程是对这S3C2440的芯片手册和SD卡规范来看的,对于MMC卡没有给出注释,其实和SD卡是大同小异。由于是初次接触ARM,对SD规范的认识也不是很深入,再加上自己水平有限,还不能完全读懂源代码,其中的肯定存在一些错误,欢迎大家一起交流讨论。

#define INT 1 #define DMA 2 int CMD13(void);// Send card status int CMD9(void); unsigned int*Tx_buffer;//128[word]*16[blk]=8192[byte] unsigned int*Rx_buffer;//128[word]*16[blk]=8192[byte] volatile unsigned int rd_cnt;//读数据计数器 volatile unsigned int wt_cnt;//写数据计数器 volatile unsigned int block;//读写块总数 volatile unsigned int TR_end=0; int Wide=0;// 0:1bit, 1:4bit int MMC=0;// 0:SD , 1:MMC int Maker_ID; char Product_Name[7]; int Serial_Num; volatile int RCA; void Test_SDI(void) { U32 save_rGPEUP, save_rGPECON; RCA=0;

IC卡读写器使用说明

IC 读写器使用说明 一、读写器连接 1.1 把通讯线“DB9”端插到PC 机的串口1/2 上 1.2 把通讯线2510端插到读写器的插座,使读写器和PC 机的串口良好连接 1.2 把电源线的“圆柱”端插到读写器的电源座子上 1.3 读写器上电以后可以听到一声风鸣器的响声,如果没有听到风鸣器声,表明读写器没有正常上电. 二、启动Demo 软件 2.1 双击启动测试软件 2.2 如果串口良好连接的话可以听到一声风鸣器的响声,如果启动测试软件以后并没有听到风鸣器声表明串口通讯没有连接好,请检查串口连接线是否连接正确 三、M1卡片读写测试 3.1 把一张Mifare One 卡片放在天线区域范围内

3.2 进入功能选项“低级操作”里面点击“寻卡”,如果出现“寻卡成功!”表明寻卡正常,如果出现“执行失败!”表明出现异常,请检查卡片是否在寻卡范围内,如果确认卡片没有问题,那读写器有异常 3.3 点击“防冲突”,如果出现“执行成功”表明防冲突正常,如果出现“执行失败”表明读写器出现异常或者卡片没有在天线区域 范围内

3.4 点击“选择”,如果出现“执行成功”表明选择正常,如果出现“执行失败” 表明读写器出现异常或者卡片没有在天线区域范 围内 3.5 进入功能选项“密码下载”里面下载卡片密码,比如需要测试卡片扇区1 数据的读写,那么就在扇区1 后面填上密码A/B(注:卡片的初始密码A/B 均为全‘F’),然后选择“A 组密码”或者“B 组密码”,最后点击“下载”,如果出现“密码下载成 功”表明密码下载成功,如果出现异常请按照错误提示更改后再下载一次,直至“下载成功”为止

IC卡和IC卡读写器常识

IC卡和IC卡读写器常识 人们常说的IC卡,其实际的概念是怎样的呢? IC是英文集成电路的缩写,其含义是指集成电路芯片。由于法国人的发明,使集成电路芯片嵌入一张PVC之类的材料制成的卡内变成了现实,这就是今天人们所说的IC卡。 IC卡由于其功能可以认为有3个分支: 1、IC 存贮卡,包括加密存贮卡。读写器对卡的读写为接触式,因而称这种卡为接触式IC卡。 2、CPU卡,即IC卡内含有至少一个运算芯片CPU的IC卡。读写器对卡的读写为接触式,因而称这种卡为接触式IC卡。 3、RF射频卡,射频卡内包括有加密逻辑电路,有的带有CPU芯片,读写器对卡的读写为非接触式,因而称这种IC卡为非接触式IC卡。 IC卡在使用中,有一些参数在卡型选择时是需要认真考虑的。 1)、如果IC卡的使用环境低于0℃时,最好不要选用CPU卡,因CPU卡的工作温度在0℃时以上。而MemoryCard 可以工作在-20℃的低温下工作。 2)、IC卡是有工作电压指标的,西门子公司的IC卡一般工作电压在4.75V~5.25V之间。ATMEL公司的IC卡工作电压约在2.7V~5.5V之间,用户在自己设计读写电路时应加以注意。特别指出的是现在AT MEL新出的45DB041芯片由于工艺变化,已不能在5V电压环境正常工作,我司(深圳庆通科技)针对这种情况研发生产了低电压IC卡读写器和双电压切换的IC卡读写器。 3)、IC卡是有寿命的。它的寿命是由对IC卡的擦写次数决定的,对于西门子的IC卡,指标为1万次擦写寿命;ATMEL的IC卡,指标称擦写寿命为10万次。 4)、IC卡读写器的使用寿命主要由两个因素决定。 a、读写器本身器件的选择; b、卡座的寿命;卡座的寿命分别有10万次,20万次和50万次。国内一些个体经济也生产了相当数量的少于7000次寿命的卡座,主要用于IC卡收费的终端表内,如IC卡电表,IC卡民用水表,IC煤气表等。我司(深圳庆通科技)所标配的卡座为10万次的卡座。 5)、专业厂家的IC卡读写机具配有各种上层接口函数,对于其用户是免费发放的,可以免去用户自己开发的时间。另外,专业厂家提供的产品由于其用户较为广泛,或许已经过一些系统的考验,这些情况,用户可以通过向经销商或厂家提问,得出一些正确的结论。 6)、读写器对IC卡的上电操作,仅在接到软件发出的指令以后才能进行,并且,在IC卡没有插入的情况下,应给出上电出错的返回代码。

sd卡电路图学习

,时下已经成为最为通用的数据存储卡。在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。既然它有着这么多优点,那么如果将它加入到单片机应用开发系统中来,将使系统变得更加出色。这就要求对SD卡的硬件与读写时序进行研究。对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。下面先来讲解SD卡的读写时序。 (1)SD卡的引脚定义: SD卡引脚功能详述:

SD卡SPI模式下与单片机的连接图: SD卡支持两种总线方式:SD方式与SPI方式。其中SD方式采用6线制,使用CLK、CMD、DAT0~DAT3进行数据通信。而SPI方式采用4线制,使用CS、CLK、DataIn、DataOut进行数据通信。SD方式时的数据传输速度与SPI方式要快,采用单片机对SD卡进行读写时一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。这里只对其SPI方式进行介绍。 (2) SPI方式驱动SD卡的方法 SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI 控制器,不光给开发上带来方便,同时也见降低了开发成本。然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。SPI接口的选用是在上电初始时向其写入第一个命令时进行的。以下介绍SD卡的驱动方法,只实现简单的扇区读写。 1)命令与数据传输 1. 命令传输 SD卡自身有完备的命令系统,以实现各项操作。命令格式如下: 命令的传输过程采用发送应答机制,过程如下: 每一个命令都有自己命令应答格式。在SPI模式中定义了三种应答格式,如下表所示:

SD卡初始化及读写流程

SD卡初始化及读写流程 默认分类2010-03-03 21:03:00 阅读264 评论0 字号:大中小 SD卡调试关键点: 1. 上电时要延时足够长的时间给SD卡一个准备过程,在我的程 序里是5秒,根据不同的卡设置不同的延时时间。SD卡初始化第一步在发送CMD命令之前,在片选有效的情况下首先要发送至少74个时钟,否则将有可能出现SD卡不能初始化的问题。 2. SD卡发送复位命令CMD0后,要发送版本查询命令CMD8, 返回状态一般分两种,若返回0x01表示此SD卡接受CMD8,也就是说此SD卡支持版本2;若返回0x05则表示此SD卡支持版本1。因为不同版本的SD卡操作要求有不一样的地方,所以务必查询SD卡的版本号,否则也会出现SD卡无法正常工作的问题。 3. 理论上要求发送CMD58获得SD卡电压参数,但实际过程中 由于事先都知道了SD卡的工作电压,因此可省略这一步简化程序。协议书上也建议尽量不要用这个命令。 4. SD卡读写超时时间要按照协议说明书书上的给定值(读超时: 100ms;写超时:250ms),这个值要在程序中准确计算出来,否

则将会出现不能正常读写数据的问题。我自己定义了一个计算公 式:超时时间=(8/clk)*arg。 5. 2GB以内的SD卡(标准卡)和2GB以上的SD卡(大容量卡)在 地址访问形式上不同,这一点尤其要注意,否则将会出现无法读写数据的问题。如标准卡在读写操作时,对读或写命令令牌当中的地址域符初值0x10,表示对第16个字节以后的地址单元进行操作(前提是此SD卡支持偏移读写操作),而对大容量卡读或写命令令牌当中的地址域符初值0x10时,则表示对第16块进行读写操作,而且大容量卡只支持块读写操作,块大小固定为512字节, 对其进行字节操作将会出错。 6. 对某一块要进行写操作时最好先执行擦出命令,这样写入的速 度就能大大提高。进行擦除操作时不管是标准卡还是大容量卡都按块操作执行,也就是一次擦除至少512字节。 7. 对标准卡进行字节操作时,起始和终止必须在一个物理扇区 内,否则将不能进行读写操作。实际操作过程中建议用块操作以提高效率。不管是标准卡还是大容量卡一个读写命令只能对一个块进行操作,不允许跨物理层地址操作。

射频IC卡读写器简析

一、简介 射频IC卡读写器,属于读写IC卡的RFID射频技术机具设备,根据卡片类型的不同,分为接触式、非接触式、双界面读卡器。接触式IC卡读写器基本遵循ISO7816协议的国际标准,非接触式的则遵循ISO14443或者15693协议接口标准。读写器一般通过通讯线连接接到电脑,通讯方式以USB接口为主(分有驱和无驱),RS232和RS485接口的读卡器,仍然具有一定的用户数量。 二、技术参数举例 型号:LTXHFUSB-02 工作频率:13.56MHz; IC卡读写器支持协议:ISO14443A; 通讯接口:USB接口,操作简单,可以当作串口操作; 读卡距离:小于10cm; 支持卡类型:mafare 1 S20,mafare 1 S50, mafare 1 S70,ISO14443 TypeA等; 工作电压:直流5V(USB直接取电); 工作电流:<100mA; 工作模式:用户可自己设置成主动读卡模式和被动读卡模式; 功能:支持读卡号ID,读写卡,扇区加密,增值减值(钱包)等; 工作温度:-30℃-80 ℃; 外观尺寸:143×110×28mm; 串口波特率:可选,默认9600Bit/S; 操作系统:Windows 98、2000、2003、XP、Windows 7/8、Linux、Andriod等; 显示:双色LED; 蜂鸣器:内置。 三、使用说明 1、通讯接口要满足项目的需求; 2、读卡器设备的频率,要满足项目使用的频率规范; 3、了解读距和防碰撞指标,读距指标要明确什么天线和标签下测试的;防碰撞要明确什么标签在什么排列方式下多长时间内全部读完;

4、模拟情况下连续测试设备的稳定性,确保能长时间的稳定工作; 5、了解读卡器的最大发射功率和配套选型的天线,是否辐射超标; 6、看读卡器具备的天线端口数量,根据应用是否需要多接口的读写器; 7、一个RFID应用系统除了和读写器有关外,还和标签、天线、被贴标物品材质、被贴标物品运动速度、周围环境等相关,在确定设备前最好能模拟现场情况进行测试和验证,确保产品真是能满足应用需求。 四、读卡距离 影响射频IC卡读写器读卡距离的因素较多,因采用不同的协议,不同的天线设计、周围的环境(主要是金属物)和不同的卡片等,都会影响到实际的读卡距离。如果读卡器读卡距离过长,会造成读卡不稳定或失败。同时过近的两个读卡器也会互相干扰,读卡器之间的距离保持在25cm以上。读卡的方式,建议用卡片正对着读卡器自然靠近,用卡片从侧面快速划过的读卡方法不可取,不保证刷卡成功。 五、实物图举例

SD卡读写操作 SD卡电路

SD卡在现在的日常生活与工作中使用非常广泛,时下已经成为最为通用的数据存储卡。在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。既然它有着这么多优点,那么如果将它加入到单片机应用开发系统中来,将使系统变得更加出色。这就要求对SD卡的硬件与读写时序进行研究。对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。下面先来讲解SD卡的读写时序。 (1)SD卡的引脚定义: SD卡引脚功能详述:

SD卡SPI模式下与单片机的连接图: SD卡支持两种总线方式:SD方式与SPI方式。其中SD方式采用6线制,使用CLK、CMD、DAT0~DAT3进行数据通信。而SPI 方式采用4线制,使用CS、CLK、DataIn、DataOut进行数据通信。SD方式时的数据传输速度与SPI方式要快,采用单片机对SD卡进行读写时一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。这里只对其SPI方式进行介绍。 (2) SPI方式驱动SD卡的方法 SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。SPI接口的选用是在上电初始时向其写入第一个命令时进行的。以下介绍SD卡的驱动方法,只实现简单的扇区读写。 1)命令与数据传输 1. 命令传输 SD卡自身有完备的命令系统,以实现各项操作。命令格式如下: 命令的传输过程采用发送应答机制,过程如下: 每一个命令都有自己命令应答格式。在SPI模式中定义了三种应答格式,如下表所示:

sd卡读写程序(SDcardreadandwriteprogram)

sd 卡读写程序( SD card read and write program ) SD card read and write program Objective: To study the SD card / / operation Design / software 1, using SPI communication / / SD card 2, go to SD / / in order to 0-255 a total of 256 data, and then read back LCD1602 display / / hardware requirements: S11 ON / / dial switch Jumper J18 / / all connected #include //dsPIC30F6014 standard header file _FOSC( CSW_FSCM_O&F FX T_PLL4); //4 doubler crystal oscillator, Failsafe clock closed _FWDT (WDT_OFF); / / close the watchdog timer _FBORPO(RP BOR_OFF& MCLR_EN);/ / reset prohibited MCLRr eset enable. _FGS (CODE_PROT_OFF); / / code protection against #define CS PORTGbits.RG9 / / SD card selection pin definition #define RSL https://www.doczj.com/doc/222997006.html,TB4 / / definition LCDc ontrol bits (note here can only register with LATB, you cannot directly use the

SD卡引脚 电路图及工作原理介绍

SD卡引脚电路图及工作原理介绍 SD卡在现在的日常生活与工作中使用非常广泛,时下已经成为最为通用的数据存储卡。在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。既然它有着这么多优点,那么如果将它加入到单片机应用开发系统中来,将使系统变得更加出色。这就要求对SD卡的硬件与读写时序进行研究。对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。下面先来讲解SD卡的读写时序。 (1)SD卡的引脚定义: SD卡引脚功能详述: 引脚编号SD模式SPI模式 名称类型描述名称类型描述 1 CD/DAT3 IO或PP 卡检测/ 数据线3 #CS I 片选 2 CMD PP 命令/ 回应 DI I 数据输入 3 V SS1S 电源地VSS S 电源地 4 V DD S 电源VDD S 电源 5 CLK I 时钟SCLK I 时钟 6 V SS2S 电源地VSS2 S 电源地

7 DAT0 IO或PP 数据线0 DO O或PP 数据输出 8 DAT1 IO或PP 数据线1 RSV 9 DAT2 IO或PP 数据线2 RSV 注:S:电源供给I:输入O:采用推拉驱动的输出 PP:采用推拉驱动的输入输出 SD卡SPI模式下与单片机的连接图: SD卡支持两种总线方式:SD方式与SPI方式。其中SD方式采用6线制,使用CLK、CMD、DAT0~DAT3进行数据通信。而SPI方式采用4线制,使用CS、CLK、DataIn、DataOut进行数据通信。SD方式时的数据传输速度与SPI方式要快,采用单片机对SD卡进行读写时一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。这里只对其SPI方式进行介绍。 (2)SPI方式驱动SD卡的方法 SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。SPI接口的选用是在上电初始时

SD卡引脚及spi模式基本操作过程

SD卡引脚及spi模式基本操作过程 (摘自网络) 对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。下面先来讲解SD卡的读写时序。 SD卡的引脚定义 SD卡引脚功能详述: 引脚编号 SD模式SPI模式 名称类型描述名称类型描述 1 CD/DAT3 IO或PP 卡检测/ 数据线3 #CS I 片选 2 CMD PP 命令/ 回应 DI I 数据输入 3 VSS1 S 电源地VSS S 电源地 4 VDD S 电源VDD S 电源 5 CLK I 时钟SCLK I 时钟 6 VSS2 S 电源地VSS2 S 电源地 7 DAT0 IO或PP 数据线0 DO O或PP 数据输出 8 DAT1 IO或PP 数据线1 RSV 9 DAT2 IO或PP 数据线2 RSV 注:S:电源供给I:输入O:采用推拉驱动的输出 PP:采用推拉驱动的输入输出 SD卡SPI模式下与单片机的连接图:

SD卡支持两种总线方式:SD方式与SPI方式。其中SD方式采用6线制,使用CLK、CMD、DAT0~DAT3进行数据通信。而SPI方式采用4线制,使用CS、CLK、DataIn、DataOut进行数据通信。SD方式时的数据传输速度与SPI方式要快,采用单片机对SD卡进行读写时一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI 方式。这里只对其SPI方式进行介绍。 SPI方式驱动SD卡的方法 SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。SPI接口的选用是在上电初始时向其写入第一个命令时进行的。以下介绍SD卡的驱动方法,只实现简单的扇区读写。 1)命令与数据传输 1. 命令传输 SD卡自身有完备的命令系统,以实现各项操作。命令格式如下: 命令的传输过程采用发送应答机制,过程如下:

单片机读写SD卡教程

郑重声明:本实验并不是对所有SD卡都能成功运行第一步:打开winhex软件,用读卡器读SD卡,在winhex中查看SD卡

点击查找(ctrl+F) 输入FAT(找到DBR处)

发现DBR起始于0x11200扇区地址,它必是512整数倍,因为一个扇区含512BYTE,所以在程序中读一个扇区时一定要是512整数倍,否则会出错。11200地址对应的值是0xEB,本程序读一下这个地址的值看看是否正确。注意有的winhex编址是十进制 看看程序吧 #include #define uchar unsigned char #define uint unsigned int //============================================================= //定义SD卡需要的4根信号线 sbit SD_CLK = P1^1; sbit SD_DI = P1^2; sbit SD_DO = P1^0; sbit SD_CS = P1^3; sbit Beep=P2^0;//用来调程序标志 //=========================================================== //=========================================================== //定义512字节缓冲区,,89C52直接定义成unsigned char DATA[80];,太大了RAM不够unsigned char xdata DATA[512]; void delay(unsigned int z) { unsigned int x,y; for(x=z;x>0;x--); for(y=110;y>0;y--); }

本设计主要是完成IC卡读写器的设计-电子信息工程毕业论文

本设计主要是完成IC卡读写器的设计-电子信息工程毕业论文

1 概述 1.1 课题研究的背景 随着社会的进步和现代化程度的不断提高,人类所拥有的信息种类和数量都在成倍增加,人们每天都要处理许多与个人有关的信息,如购物、,这样就需要携带多种票证、现金、单据,给人们带来极大的不便和不安全感。于是,人们开始寻求一种具有支付、查询、密码查验等多功能及携带方便、安全可靠的“卡”。IC卡就是随着计算机技术、微电子技术和信息化技术的发展应运而生的一种现代社会重要的信息载体和交易工具。1972年,法国人罗兰·莫雷诺(Roland Moreno)第一次将可进行编程设置的IC芯片放在卡片中,使卡片具有了存储、加密及数据处理能力等功能,这就是早期的IC卡。1976年法国布尔(Bull)公司研制出世界第一枚IC卡。 早期的IC卡系统是接触式的,它有其本身不可克服的缺点,如接触磨损、交易速率慢、难以维护、基础设施投入大等。随着信息业和服务业的全球化,在一些场合,对信息载体的便携性、安全性及易用性等方面提出更高的要求,于是非接触式IC卡以其无机械磨损、容易维护、方便使用等优点,成为IC卡中潜力最大的新军而备受国内外业界的瞩目。 非接触式IC卡系统是当今世界先进的射频技术和IC卡技术相结合的产物,是世界上最近几年发展起来的一项新技术,它成功地将射频识别技术和IC技术结合起来,解决了无源和免接触这一难题,是电子器件领域的一大突破,使卡片在靠近读写器表面时即可完成卡中数据的读写操作。非接触式IC卡一经问世,便立即引起广泛的关注。非接触式IC卡操作方便、抗干扰性高、可靠性高、安全性高的特点,使得它在一些接触式IC卡不适用或者无法使用的场所,具有无可比拟的优势,被广泛应用于公交、收费、门禁系统、考勤系统等领域。 1.2课题的意义 随着社会的进步和现代化程度的不断提高,人类所拥有的信息种类和数量都在成倍地增长,而这些信息管理十分不便。IC卡因具有信息容量大、信息稳定、体积小、不易损坏等优点而在实际生活中应用范围非常广泛,如餐卡、公交卡、银行卡、

基于Atmega128单片机SD卡读写程序(免费分享)

基于Atmega128单片机SD卡读写程序实物图对照 接线图

以下是一个简单的测试SD卡读写的程序,程序是基于Atmega128单片机编写的,对于Atmega的其他单片机仅需要做管脚改动就可以使用,其他单片机更改要更大。 sd.h //********************************************************** ******** //SPI各线所占用的端口 #define SD_SS PB6 #define SD_SCK PB1 #define SD_MOSI PB2 #define SD_MISO PB3 //********************************************************** ******** #define SD_DDR DDRB #define SD_PORT PORTB #define SD_PIN PINB #define SD_SS_H SD_PORT |= (1<#define SDSS_L SD_PORT &= ~(1<#define SD_SCK_H SD_PORT |= (1<#define SD_SCK_L SD_PORT &= ~(1<#define SD_MOSI_H SD_PORT |= (1<#define SD_MOSI_L SD_PORT

&= ~(1< #define SD_MISO_IN (SD_PIN&(1

相关主题
文本预览
相关文档 最新文档