搜档网
当前位置:搜档网 › SD卡基础原理及读写程序

SD卡基础原理及读写程序

SD卡基础原理及读写程序
SD卡基础原理及读写程序

1、简介:

SD卡(Secure Digital Memory Card)是一种为满足安全性、容量、性能和使用环境等各方面的需求而设计的一种新型存储器件,SD卡允许在两种模式下工作,即SD模式和SPI模式,本系统采用SPI模式。本小节仅简要介绍在SPI模式下,STM32处理器如何读写SD卡,如果读者如希望详细了解SD卡,可以参考相关资料。SD 卡内部结构及引脚如下图所示

2、SD卡管脚图:

3、SPI模式下SD各管脚名称为:

注:一般SD有两种模式:SD模式和SPI模式,管脚定义如下:

(A)、SD MODE 1、CD/DATA3 2、CMD 3、VSS1 4、VDD 5、CLK 6、VSS2 7、DATA0 8、DATA1 9、DATA2

(B)、SPI MODE 1、CS 2、DI 3、VSS 4、VDD 5、SCLK 6、VSS2 7、DO 8、RSV 9、RSV

SD 卡主要引脚和功能为:

CLK:时钟信号,每个时钟周期传输一个命令或数据位,频率可在0~25MHz之间变化,SD卡的总线管理器可以不受任何限制的自由产生0~25MHz 的频率;

CMD:双向命令和回复线,命令是一次主机到从卡操作的开始,命令可以是从主机到单卡寻址,也可以是到所有卡;回复是对之前命令的回答,回复可以来自单卡或所有卡;

DAT0~3:数据线,数据可以从卡传向主机也可以从主机传向卡。

SD卡以命令形式来控制SD卡的读写等操作。可根据命令对多块或单块进行读写操作。在SPI模式下其命令由6个字节构成,其中高位在前。SD卡命令的格式如表1所示,其中相关参数可以查阅SD卡规范。

4、MicroSD卡管脚图:

5、MicroSD卡管脚名称:

SD 卡与MicroSD卡仅仅是封装上的不同,MicroSD卡更小,大小上和一个SIM

卡差不多,但是协议与SD卡相同。

一般我们用单片机操作SD 卡时,都不需要对FAT分区表信息做处理,原因如下:

1)、操作FAT分区表要增加程序代码量、增加SRAM的消耗,对于便携应用来说代码大小和占用SRAM的多少至关重要。

2)、即使我们对FAT分区表不做任何了解,实际上我们一样可以向SD卡上写

入数据,这就表明使用FAT对我们做数据存储应用来说如同鸡肋。

3)、耗费大量经历和时间去了解FAT分区表对于我们做嵌入式软件开发的人来说有些得不偿失。

4)、SD卡支持两种操作模式,SD模式和SPI模式,SPI模式做SD数据操作时根本不需要知道FAT,这时候SD卡对于我们来说实际上就是个大的、快速的、方便的、容量可变的外部存储器。

基于以上原因,一般情况下对SD卡的操作只需要了解SPI通讯就可以了,而现

在大部分单片机都有SPI接口,那么操作SD卡易如反掌。

以下是做SD卡试验时使用的电路图:

SD_CS/ 连接到单片机的片选SD管脚,只有单片机设置SD_CS/为低电平时才可以操作SD卡。

MOSI连接单片机SPI总线的MOSI管脚(SPI数据输入),单片机从这个管脚

读取SD卡内的数据。

MISO连接单片机SPI总线的MISO管脚(SPI数据输出)、单片机通过这个管脚向SD卡内写入数据。

SCK连接单片机SPI总线的SCK(SPI时钟)

SD管脚实际上在SD卡内部连接到了GND,当SD插座上没插入SD卡时,单片机从这个管脚能读到高电平(前提是使用单片机内部上拉输入,或者外部增加一个上

拉电阻),一旦插入SD卡,这个管脚就变成低电平,这个功能用来检测是否插入SD 卡。

RSV1和RSV2是保留功能管脚,不需要操作。

MicroSD卡的连接和SD卡大同小异,只是MicroSD卡比SD卡少一个GND管脚,所以不能使用上面做的这种插入卡的检测,实际上现在很多SD卡/MicroSD卡插座都

有插入检测管脚,当然,一分钱一分货,价格上当然也要贵一些

顺便提一下,普通SD卡插座最多5块钱。

SPI命令格式

以下是一个简单的测试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<

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

// 错误号

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

#define INIT_CMD0_ERROR 0xFF

#define INIT_CMD1_ERROR 0xFE

#define WRITE_BLOCK_ERROR 0xFD

#define READ_BLOCK_ERROR 0xFC

#define TRUE 0x01

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

// MMC/SD 命令(命令号从40开始,只列出基本命令,并没有都使用)

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

#define SD_RESET 0x40 + 0

#define SD_INIT 0x40 + 1

#define SD_READ_CSD 0x40 + 9

#define SD_READ_CID 0x40 + 10

#define SD_STOP_TRANSMISSION 0x40 + 12

#define SD_SEND_STATUS 0x40 + 13

#define SD_SET_BLOCKLEN 0x40 + 16

#define SD_READ_BLOCK 0x40 + 17

#define SD_READ_MULTI_BLOCK 0x40 + 18

#define SD_WRITE_BLOCK 0x40 + 24

#define SD_WRITE_MULTI_BLOCK 0x40 + 25 //片选关(MMC/SD-Card Invalid) #define SD_Disable() SD_SS_H //片选开 (MMC/SD-Card Active)

#define SD_Enable() SD_SS_L

SD_TEST.C

//***************************************************************** ***********************/

//ICC-AVR application builder : 03-5-20 8:39:11

// Target : M128

// Crystal: 3.6864Mhz

#include

#include

#include 'sd.h'

void uart0_init(void);

void putchar(unsigned char content);

void putstr(unsigned char *s);

void SD_Port_Init(void);

unsigned char SD_Init(void);

unsigned char SD_write_sector(unsigned long addr,unsigned char *Buffer); unsigned char SD_read_sector(unsigned long addr,unsigned char *Buffer); unsigned char SPI_TransferByte(unsigned char byte);

unsigned char Write_Command_SD(unsigned char cmd,unsigned long address); unsigned long SD_find(void);

//***************************************************************** *********

// 串口调试程序

//***************************************************************** *********

void uart0_init(void)

{

UCSR0B = 0x00; //disable while setting baud rate

UCSR0A = 0x00;

UCSR0C = 0x06; // 00000110 UART0设置为异步模式、无奇偶校验、1位停止位、8位数据位

UBRR0L = 0x17; //set baud rate lo

UBRR0H = 0x00; //set baud rate hi 设置UART0口通信速率9600

UCSR0B = 0x18;

}

void putchar(unsigned char content)

{

while(!(UCSR0A & (1 << UDRE0))); /* 判断上次发送有没有完成 */

UDR0 = content; /* 发送数据 */

}

void putstr(unsigned char *s)

{

while(*s)

{

putchar(*s);

s++;

}

}

//***************************************************************** ***********

// 端口初始化

void SD_Port_Init(void)

//***************************************************************** ***********

{

SD_PORT |= (1<<

SD_DDR |= (1<<<

SD_DDR &= ~(1<

}

//***************************************************************** ***********

// 初始化 MMC/SD 卡为SPI模式

unsigned char SD_Init(void)

//***************************************************************** ***********

{

unsigned char retry,temp;

unsigned char i;

SPCR=0x53; //设定SPI为128分频,慢速进行初始化

SPSR=0x00;

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);

MSD_Disable(); //关片选

SPCR=0x50; //设置SPI为2分频。进行高速读写SPSR=0x01;

return(TRUE); //返回成功

}

//***************************************************************** ***********

// 发送命令给 MMC/SD卡

//Return: 返回MMC/SD卡对命令响应的第2字节,作为命令成功判断unsigned char Write_Command_SD(unsigned char cmd,unsigned long address) //***************************************************************** ***********

{

unsigned char tmp;

unsigned char retry="0";

SD_Disable();

SPI_TransferByte(0xFF);

SD_Enable();

SPI_TransferByte(cmd); //将32位地址进行移位作为地址字节

SPI_TransferByte(address>>24);

SPI_TransferByte(address>>16);

SPI_TransferByte(address>>8);

SPI_TransferByte(address);

SPI_TransferByte(0xFF);

SPI_TransferByte(0xFF);

do{

tmp = SPI_TransferByte(0xFF); //发送8个时钟接受最后一个字节

retry++;

}while((tmp==0xff)&&(retry<8));

return(tmp);

}

//***************************************************************** ***********

// 写一个扇区(512Byte) to MMC/SD-Card

//如果写完成返回TRUE

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

//***************************************************************** ***********

{

unsigned char temp;

unsigned int i;

SPI_TransferByte(0xFF); //延迟8个时钟

SD_Enable(); //开片选

temp = Write_Command_MMC(MMC_WRITE_BLOCK,addr<<9); //发送写扇区命令

if(temp != 0x00)

{

SD_Disable();

return(temp);

}

SPI_TransferByte(0xFF);

SPI_TransferByte(0xFF);

SPI_TransferByte(0xFE);

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

{

SPI_TransferByte(*Buffer++); //发送512字节数据

}

//CRC-Byte

SPI_TransferByte(0xFF); //Dummy CRC

SPI_TransferByte(0xFF); //CRC Code

temp = SPI_TransferByte(0xFF); //读SD卡运行响应

if((temp & 0x1F)!=0x05) //如果最后4位为0101,为操作成功。否则为操作失败。

{

SD_Disable();

return(WRITE_BLOCK_ERROR); //返回错误

}

while (SPI_TransferByte(0xFF) != 0xFF);

SD_Disable();

return(TRUE); //返回成功

}

//***************************************************************** ***********

// 读512字节 from MMC/SD-Card

//如果成功返回TRUE

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

//***************************************************************** ***********

{

unsigned char temp;

unsigned int i;

unsigned char data;

SPI_TransferByte(0xff);

MMC_Enable();

temp = Write_Command_SD(SD_READ_BLOCK,addr<<9);//发送读扇区命令

if(temp != 0x00)

{

SD_Disable();

return(READ_BLOCK_ERROR); //返回错误号

}

while(SPI_TransferByte(0xff) != 0xfe);

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

{

data = SPI_TransferByte(0xff); //存数据

*Buffer++=data;

}

SPI_TransferByte(0xff); //读CRC码

SPI_TransferByte(0xff); //读CRC码

SD_Disable();

return(TRUE); //返回成功

}

//***************************************************************** *********

// 查找数据开始标志(预设DATASTART)根据实际需要删改

//***************************************************************** *********

unsigned long SD_find(void)

{

unsigned long tmp="400";

unsigned char data[512];

do

{

SD_read_sector(tmp,data); //从0扇区开始查找

tmp++; //查找DATASTART

}while(!((data[0]=='D')&&(data[1]=='A')&&(data[2]=='T')&&(data[3]=='A')&&(d ata[4]=='S')&&(data[5]=='T')&&(data[6]=='A')&&(data[7]=='R')&&(data[8]=='T'))); return tmp; //返回开始标志的下一个扇区

}

//***************************************************************** *********

// 发送一个字节

//***************************************************************** *********

unsigned char SPI_TransferByte(unsigned char byte)

{

SPDR = byte;

while (!(SPSR & 0x80)); //检测线路是否空闲

return SPDR;

}

//***************************************************************** *********

// 主程序例子

//***************************************************************** *********

void main(void)

{

unsigned long temp;

unsigned char data[512];

unsigned char data2[512]={'sssssssssssssssssssssssss'};

unsigned char comm1[]={'/r/nhello world/r/n'};

unsigned char comm2[]={'/r/nSD_INIT OK/r/n'};

uart0_init();

SD_Port_Init(); //端口初始化

if(SD_Init()== 0x01)

{ //SD卡初始化,并读取返回值

putstr(comm2);

}

temp="SD"_find(); //查找DATASTART数据开始标志,返回下一扇

区地址

SD_read_sector(1001,data); //读取temp地址的512字节数据,512字节数据存入data数组

putstr(data);

SD_write_sector(temp,data2); //将data2数组512字节数据写入temp扇区

}

测试程序很简单,仅仅是做了一下读写SD卡的测试。

关于SD卡的几点注意事项。

1、无论我们愿意不愿意,SD卡每次读写数据的最小单位是1个扇区,即512个字节。

2、SD卡与单片机连接的 SPI总线不能太长,要尽量短。这样的好处是速度可以更快,也不容易出错。

3、虽然我们并不关心FAT文件表,但是我们仍然要关心SD卡的存储结构,如

果我们不想使用PC机来读取保存在SD卡上的数据那我们就不用关心SD存储结构了。但,作为一个大容量的可移动存储设备,不能用PC机来读取是个很大的遗憾,我解决这个遗憾的方法如下:

3-1、因为我不了解FAT复杂的结构,所以我做的程序没法去按照FAT表的各项功能来进行创建文件、删除文件、创建目录等等操作。

3-2、虽然我们的单片机不能创建文件,但是PC机是可以创建文件的啊!所以我使用PC机将SD卡格式化,之后在SD卡上创建一个大文件,比如我的128M的SD卡上我建立了一个100M的文件。这里需要注意一下,一般使用windows创建文件的功

能时是没有办法指定创建文件的大小的,空文件就是0个字节的长度,而我们是需要

一个固定长度的文件的,所以我用VC编写了一个小软件,这个软件可以为我创建一个100M长度的空文件,记住,这点很重要:一个固定长度的空文件

3-3、虽然我们建立了个文件在SD卡上,可是我们因为不去了解FAT表,所以

我们一样不知道这个文件到底位于SD卡的什么地方,不要以为它会在0字节的地方开

始,为了找到这个文件的开始位置,我们可以在建立的那个空文件的开头写上几个字符,比如我程序里面写的“DATASTART”,接下来我们要做的就是一个扇区一个扇区的去找这个几个特殊的字符,这是个笨方法,但却是最简单直观的方法。这个方法有

两个缺点:a、如果文件建立在整个SD卡的后面,那找到这个文件需要漫长的等待。b、如果碰巧某个文件里面也有我们定义的那个特殊字符串的话,那就乱套了!不过好在我们使用的SD卡一般都是专用的,并不能拿去做其他应用,比如从公司copy点文件回家之类的,那就能保证这个SD卡上文件的简单性,即只有我们需要的那个文件,其他文件并不存在,而且这个文件肯定会从SD卡开始的那些扇区中的某一个开始。这样说来的话找到这个字符串也不是那么慢嘛!^_^。不过这里要建议一下,在使用SD 卡之前最好用windows将它完全格式话一下。

3-4、一旦我们找到了我们要写入文件的起始位置(它一般表示为一个扇区号),那我们就可以在这个起始扇区的下一个扇区写入数据了。

4、OK,看起来很简单!有了这种存储方式我们还需要IIC接口的 EEPROM干吗呢?

来自https://www.sodocs.net/doc/9c12395113.html,/itismine/article/details/6069620

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;

门禁控制器接线原理图

门禁系统操作手册门禁控制器接线--原理图

1

一.设备特性:1.485控制器特性第一部分门禁控制器硬件手册 门禁系统操作手册 485 门禁控制器使用标准的工业串口通信,通信距离可达1200 米,每个总线可以接255 台设备,使用 485 集线器可以扩展多条总线。支持多达6 个输出和10 个输入。型号有单门、双门、4门等。 ? 标准485(波特率9600)通讯; ? 大容量存储卡,54000 卡记录,60000 刷卡记录,10000 报警记录(控制器的记录保存在Flash 里 面; 双存储器,卡数据、刷卡记录分别存储,数据不易丢失;在脱机状况下,如果记录(刷卡记录和报 警记录)超出容量,将覆盖最早的记录); ? 开门时区设置多达16 组,且可以分别设定对应的多种开门方式,如卡、卡+密码、密码、双卡、 首卡开门等; ? 支持远程操作开关门、远程开关火警、报警。支持软件锁门常闭功能; ? 支持多个报警事件的报警输出,如无效卡、无效时间、门报警、门开超时等; ? 默认支持2—4个weigend 读卡器,自动适应26、34、37协议; ? 支持多达6 个输出,分别控制门和报警输出联动; ? 多门控制器支持互锁、防潜返功能; ? 所有设备可以混合安装在一个系统里面; ? 配合软件支持考勤、实时在线巡更功能。支持多用户多机实时管理监控; ? 内置web 网页,同时可以网络实时监控; 2.T CP/IP控制器特性 以太网门禁控制器是专门为对通信要求比较高而设计的门禁设备。具有远程升级、远程初始化、数据 复位、防区功能的功能;可以扩展的485 接口空间;支持多达6个输出和10 个输入。是一个可以通过以太 网进行远程管理的门禁系统。型号有单门、双门、4门等。 ? 标准10M TCP/IP 通讯; ? 大容量存储卡,支持远程升级版卡容量4000,刷卡记录4000,报警记录6000; ? 标准版卡容量54000,刷卡记录60000,报警记录20000(控制器的记录保存在Flash 里面。在 脱 机状况下,如果记录(刷卡记录和报警记录)超出容量,将覆盖最早的记录);双存储器,卡数据、 刷卡数据分别存储。

非接触式IC卡读卡器原理和优点

非接触式IC卡读卡器原理和优点 原理:非接触式IC卡又称射频卡,由IC芯片、感应天线组成,封装在一个标准的PVC卡片内,芯片及天线无任何外露部分。是世界上最近几年发展起来的一项新技术,它成功的将射频识别技术和IC卡技术结合起来,结束了无源(卡中无电源)和免接触这一难题,是电子器件领域的一大突破。卡片在一定距离范围(通常为5—10mm)靠近读写器表面,通过无线电波的传递来完成数据的读写操作。射频读写器向IC卡发一组固定频率的电磁波,卡片内有一个IC串联谐振电路,其频率与读写器发射的频率相同,这样在电磁波激励下,LC谐振电路产生共振,从而使电容内有了电荷;在这个电荷的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内存储,当所积累的电荷达到2V时,此电容可作为电源为其它电路提供工作电压,将卡内数据发射出去或接受读写器的数据。 优点: 1.可靠性高,可防止因插卡、灰尘油污导致的各种故障;卡外表无裸露的芯片,无芯片脱落、静电击穿、弯曲损坏等问题;操作方便快捷,有效范围内即可对卡片操作;无方向性;提高了识读速度,卡与读写器之间无机械接触。 2.防冲突(自动分辨能力)射频卡有快速防冲突机制,能防止卡片之间出现数据干扰,读写器可同时处置多张感应卡。 3.操作方便,由于非接触通讯,读写器在10CM范围内就可以对卡片操作,一般读卡距离是根据机具不同而定。所以不必插拨卡,非常方便用户使用。非接触式卡使用时没有方向性,卡片可以在任意方向掠过读写器表面,既可完成操作,这大大提高了每次使用的速度。 4.应用范围广,射频卡的存储器结构特点使其可一卡应用于不同的系统,用户根据不同的应用可设定不同的密码和访问条件 5.加密性能好,双向验证机制,各扇区均有操作密码和访问条件。

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. 对标准卡进行字节操作时,起始和终止必须在一个物理扇区 内,否则将不能进行读写操作。实际操作过程中建议用块操作以提高效率。不管是标准卡还是大容量卡一个读写命令只能对一个块进行操作,不允许跨物理层地址操作。

门禁控制器接线原理图

门禁系统维护方案门禁控制器接线原理图

1

一.设备特性:1.485控制器特性第一部分门禁控制器硬件手册 门禁系统操作手册 485 门禁控制器使用标准的工业串口通信,通信距离可达1200 米,每个总线可以接255 台设备,使用 485 集线器可以扩展多条总线。支持多达6 个输出和10 个输入。型号有单门、双门、4门等。 ? 标准485(波特率9600)通讯; ? 大容量存储卡,54000 卡记录,60000 刷卡记录,10000 报警记录(控制器的记录保存在Flash 里 面; 双存储器,卡数据、刷卡记录分别存储,数据不易丢失;在脱机状况下,如果记录(刷卡记录和报 警记录)超出容量,将覆盖最早的记录); ? 开门时区设置多达16 组,且可以分别设定对应的多种开门方式,如卡、卡+密码、密码、双卡、 首卡开门等; ? 支持远程操作开关门、远程开关火警、报警。支持软件锁门常闭功能; ? 支持多个报警事件的报警输出,如无效卡、无效时间、门报警、门开超时等; ? 默认支持2—4个weigend 读卡器,自动适应26、34、37协议; ? 支持多达6 个输出,分别控制门和报警输出联动; ? 多门控制器支持互锁、防潜返功能; ? 所有设备可以混合安装在一个系统里面; ? 配合软件支持考勤、实时在线巡更功能。支持多用户多机实时管理监控; ? 内置web 网页,同时可以网络实时监控; 2.T CP/IP控制器特性 以太网门禁控制器是专门为对通信要求比较高而设计的门禁设备。具有远程升级、远程初始化、数据 复位、防区功能的功能;可以扩展的485 接口空间;支持多达6个输出和10 个输入。是一个可以通过以太 网进行远程管理的门禁系统。型号有单门、双门、4门等。 ? 标准10M TCP/IP 通讯; ? 大容量存储卡,支持远程升级版卡容量4000,刷卡记录4000,报警记录6000; ? 标准版卡容量54000,刷卡记录60000,报警记录20000(控制器的记录保存在Flash 里面。在 脱 机状况下,如果记录(刷卡记录和报警记录)超出容量,将覆盖最早的记录);双存储器,卡数据、

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.sodocs.net/doc/9c12395113.html,TB4 / / definition LCDc ontrol bits (note here can only register with LATB, you cannot directly use the

磁卡读卡器工作原理和作用,这位工程师讲得通俗易懂

磁卡读卡器工作原理和作用,这位工程师讲得通俗易懂 磁卡读卡器是一种读取卡片上数据的设备,它不仅可以支持卡片上数据的读取,同时还可以支持数据的写入。读卡器可以实现多种功能如自动收费、售卡、制卡等,具有实用、快捷、方便、可靠性高等特点。 磁卡读写器用于读写磁卡、存折的磁条信息,可广泛应用于金融、邮电、商业、交通、海关、会员卡消费和积分消费等领域。 本文通过磁卡读写器的实际设计案例剖析它的技术原理。 通过磁性图案存储信息的技术最早出现在音频记录领域。从那以后,这个概念已被扩展应用于许多不同产品,如软盘、音频/视频磁带、硬盘以及磁条卡。本文将主要讨论在全球金融交易和门禁控制中得到广泛使用的磁条卡。 读取磁条卡除了需要解码数据的数字逻辑外还要求很重要的模拟电路。在磁卡上记录数据是数字化的过程,通过沿着磁条长度磁化粒子完成。而成功读取磁卡具有相当大的挑战性,因为在实际应用中传感器信号的幅度会随着划卡速度、磁卡质量和读卡磁头的灵敏度而变化。此外,频率也会随着划卡速度变化而变化。这就要求模拟电路能够适应这种变化,无失真地处理传感器信号。本文将介绍如何处理传感器信号变化的机制。 磁性与磁卡 为了理解划卡速度、磁卡质量和传感器灵敏度的影响,了解信息是如何存储在卡上的以及如何被读卡头检测出来很重要。在磁性存储系统中,信息用诸如氧化铁等磁化材料上的极性图案表示。图1显示了涂覆在磁化材料上的磁条。磁化材料上的颗粒可能处于某种特定的排列方向,或者因以前没有受到特定方向磁场的照射而处于随机方向。然而,如果施加一定的外部磁场,磁条上的颗粒将按照外部磁场排列方向。 图1:在外部磁场的影响下磁化材料按特定方向排列 在实用化系统中需要用到一个写入磁头,它其实就是绕在磁心上的一个线圈。通过控制线

门禁控制器接线原理图

门禁系统操作手册门禁控制器接线原理图

1

一.设备特性:1.485控制器特性第一部分门禁控制器硬件手册 门禁系统操作手册 485 门禁控制器使用标准的工业串口通信,通信距离可达1200 米,每个总线可以接255 台设备,使用485 集线器可以扩展多条总线。支持多达6 个输出和10 个输入。型号有单门、双门、4门等。 标准485(波特率9600)通讯; 大容量存储卡,54000 卡记录,60000 刷卡记录,10000 报警记录(控制器的记录保存在Flash 里面; 双存储器,卡数据、刷卡记录分别存储,数据不易丢失;在脱机状况下,如果记录(刷卡记录和报 警记录)超出容量,将覆盖最早的记录); 开门时区设置多达16 组,且可以分别设定对应的多种开门方式,如卡、卡+密码、密码、双卡、首卡开门等; 支持远程操作开关门、远程开关火警、报警。支持软件锁门常闭功能; 支持多个报警事件的报警输出,如无效卡、无效时间、门报警、门开超时等; 默认支持2—4个weigend 读卡器,自动适应26、34、37协议; 支持多达6 个输出,分别控制门和报警输出联动; 多门控制器支持互锁、防潜返功能; 所有设备可以混合安装在一个系统里面; 配合软件支持考勤、实时在线巡更功能。支持多用户多机实时管理监控; 内置web 网页,同时可以网络实时监控; 2.T CP/IP控制器特性 以太网门禁控制器是专门为对通信要求比较高而设计的门禁设备。具有远程升级、远程初始化、数据 复位、防区功能的功能;可以扩展的485 接口空间;支持多达6个输出和10 个输入。是一个可以通过以太 网进行远程管理的门禁系统。型号有单门、双门、4门等。 标准10M TCP/IP 通讯; 大容量存储卡,支持远程升级版卡容量4000,刷卡记录4000,报警记录6000; 标准版卡容量54000,刷卡记录60000,报警记录20000(控制器的记录保存在Flash 里面。在脱

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--); }

基于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

一种简易的125khz读卡器设计原理

一种简易的EM 125khz读卡器设计原理 2008年12月04日星期四 22:52 等时间间隔指令分组并行处理的只读型射频卡读卡器的设计 徐寅林,倪维柱,朱松盛 南京师范大学物理科学与技术学院,江苏南京210097 2008-07-17 摘要:传统只读射频卡读卡器的设计一般采用U2270B或P4095读写基站芯片加MCU模式,其成本高、功耗大。本文介绍一种仅采用一片89C2051加少量普通元件构成的读卡器电路以及独特的等时间间隔指令分组并行处理的程序设计方案,电路简单、功耗小、成本低。 关键词:射频卡读卡器等时间间隔指令分组并行处理 非接触式只读型IC卡又称只读射频卡(RFID),经过多年的发展和推广,已经广泛应用于身份识别和寻址控制,如门禁、保安、考勤、食堂等领域。目前已逐步扩展应用到展览会、公园、旅店、餐厅等公共场所的门票、优惠卡以及生产过程、邮政包裹、航空铁路运输、产品包装、交通等部门的物流、电子标签、防伪标志、一次性票证等众多领域。

率为125kHz ,高频卡的工作频率为13.56MHz 。其中瑞士EM 微电子公司的EM4100低频卡及兼容系列由于价格低、读卡距离远、读卡器简单而应用最为广泛。 传统的低频射频卡读卡器的设计一般采用U2270B 或P4095读写基站芯片+MCU 模式,电路相对复杂,成本较高。本文介绍一种新颖的射频卡读卡器,该读卡器采用独特的等时间间隔指令分组并行处理的程序设计方案,充分利用89C2051的潜在功能,舍去了读写基站芯片,因而硬件电路大大简化。该类型的读卡器读卡距离与采用读写基站芯片的读卡器相当,但电路功耗低、硬件成本仅为传统读卡器的一半左右,因此多年来已生产大量产品,运行使用情况良好。 1 EM4100射频卡简介 EM4100是一种广为使用的只读射频感应卡,其内部ROM 保存着10位十进制卡号数据。当它被放在一个频率125kHz 交变电磁场时感应获得能量驱动 ,射频卡内置天线环路等效负载的改变,势必造成射频卡对交变电磁场能量吸收数量的改变。如果这个天线环路等效负载是按照一定时序变化的,就可以对该外部交变电磁场实现反调制,从而将其内部芯片数据反馈传递给读卡器。 EM4100采用Manchester(曼彻斯特)调制格式编码。一旦射频卡获得有效能量,它就会周而复始地向外发送64个数据位信息(称之为一帧数据),位传送率为RF/64,即每一位信息时长为64个外部电磁场波动周期,也就是64位信息位中包括9位‘1’的同步引导头,40位的卡号数据,14位奇偶校验以及 1位停止位。全部64位信息由制造商生产时编程刻录在ROM 中,其卡号数据是全球唯一的。 图1为曼彻斯特编码示意图,在一个数据位的中间时刻,信号的上跳变表示数据“1”的编码;信号的下跳变表示数据“0”的编码。 表1为EM4100射频卡内部64数据位信息定义。

SD卡SPI读写中文资料

7S P I模式 本文是小弟自己翻译的(处女作哦~~~~~),难免有不妥之处,望交流指教! 联系方式 QQ:286225453 Email:ioro55555@https://www.sodocs.net/doc/9c12395113.html, 7.1介绍 SPI模式 SPI模式由二次传递协议组成,这个协议由Flash(基于SD卡)提供。本模式是SD卡协议的子协议,目的是用SPI信道通讯。SPI模式在SD卡上电后第一个复位指令(CMD0)执行后被选择,并且在接通电源时不能改变。SPI标准定义 7.2 SPI总线 SD卡信道由指令和数据位(起始位和结束位)组成,SPI信道由字节定向。每一个指令或数据块由8位的字节和CS标志构成。类似SD卡协议, SPI通讯由指令、响应和数据组成。全部的主机与SD卡之间的通信由主机控制。主机执行每一跟CS标志为低的总线。SPI模式与SD模式的响应特性有以下三方面不同∶ 1、被选择的卡始终对指令作出反应。 2、一个附加的(8BIT)响应产生。 3、在SD卡遇到数据检索问题时,它会作出错误反应,而不是像在SD模式中一样执行一次空操作。 除命令响应之外,每一个数据块在写操作期间会作出专门的信息响应标志反应发送给SD卡。数据块可以大到一个扇区小到一个字节。读/写操作由CSD(指令信号译码器)寄存器操作。 7.2.1模式选择 SD卡在上电后自动SD模式。如果CS标志在接受复位指令(CMD0)期间为低,它将进入SPI模式并且处于空闲状态。如果SD卡识别到需要保持SD模式,它不会对指令作出任何反应并且保持在SD模式中。如果需要SPI模式,SD卡将转到SPI模式并且进行SPI模式R1响应。回到SD模式的必须重新上电。在SPI 模式下,SD卡遵守部分协议系统。支持SPI模式的SD卡指令始终有效。 7.2.2总线传送保护 SPI模式

相关主题