SD卡读写器制作.docx

上传人:小飞机 文档编号:4924773 上传时间:2023-05-23 格式:DOCX 页数:28 大小:522.46KB
返回 下载 相关 举报
SD卡读写器制作.docx_第1页
第1页 / 共28页
SD卡读写器制作.docx_第2页
第2页 / 共28页
SD卡读写器制作.docx_第3页
第3页 / 共28页
SD卡读写器制作.docx_第4页
第4页 / 共28页
SD卡读写器制作.docx_第5页
第5页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《SD卡读写器制作.docx》由会员分享,可在线阅读,更多相关《SD卡读写器制作.docx(28页珍藏版)》请在三一办公上搜索。

1、摘要随着嵌入式处理器计算机能力的不断提高,32位MPU已成为嵌入式系统应 用的主流。在ARM9嵌入式处理器和mC/OS-II操作系统基础上采用SD卡设计开 发了一种嵌入式文件系统,该系统具有支持多操作系统、易于移植和存储速度快 的特点。本文在三星ARM9-S3C2440上实现了 MMC /SD卡的硬件扩展,设计了此 硬件平台上的MMC /SD卡在L inux下的驱动,并给出了相应的关键代码。关键词:嵌入式Linux; MMC /SD卡;Linux设备驱动;S3C2440目录1, 概述31.1 SD卡简介31.2系统研究背景32, 方案论述42.1 SD卡工作原理42.1.1 SD卡内部结构及引

2、脚如下图所示42.1.2 SD卡指令数据包42.1.3 SD卡接口电路53, 芯片选择63.1 S3C2440 的简介63.2硬件资源63.3物理特性63.4核心板展示74, 总体框图76.1源程序代码96.2读SD卡流程图106.3写SD卡流程图11总结12参考文献13附录1: SD卡命令表14附录2:源代码清单16附录3:原理图28附录4: PCB图311.概述1.1 SD卡简介 SD卡是基于flash的存储卡。SD卡和MMC卡的区别在于初始化过程不同。 SD卡的通信协议包括SD和SPI两类。 SD卡使用卡内智能控制模块进行FLASH操作控制,包括协议、安全算法、数据存取、 ECC 算法、

3、缺陷处理和分析、电源管理、时钟管理 SD卡(Secure Digital Memory Card)是一种为满足安全性、容量、性能和使用环境 等各方面的需求而设计的一种新型存储器件,SD卡允许在两种模式下工作,即SD模式 和SPI模式。1.2系统研究背景本设计旨在深入对ARM的学习,巩固大学四年所学专业知识,提升动手能力和思考问 题解决问题的能力。本设计选择S3C2440系列处理器,通过自制S3C2440开发板的过程, 和对S3C2440芯片的研究学习,掌握其各种外设功能。SD读卡器就是读取sd存储卡的设 备。目前在市面上最常见的存储卡SD Memory(SD卡)。该存储卡现在被广泛应用于数码

4、相机、DV、MP4、MP3随身听、PDA掌上电脑、多媒体手机。为了便于使存储卡所携带资 料能够被更多人使用,读卡器随之产生。SD读卡器一般极其便于携带,大小就像一个优盘, 插上SD卡后的读卡器跟优盘功能就一样了。同样使用USB接口。读卡器对计算机来说类 似一个USB的软驱,作用也类似,只是读取的不是软盘,而是各种闪存卡。使用时就把手 中SD闪卡按照提示插入对应卡槽,再把另一头的USB头插入计算机USB插座,只有正确 插入才有相应显示并能够读写卡中资料。2. 方案论述2.1 SD卡工作原理2.1.1 SD卡内部结构及引脚如下图所示Card interface controlter resetco

5、cgwn & a若 dMsEory oore interfaceDAT2CMDCLKDATOCD/DAT3Interface driverDAT1图1 SD卡内部结构及引脚2.1.2 SD卡指令数据包sd卡的指令被封装成48位的数据包,每次传送这48位的数据包。数据包的内容包括 起始位(1bit)、传输位(1bit)、命令索引(6bit)、传输参数(32bit)、CRC校验码(7bit) 和结束位(1bit)。其具体格式分布如下表:Bit位置474645:4039:0807:0100Bit宽度1163271值“0”“1”xxx“1”说明Start bitTransmission bitComm

6、and indexArgumentCRC7End bit表1 SD数据包其中的命令索引位是45: 40,里面可以封装各种命令,具体的命令表将在下面给出。 不同的命令会对应不同的回应(respond),回应有三种(R1,R2,R3)格式,在附录1 SD卡命 令表中的选项会给出。2.1.3 SD卡主要引脚和功能为: CLK:时钟信号,每个时钟周期传输一个命令或数据位,频率可在025MHz之间变化, SD卡的总线管理器可以不受任何限制的自由产生025MHz的频率; CMD:双向命令和回复线,命令是一次主机到从卡操作的开始,命令可以是从主机到 单卡寻址,也可以是到所有卡;回复是对之前命令的回答,回复可

7、以来自单卡或所有 卡; DAT03:数据线,数据可以从卡传向主机也可以从主机传向卡。SD卡以命令形式来 控制SD卡的读写等操作。可根据命令对多块或单块进行读写操作。在SPI模式下其命 令由6个字节构成,其中高位在前。SD卡命令的格式如表1所示,其中相关参数可以 查阅SD卡规范。2.1.3 SD卡接口电路|UDD33 OR121CKR15 10K(GPG10)(GPHS) SDDATA2 SDDATA3 SDCMD、SDCLK、SDDATAO、SDWITA1、EINT1S、UCLKVDD33 O-R13 10KCZ2R41 47R42 47Rlfi10KR1S 1CKR17 10KVC65 lO

8、wPiev10H124 yR14 10KDAT2_DAT3-!CSCMDTflVSS1VDDCLKSCKVSS2DATO-DODATLTRQ CARDJNSERT GMDCARD WPSDCAKDEl 1.1 SD卡接口电路3. 芯片选择3.1 S3C2440 的简介S3C2440A微处理器是一款由Samsung半导体公司推出的高性能、低功耗、高集成度并具有 工业级温度范围和性能的微处理器,经过工业级EMC测试,相对S3C2440A有以下优势: 具有工业级温度范围 主频高达533MHz03-具有数字摄像头接口 更低的内核电压 支持更多分辨率液晶屏 支持多种电压存储器 具有AC97编解码器接口

9、具有更多可用的I/O 口 UART 口输入输出各具有64字节FIFO 无需外围电路的触摸屏接口3.2硬件资源 程序处理器:Samsung的S3C2440A-40(ARM920T)微处理器,工作频率最高可达533MHz 内存:2 片 4BanksX4MbitsX16bits SDRAM,共 64MB;可扩展至 128MB Nandflash: 256MX8bits Nandflash (K9F2G08 Norflash: 4MB,支持容量128M或更高 时钟:12MHz系统外部时钟源;32.768KHz的RTC时钟源 电源:支持3.3V或5V电压(设计可选)供电3.3物理特性 六层板工艺,经过长

10、期强电磁环境考验,性能稳定 长70mm,宽50mm,独特的双列贴装使得底版布线更加容易 两条100PIN的连接器,另有一条16PIN,总计216pin,引出了所有可用接口3.4核心板展示图2 S3C2440芯片4. 总体框图LCD输出/ SD卡接口键盘输入5. 硬件设计本次课程设计利用S3C2440核心板制作SD卡读写器,用键盘输入,LCD显示屏做输 出,并用PC机进行手动调试,实现此次系统能够正常运行,达到预想到的效果。用串行总 线将PC机和实验板相连接,然后按照预期的步骤,进行操作。具体链接方式看附录3和4.6. 软件设计6.1 SD卡驱动具体实现首先需要完成的是定义(在嵌入式设备驱动开发

11、中非常重要)的头文件。(1) S3C2440中自带有SD卡控制器,所以必须在程序中将这部分的头文件包含进来:#include 2440addr.h#include 2440lib.h(2)确定设备名称、主/次设备号和中断号,确保将一个本系统中没有使用的主设备号分配 给SD卡驱动。主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设 备。在编写设备驱动程序的时候,需要指明所操作设备的主设备号和次设备号。本例采用了 SD驱动主设备号:234(由于只有一个SD卡设备,故次设备号:0)。6.2源程序代码见附录2开始Sd卡初始化发送写命令 CMD17应答=0XFE接收512B数据接收2字节

12、CRC结束返回发送512B数据发送2字节CRC码接收SD卡响应总结这次课程设计我们做的是基于S3C2440的SD卡读写设计,通过这次设计我们实现了对 SD卡的读写等基本操作。在这次实验中我们遇到了很多困难比如PCB图的绘制,基本上我 们都没有掌握于是我们齐心协力查阅资料经过多次失败后终于成功绘制了 PCB图。在做设 计之前我们分配了明确的任务,查阅资料编写程序内容排版紧而有序,各种发挥了各种的 特长又弥补了自己的不足,可谓受益匪浅。总的来说,这次课程设计完成的效果还是很不错 的,在获得成就感的同时我们学得了知识加强了同学之间的友谊。很期望在今后的课程设计 中我们还希望能互相学习共同提高。参考文

13、献I 李宏佳,徐晓晓,魏权利.基于ARM和SD卡的嵌入式文件系统研究与设计J.电子 设计应用. 纪竞舟,付字卓.嵌入式Linux下的MMC / SD卡的原理及实现iJ.计算机仿真,2005(1).3 张秀松,施金鸿.基于AT91RM9200的嵌入式工业控制系统设计l 微计算机信息, 2006(12): 45-47.4 周杰英,陈曼娜,王涛,等微机原理与接口技术开放性实验建设l J J.实验室研究与探 索.2007(9): 33 等.37.5 李长有等.基于C8051F020的SD卡主控制器的设计J.微计算机信 息,2007,23(9-2):120-122.6 周立功等.ARM嵌入式系统实验教程

14、M.北京:北京航空航天大学出版社,2005.1.7 唐清善.Protel DXP高级实例教程M.中国水利水电出版社,2004.4.8 罗浩等.一种新的基于ARM的数据采集系统设计J.信阳师范学院学报(自然科学版),2006.4.9 秦伟等基于ARM处理器的数据采集系统的设计J.自动化技术与应用.2006年第1期.10 杜春雷.ARM体系结构与编程.清华大学出版社,2003.II 李宁.ARM开发工具ReaIView MDK使用入门M.北京航空航天大学出版社,2008.12李宁.基于MDK的STM32处理器开发应用M.北京航空航天大学出版社,2008.14赵葵银,王辉,吴俊.电压空间矢量控制的三

15、相PWM整流器的研究J.上海第二附录附录1: SD卡命令表CMD简略语指令说明SPI模式自变量回应0GO_IDLE_STATE这是使card初始化到 Idle状态的指令.CS信号 设在Low的状态时,接到 本指令后,card将转换 至0SPI模式.NoneR11SEND_OP_COND接到本指令后,card将做 R3回应(含有OCR数 据).根据OCR值,可以得 知口 card能工作电压范 围.OCR数据最高值位 的1 bit是用来确认card 内部处理是否结束 (Ready/Busy 轮询).NoneR12ALL_SEND_CID接到本指令后,处于 Ready状态的card将传 送CID数据

16、.在MMC模 式下,数据被送到CMD 信号,在C ID数据的每 1bit传送后,CM D信号状 态将与该card内部状态 相比较,如果不一致,将 中止数据传送,card返回 到Ready状态.如果相一 致,该card将认为已被 选中,然后转换到 Identification 状态.3SET_RELATIVE_ADDR本指令会为已转换到 Identification 状态的 card 分配一个相对card地址 (RCA).当RCA分配 后,card将转换到 Stand-by状态,对以后 的CMD2和C MD3不回 应.4NOP这是用来设定DSR(DriveState 寄 存器)的指令,但是本ca

17、r不支 持DSR.7SELECT/DESELECT_CARD本指令是用来选择一张 card,让它在 Stand-by状 态和 Transfer状之 间 转换的指令.如果给card 设定已分配到的RCA地 址,card】 从 Stand-by 状 态转换到Transfer状态, 并将回应以后的读取指 令及其他指令.如果给 card设定RCA以外的地 址,card将转换到 Stand-by状 态。当 RCA=0000h 时,card 将无 条件地转换到Stand-by 状态.9SEND_CSD接到本指令后,将传送 CSD数据.NoneR110SEND_CID接到本指令后,将传送 CID数据.Non

18、eR111READ_DAT_UNTIL_STOP接到本指令后,将从设 定的地址传送P2ROM 数据,直到接到指令 CMD12为止.12STOP -TRANSMISSION本指令强行终止C MD11和C MD18的处理NoneR113SEND_STATUS接到本指令后,将传送 状态寄存器的信息.NoneR215GO_INACTIVE _STATE接到本指令后,将转换 到休止(inactive)状态.16SET_BLOCKLEN本指令用来设定Block 长度.对象是以后的指 令 CMD17 和 CMD18.31:00 block lengthR117READ_SINGLE _BLOCK接到本指令后

19、,将从自 变量设定的地址传送1 个block长度的数 据.(block长度由指令 CMD16 设定).31:00 data addressR118READ_MULTIPLE _BLOCK接到本指令后,将从自 变量设定的地址连续传 送block长度的数据,直 到接到指令CMD12为 止.(block长度由指令31:00 data addressR1CMD16 设定).23SET_BLOCK _COUNT本指令是给紧跟的指令 CMD18设定要传送的 block数量.31:16set to 015:00nu mber of blockR124WRITE_BLOCK接到本指令后,将写1个 block长

20、度的数据到自 变量设定的地址.(block 长度由指令CMD16设 定).31:0 data addressR125WRITE_MULTIPLE_BLOCK接到本指令后,将连续 写block长度的数据到自 变量设定的地址,直到 接到指令CMD12为 止.(block长度由指令 CMD16 设定).31:0 data addressR158READ_OCR接到本指令后,Card将 传送OCR数据.NoneR359CRC_ON_OFF本指令是用来设定CRC 选项为ON或OFF.在 SPI模式下,CRC的初始 值设定为OFF.CRC选 项bit=1表示 CRC ON;CRC 选项bit=0表 示 C

21、RC OFF.31:01 stuff bits 00:00 CRC optionR1附录2:源代码清单#include #include #include option.h #include 2440addr.h#include 2440lib.h#define MAGIC_NUMBER 64#define INICLK 300000#define SDCLK 24000000#define POL 0#define INT 1#define DMA 2 int CMD13(void);int CMD9(void);unsigned int *Tx_buffer;unsigned int *R

22、x_buffer;volatile unsigned int rd_cnt;volatile unsigned int wt_cnt;volatile unsigned int block;volatile unsigned int TR_end=0 int Wide=0;int MMC=0;int Maker_ID;char Product_Name7;int Serial_Num;int PCLK = 50000000;volatile int RCA;void Test_SDI(void)(U32 save_rGPEUP, save_rGPECON;RCA=0;MMC=0;block=3

23、072;save_rGPEUP=GPEUP;save_rGPECON=GPECON;GPEUP = 0xf83f;GPECON = 0xaaaaaaaa;if(!SD_card_init()return;TR_Buf_new();Wt_Block();Rd_Block();View_Rx_buf();Card_sel_desel(0);if(!CMD9()SDIDCON=0;/tark?SDICSTA=0xffff;GPEUP=save_rGPEUP;GPECON=save_rGPECON;void TR_Buf_new(void)(int i, j;Tx_buffer=(unsigned i

24、nt *)0x31000000;j=0;for(i=0;i2048;i+)*(Tx_buffer+i)=i+j;Flush_Rx_buf();void Flush_Rx_buf(void)(int i;Rx_buffer=(unsigned int *)0x31800000;for(i=0;i2048;i+)*(Rx_buffer+i)=0;void View_Rx_buf()(int i;Rx_buffer=(unsigned int *)0x31800000;for(i=0;i2048;i+) /128word*16blk=8192byte *(Rx_buffer+i)=0;void Vi

25、ew_Rx_buf()(int i,error=0;Tx_buffer=(unsigned int *)0x31000000;Rx_buffer=(unsigned int *)0x31800000; for(i=0;i128*block;i+) ( if(Rx_bufferi != Tx_bufferi) ( error=1; break; if(!error) (Printf(nThe Tx_buffer is same to Rx_buffer!n); Printf(SD CARD Write and Read test is OK!n);void View_Tx_buf(void)(i

26、nt SD_card_init(void)(int i;SDIPRE=PCLK/(INICLK)-1; / 400KHz/Uart_Printf(Init. Frequency is %dHzn”,(PCLK/(SDIPRE+1);SDICON=(14)|1; / Type B, clk enableSDIFSTA=SDIFSTA|(116); /YH 040223 FIFO reset SDIBSIZE=0x200; / 512byte(128word) SDIDTIMER=0x7fffff; / Set timeout count for(i=0;i0x1000;i+); / Wait 7

27、4SDCLK for MMC card CMD0();/Uart_Printf(In idlen); /- Check SD card OCR if(!Chk_SD_OCR() (GPBDAT = (25);/点亮 LED2/Uart_Printf(Initialize failnNo Card assertionn); return 0;GPBDAT = (15);/点亮 LED1do (/- Check attaced cards, it makes card identification state SDICARG = 0x0; / CMD2(stuff bit)SDICCON = (0

28、x1 10) | (0x1 9) | (0x1 8) | (MAGIC_NUMBER | 2); /lng_resp, wait_resp, start, CMD2/- Check end of CMD2 while (!Chk_CMDend(2, 1); SDICSTA=0xa00; / Clear cmd_end(with rsp) /Uart_Printf(End idn); do (SDICARG = MMC SBZ) SDICCON= (0x1 9) | (0x1 16;/Uart_Printf(RCA=0x%xn”,RCA);SDIPRE = PCLK / (SDCLK) - 1;

29、 / Normal clock=25MHz /Uart_Printf(SD Frequency is %dHzn,(PCLK/(SDIPRE+1);/-State(stand-by) check if (SDIRSP0 & 0x1e00 != 0x600) / CURRENT_STATE check continue; while (0);/Uart_Printf(In stand-byn);Card_sel_desel(1);Set_4bit_bus();return 1;void Card_sel_desel(char sel_desel)(if(sel_desel)(do(SDICARG

30、 = RCA 16; / CMD7(RCA,stuff bit)SDICCOI= (0x1 9) | (0x1 8) | (MAGIC_NUMBER | 7); / sht_resp, wait_resp, start, CMD7if (!Chk_CMDend(7, 1) continue;SDICSTA = 0xa00; / Clear cmd_end(with rsp) if (SDIRSP0 & 0x1e00 != 0x800) continue; while (0);else(do(SDICARG = 0 16; /CMD7(RCA,stuff bit)SDICCON= (0x1 8)

31、 | (MAGIC_NUMBER | 7); /no_resp, start, CMD7 /- Check end of CMD7 if (!Chk_CMDend(7, 0) continue; while (0);SDICSTA=0x800; / Clear cmd_end(no rsp)void Rd_Block(void)(U32 mode;int status;rd_cnt=0;mode = 0 ;SDIFSTA=SDIFSTA|(116); / FIFO reset if(mode!=2)SDIDCON=(222)|(119)|(117)|(Wide16)|(114)|(212)|(

32、block0);RERDCMD:switch(mode)( case POL: if(block2)(SDICCON=(0x19)|(0x18)|(MAGIC_NUMBER| 17); dat, start, CMD17 if(!Chk_CMDend(17, 1) /- Check end of CMD17 goto RERDCMD;else(SDICCON=(0x19)|(0x18)|(MAGIC_NUMBER |18);if(!Chk_CMDend(18, 1) goto RERDCMD;SDICSTA=0xa00;while(rd_cnt128*block) / 512*block by

33、tes ( if(SDIDSTA&0x20)=0x20) / Check timeout ( SDIDSTA=(0x10x5); / Clear timeout flag break;status=SDIFSTA;if(status&0x1000)=0x1000) / Is Rx data? ( *Rx_buffer+=SDIDAT; rd_cnt+; break; default:break;if(!Chk_DATend()SDIDCON=SDIDCON&(71) ( RERCMD12:SDICARG=0x0;SDICCON=(0x19)|(0x18)|(MAGIC_NUMBER | 12)

34、; if(!Chk_CMDend(12, 1) goto RERCMD12;SDICSTA=0xa00;void Wt_Block(void) (U32 mode;int status;wt_cnt=0;mode = 0 ;SDIFSTA=SDIFSTA|(116); /YH 040223 FIFO reset if(mode!=2)SDIDCON=(222)|(120)|(117)|(Wide16)|(114)|(312)|(block0); default: break;if(!Chk_DATend()/Uart_Printf(dat errorn);SDIDCON=SDIDCON&(7

35、no operation, Cleata Data Transfer startSDIDSTA=0x10; / Clear data Tx/Rx endif(block1) ( REWCMD12:SDIDCON=(118)|(117)|(016)|(114)|(112)|(block0);SDICARG=0x0;/CMD12(stuff bit)SDICCON=(0x19)|(0x1 0; dly-); int Chk_CMDend(int cmd, int be_resp)/0: Timeout(int finish。;if(!be_resp) / No response(finish0=S

36、DICSTA;while(finish0&0x800)!=0x800)/ Check cmd endfinish0=SDICSTA;SDICSTA=finish0;/ Clear cmd end statereturn 1;else / With response(finish0=SDICSTA;while( !( (finish0&0x200)=0x200) | (finish0&0x400)=0x400)/ Check cmd/rsp endfinish0=SDICSTA;if(cmd=1| cmd=41) /CRC no check, CMD9 is a long Resp. comma

37、nd. (if( (finish0&0xf00) != 0xa00 ) / Check error(SDICSTA=finish0; / Clear error stateif(finish0&0x400)=0x400) return 0;/ Timeout error SDICSTA=finish0; / Clear cmd & rsp end state else / CRC check (if( (finish0&0x1f00) != 0xa00 ) / Check error(/Uart_Printf(CMD%d:SDICSTA=0x%x, SDIRSP0=0x%xn”,cmd, SD

38、ICSTA, SDIRSP0);SDICSTA=finish0; / Clear error stateif(finish0&0x400)=0x400)return 0;/ Timeout errorSDICSTA=finish0;return 1;int Chk_DATend(void)(int finish;finish=SDIDSTA;while( !( (finish&0x10)=0x10) | (finish&0x20)=0x20)/ Chek timeout or data end finish=SDIDSTA;if( (finish&0xfc) != 0x10 )(/Uart_P

39、rintf(DATA:finish=0x%xn”, finish);SDIDSTA=0xec; / Clear error state return 0;return 1;int Chk_BUSYend(void)(int finish;finish=SDIDSTA;while( !( (finish&0x08)=0x08) | (finish&0x20)=0x20) finish=SDIDSTA;if( (finish&0xfc) != 0x08 )(/Uart_Printf(DATA:finish=0x%xn”, finish);SDIDSTA=0xf4; /clear error sta

40、te return 0;return 1;void CMD0(void)(/- Make card idle stateSDICARG=0x0;/ CMD0(stuff bit)SDICCON=(18)|(MAGIC_NUMBER | 0);/ No_resp, start, CMD0/- Check end of CMD0Chk_CMDend(0, 0);SDICSTA=0x800; / Clear cmd_end(no rsp) int Chk_SD_OCR(void) ( int i;/- Negotiate operating condition for SD, it makes ca

41、rd ready state for(i=0;i50;i+) /If this time is short, init. can be fail. (CMD55();/ Make ACMDSDICARG=0xff8000; /ACMD41(SD OCR:2.7V3.6V)SDICCON=(0x19)|(0x18)|(MAGIC_NUMBER |41);/sht_resp,wait_resp, start, ACMD41 if( Chk_CMDend(41, 1) & SDIRSP0=0x80ff8000 ) ( SDICSTA=0xa00; return 1; Delay(20000); SDICSTA=0xa00; return 0; int CMD55(void) ( /-Make ACMD SDI

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号