读写SDMMC卡_SmartARM2200_

合集下载

SmartARM2200

SmartARM2200

第1章SmartARM2200教学实验开发平台1.1 总体特性定位:z高校嵌入式系统创新实验室首选平台;z面向产品开发的工程师;z面向在校研究生和有购买能力的个人。

SmartARM2200是广州致远电子有限公司精心设计的一款ARM嵌入式系统开发平台。

支持多种嵌入式操作系统,提供丰富的配套教材和众多的实验例程,提供多种的商业化软件包,并配备精心设计的多媒体教学课件,既适合于进行ARM7嵌入式系统开发的工程师,亦适合于高校嵌入式系统教学。

z支持多种CPU¾全面支持12种型号的144 PIN ARM7微控制器――LPC2100 (LPC2114/2124/2119/2129/2194)――LPC2200 (LPC2210/2220/2212/2214/2290/2292/2294)z附送仿真器¾完全自主设计的软硬件、拥有自主版权的JTAG仿真技术,支持ADS1.2集成开发环境及PHILIPS所有通用ARM微控制器的仿真和开发z支持多种可选嵌入式操作系统¾µC/OS-II嵌入式实时操作系统¾µCLinux操作系统z配套丰富的教材¾《ARM嵌入式系统基础教程》(标配)¾《ARM嵌入式系统实验教程(二)》(标配)¾《ARM嵌入式软件开发实例(一)》¾《ARM嵌入式软件开发实例(二)》¾《ARM嵌入式Linux系统构建与驱动开发范例》¾《ARM嵌入式MiniGUI初步与应用开发范例》z多媒体教学课件¾耗时半年之久,倾力制作¾大量动画突出重点和难点,层层剥笋由浅入深¾紧扣教材主线,任君裁剪z附带众多源码和软件包¾众多实验例程和源代码¾众多商业化软件包z免费捆绑MiniGUI学习版软件(单独销价129元)¾北京飞漫出品,周立功公司独家代理¾提供MiniGUI for µCLinux移植实验,MiniGUI应用实例¾免费提供MiniGUI-STR软件包1.2 参考图片z主板――4层PCB设计,超强抗干扰z板上资源¾2M字节NOR FLASH¾8M字节PSRAM¾16M字节NAND FLASH¾256字节E2PROMz众多扩展部件¾标准20针JTAG调试接口/ETM跟踪调试接口¾CF卡/IDE硬盘接口¾SD/MMC卡模块¾2路10位A/D¾LM75数字温度传感器¾ZLG7290键盘管理和显示控制¾MG240128单色点阵图形液晶接口¾GPIO引出,方便功能扩展¾各功能部件可以通过跳线灵活选择z多种通信接口¾双串口,串口1带Modem接口¾10M以太网接口¾2个USB HOST 2.0(全速)¾1个USB Device 2.0(全速)z多种人机交互界面¾1个2.2英寸240×320 262K色彩色液晶屏¾4个独立LED¾1个蜂鸣器¾1个独立按键¾4×4矩阵键盘z精美布局,人性化设计¾精心设计外壳,完美感观享受¾专业、进取完美结合1.3 丰富的配套模块z LPC2103 PACK板EasyARM2200实验开发平台的用户可以通过选配LPC2103 PACK板无缝升级到LPC2103开发平台。

建立交叉编译步骤周立功smart2200

建立交叉编译步骤周立功smart2200

建立交叉编译步骤周立功smart2200**建立交叉开发环境**由于目标板平台处理器是ARM,因而需要安装GCC针对ARM的编译器。

适用于μCLinux的编译器为arm-elf-gcc。

安装arm-elf-gcc步骤:(1)将光盘附带的文件arm-elf-tools-20040427.sh拷贝到目录如/usr/src 下,为arm-elf-tools-20040427.sh增加可执行权限(如果已经具有可执行权限,这步可省略)。

注意:增加权限必须具有root权限,若没有root权限,请先为用户增加root权限(命令su)。

#chmod 755 arm-elf-20040427.sh(2)安装arm-elf-gcc。

执行arm-elf-tools-20040427.sh。

./arm-elf-tools-20040427.sh安装完毕后,查看/usr/local/bin目录下是否存在arm-elf-gcc等文件,如果存在,基本可以确定交叉编译器安装成功。

(3)添加交叉编译器的路径。

一般情况下安装过程会自动执行,并在下次启动还有效。

export PATH=$PATH:/usr/local/arm-elf/bin**安装μCLinux**1:将光盘附带的μCLinux源码包uClinux-dist-20040408.tar.gz拷贝到目录如/usr/src下,并解压。

tar xzvf uClinux-dist-20040408.tar.gz解压后,在当前目录下会多出文件夹uClinux-dist,即μCLinux源代码目录。

2:为SmartARM2200开发板和LPC2200芯片打补丁。

将光盘附带的补丁文件uClinux-dist-20040408-lpc-chy-cmj.patch拷贝到当前目录下,并执行:cat uClinux-dist-20040408-lpc-chy-cmj.patch|patch– p1–duClinux-dist为LPC2200打补丁后,在μCLinux平台内核配置的时候将会有LPC2200的选项。

SMARTARM2200调试初体验

SMARTARM2200调试初体验

SMARTARM2200调试初体验去年8月购买了ZLG的Smart2000,由于工作的缘由,向来没能抽空学习,到了春节前后最终可以抽空学习ARM了。

我在互动出版社购买了一批书籍,希翼能ARM迅速入门并尽快提高。

开头举行ARM理论学习,我是参考ZLG的《ARM系统基础教程》,同时我又温习了下C51的学问,希翼在ARM中学习中能把C51也灵便把握。

接着就是用SmartARM2000开发板做试验,需要安装ARM开发环境,详细步骤可参见本人的《ARM学习进阶(1)-ARM开发环境的配置》。

按配套试验教程《ARM嵌入式系统试验教程(二)》的要求完成了其次章的基础试验,因为是挺直运行配套光盘的DEMO源程序,每个试验都是针对某个功能部件,所以都比较顺当。

后来试着自己编了几个程序来同时实现几个不同部件功能,结果也还惬意。

为了在SmartARM2000上做基于UC/OS-II的试验,还需要UC/OS-II 2.52的源代码。

我找出2002年买的《嵌入式实时操作系统UC/OS-II(邵贝贝译)》配套光盘,里面正巧有UC/OS-II 2.52的源代码,这样开发环境也具备了。

按试验教程运行DEMO源程序,运行正常。

自己也试着编写OS系统,运行基本达到预期。

用SmartARM2000开发板我举行了配套教程第2~4章的试验内容,也按自己的设想完成了多个试验,对ARM的性能有了长进的了解。

但是试验中也碰到些莫名的问题至此仍然不解,ZLG的技术支持也没能给出惬意的答复,希翼能解惑的大侠能抽空赋予解答:(1)JP1-ISP、JP9-OUTSIDE/INSIDE、JP10-BANK0/1设置都正确的状况下,以前在外部RAM调试方式下能正常运行的程序骤然不能运行了,可这程序在外部FLASH调试方式下正常运行,用LPC2294举行内部FLASH脱机运行也正常;然后某天再用SmartARM2000开发板调试时,即使在外部RAM调试方式下也能正常运行了。

sd卡读写模块的用法

sd卡读写模块的用法

sd卡读写模块的用法
SD卡读写模块是一种用于读写SD卡存储设备的模块。

它通常通过SPI或SDIO接口与主控制器(如单片机、开发板等)连接,并提供读
取和写入SD卡的功能。

使用SD卡读写模块的步骤如下:
1.初始化:通过控制模块的引脚,配置SPI或SDIO接口的工作模
式和相关参数。

2.卡插入检测:通过检测SD卡插槽的接触状态,确定是否插入了SD卡。

3.卡初始化:对SD卡进行初始化操作,包括发送命令和接收响应,以确认SD卡的类型和性能等信息。

4.数据读取:发送读取命令和地址,接收SD卡返回的数据。

5.数据写入:发送写入命令和地址,将数据写入SD卡的指定块位置。

在使用SD卡读写模块时,我们还可以拓展以下几个方面:
1.多线程读写:通过同时使用多个SPI或SDIO接口,实现多个线程同时读写SD卡,提高数据传输速度。

2. SD卡文件系统:在SD卡中创建文件系统(如FAT32),将数据按照文件的形式进行存储和管理,提供更加灵活和高效的数据存储方式。

3.数据加密:将敏感的数据进行加密后再写入SD卡,防止数据泄露和篡改。

4.文件压缩:在将数据写入SD卡之前,使用压缩算法(如ZIP)对数据进行压缩,减小存储空间占用。

5.数据校验:在读取或写入数据时,进行校验(如CRC校验)以确保数据的完整性和准确性。

总之,SD卡读写模块的使用方式可以根据具体需求进行拓展,以实现更多功能和提升性能。

SDMMC卡初始化及读写流程分解

SDMMC卡初始化及读写流程分解

二、MMC/SD卡的模型和工作原理PIN脚、SD卡总线、SD卡结构、SD卡寄存器、上电过程SD卡寄存器:OCR:操作电压寄存器: 只读,32位第31位:表示卡上电的状态位CID: 卡身份识别寄存器只读128位生产厂商、产品ID,生产日期和串号等CSD:部分可写128位卡的容量、擦出扇区大小、读写最大数据块的大小、读操作的电流、电压等等 CSR: 卡配置寄存器64位数据位宽RCA:16位相关的卡地址寄存器,卡识别过程中主控器和卡协商出来的一个地址三、SD卡命令和响应格式命令和相应格式SD卡命令,命令类型,ACMD命令响应类型、卡类型、卡状态转换表命令的格式:48位起始位0 方向位(host to card: 1, card to host: 0)内容CRC7 结束位1·响应的格式:48位或者136位卡命令:命令的类型:bc: broadcast without Response 无响应的广播bcr: broadcast with Response 有响应的广播ac: Address(point-to-point) Command: 点对点,DATA0~DATA3数据线上无数据adtc: Adress(point-to-point) Data Transfer Commands 点对点,DATA0~DATA3数据线上有数据CMD0, CMD2, CMD3, CMD55, ACMD41 命令可能会导致卡的状态发生变化响应类型:R1,R1b, R2, R3,R6(SD2.0扩展了R7)扩展内容:SPI工作模式:要知道的特点:只支持一个卡,没有RCA,命令只是MMC/SD的基本的子集SDHC:(支持2GB~32GB):理解CMD8的作用,命令格式和响应,了解CSDV2.0寄存器做了扩展SDIO WIFI:增加CMD52,CMD53CMD8可以通过重新定义先前保留的位,来扩展一些已经存在的命令的新功能。

SmartARM2200出厂程序的烧写

SmartARM2200出厂程序的烧写

第1章 SmartARM2200开发板出厂编程文件的烧写1.1 下载ZLG_BOOT可以通过串口和以太网下载ZLG_BOOT。

串口下载较慢,以太网下载较快,请根据自身情况选择。

1.1.1 串口下载将开发板JP3断开,将JP1、JP2和JP8短接,将JP10设置为Bank0-Flash,Bank1-RAM,将JP9短接到OUTSIDE端。

使用串口延长线连接CZ2到PC机串口,启动WINDOWS 操作系统自带的超级终端,并设置为8位数据位,1位停止位,无奇偶校验位,波特率为38400,设置流量控制为“无”。

打开FlashDown程序并进入AXD调试环境,全速运行程序,超级终端将会显示如图 1.1所示的操作菜单子。

图 1.1超级终端上的操作菜单在PC机键盘上输入1,进行FLASH芯片擦除,若正确擦除,将会显示图 1.2。

图 1.2正确擦除正确擦除后,根据提示输入“.”即可继续操作,键盘输入3,编程FLASH,如图 1.3所示。

图 1.3编程操作选择编程命令后,从【传送】Æ【发送文本文件】打开program目录下的 zlg_boot.hex 文件,即可开始编程文件,如图 1.4、图 1.5所示。

图 1.4选择编程文件图 1.5发送编程数据程序下载需要几分钟至十几分钟,这与PC机的速度和系统已运行的程序多少有关,编程结束后,关闭超级终端。

为了能够ZLG/BOOT通过以太网下载程序(如uCLinux)到开发板上,需要设置PC机子网掩码为“255.255.0.0”。

操作方法如下:打开PC机“网络邻居”的属性,再选择TCP/IP属性,如图 1.6所示(不同操作系统显示形式有所不同)。

图 1.6“网络邻居”属性将“子网掩码邻居”项的值设置为“255.255.0.0”,然后确定退出,如图 1.7所示。

图 1.7 TCP/IP属性1.1.2 通过以太网下载通过以太网下载的操作和通过串口下载的操作方法很类似,因而在这里仅重点介绍以太网下载不同的地方。

SD卡读写学习-----使用文档

SD卡读写学习-----使用文档

SD 卡读写学习使用文档一、 概述SD 卡是基于 flash 的存储卡,其和 MMC 卡的区别在于初始化过程不同。

SD 卡的通信协议包括 SD 和 SPI 两类。

SD 卡使用卡内智能控制模块进行 FLASH 操作控制,包括协议、安全算法、数据存取、 ECC 算法、缺陷处理和分析、电源管理、时钟管理。

二、SD 卡读写操作读操作的块长度受设备 sector 大小 (512 bytes)的限制,但是可以最小为一个字节。

51单片机读写SD 卡一般使用SD 卡的SPI 模式 0、CMD 命令格式:First Byte Byte 2-5 Last Byte 参数:4Byte---32bit ,指向要写入的字节地址,所以限制了SD 卡可以最大写入4g 数据bit7 bit6 bit5~0 Databit7~1 bit0 01命令参数(高位在前)CRC 校验1示例: CMD0号命令,CMD24(0x40+24=0x58)号命令时,参数为要写入的地址。

固定 CMD0命令 参数(2-5) CRC 校验 固定01 | 00 0000 | 0000 0000 ........ 0000 | 1001 010 | 1 0x40, 0x00,0x00,0x00,0x00, 0x95 adr<<=9;//取512的整数倍,因一个扇区为512字节。

CMD[1]=(addr>>24); CMD[2]=(addr>>16); CMD[3]=(addr>>8); CMD[4]=(addr>>0); $、SPI 模式:SD 卡启动时处在SD 总线模式下,要进入SPI 模式时,要遵守如下操作。

SD 卡复位及初始化时,时钟频率一定要慢下来,最高不超过400KHZ 。

1)SD 卡复位复位SD 卡:a 、所有引脚拉高,片选CS 为1时,首先往SD 卡写入至少74个时钟信号。

(SD 卡协议规定)b 、片选CS 拉低为0,写入CMD0命令(0x40,0x00,0x00,0x00,0x00,0x95)c 、读取SD 卡MISO 返回数据直到SD 卡返回0x01。

51单片机读写SD卡(命令解释)

51单片机读写SD卡(命令解释)

51单片机读写SD卡(命令解释)SD卡命令共分为12类,分别为class0到class11,不同的SDd卡,主控根据其功能,支持不同的命令集如下: Class0 :(卡的识别、初始化等基本命令集)CMD0:复位SD 卡.CMD1:读OCR寄存器.CMD9:读CSD寄存器.CMD10:读CID寄存器.CMD12:停止读多块时的数据传输CMD13:读Card_Status 寄存器Class2 (读卡命令集):CMD16:设置块的长度CMD17:读单块.CMD18:读多块,直至主机发送CMD12为止 .Class4(写卡命令集):CMD24:写单块.CMD25:写多块.CMD27:写CSD寄存器 .Class5 (擦除卡命令集):CMD32:设置擦除块的起始地址.CMD33:设置擦除块的终止地址.CMD38: 擦除所选择的块.Class6(写保护命令集):CMD28:设置写保护块的地址.CMD29:擦除写保护块的地址.CMD30: Ask the card for the status of the write protection bitsclass7:卡的锁定,解锁功能命令集class8:申请特定命令集。

class10 -11 :保留其中class1, class3,class9:SPI模式不支持51单片机读写SD卡(概述,硬件连接)SD卡全称为Secrue Digital Memory Card,具有轻巧、可加密、传输速度高、适用于手持设备使用等优点。

SD需要高速读写,同时也要使手持等嵌入式设备能方便使用,特设有两个访问接口:SD模式接口和SPI接口。

由于51单片机的速度的原因,一般采用SPI接口方式连接SD卡, 在连接时需要在SD卡边接10-100K上拉电阻,SD卡的电源是DC3.3V51单片机读写SD卡(寄存器)SD卡有以下几种内部寄存器1.CID 卡的识别号宽度128,详细描述如下2.RCA 卡的相对地址(SPI模式不可用)3.DSR 可选寄存器宽度164.CSD 描述操作该卡的规则(时序规则)。

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

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

单片机读写SD卡最简单最根本的程序处理器:s3c44b0 〔arm7〕SD卡与处理器的引脚连接:MISO -->SIORxD MOSI -->SIOTxD CLK -->SCLK CS-->PE5四个文件:sd_drive.c :用户API函数,移植时不需修改sd_cmd.c:中间层函数,移植时不需修改sd_hard.c:硬件层函数,移植时需修改sd_config.h:一些功能的宏定义,移植时需修改第一次读写SD卡时,需调用SD_Init(void),然后就可以条用Read_Single_Block或者Write_Single_Block进展读写操作注意:进展写操作时,最好不要写前700个扇区,应为这些扇区都是FAT文件系统的重要扇区,一旦误写那么可能会导致SD无法被电脑识别,需格式化。

/*******************************************************文件名:sd_drive.c作用:用户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_desel();Uart_Printf("fail in writing CMD17\n");return WR_SGL_BLK_ERR;}spi_ro_mode();send_clk(); //发送8个clkread_data(rx_buf); //读取512字节SD_desel();Uart_Printf("succeed in reading the %dst block!!!\n", blk_addr); return NO_ERR;}/********************************************功能:写一个block输入:blk_addr为要写第几个block,tx_buf为数据区输出:返回NO_ERR那么成功,其它那么读取失败********************************************/U8 Write_Single_Block(U32 blk_addr, U8 *tx_buf){U16 rsp = 1;U8 i = 0;SD_sel(); //使能SD卡while(rsp && (i < 100)){write_cmd(CMD24, blk_addr << 9); //写命令CMD24 rsp = Get_rsp(R1); //获取容许send_clk();}if(i > 99) //如果命令超时,那么执行超时处理{SD_desel();Uart_Printf("fail in writing CMD17\n");return WR_SGL_BLK_ERR;}spi_ro_mode();send_clk(); //发送8个clkwrite_data(tx_buf); //读取512字节SD_desel();Uart_Printf("succeed in writing a block!!!\n");return NO_ERR;}/********************************************功能:SD卡初始化输入:无输出:返回NO_ERR那么成功,其它那么读取失败********************************************/U8 SD_Init(void){U16 rsp = 1;U8 i = 0;spi_port_init(); //初始化spi端口spi_low_speed(); //初始化时SPI的速度必须低于400khzspi_ro_mode(); //只读模式SD_sel(); //选择SD卡for (i = 0;i < 10; i++) //发送至少75个clksend_clk();while(rsp && (i++ < 100)){write_cmd(CMD0, 0); //写命令CMD0rsp = Get_rsp(R1); //获取容许if (rsp == 1) //rsp为0那么初始化成功,为1那么继续写CMD0 break;send_clk();}SD_desel();if (i > 99) //初始化超时处理{Uart_Printf("fail in writing CMD0!!!\n");return INIT_FAIL;}i=0;SD_sel();while(rsp && (i++ < 100)){write_cmd(CMD1, 0); //写CMD1rsp = Get_rsp(R1); //获取容许send_clk();}SD_desel();if (i > 99){Uart_Printf("fail in writing CMD1!!!\n");return INIT_FAIL;}Uart_Printf("SD card init OK!!!\n");spi_high_speed(); //初始化工作全部完毕,SPI进入模式模式spi_rt_mode();return NO_ERR;}/********************************************功能:获取SD卡信息输入:输出:********************************************/void SD_info(){U8 rsp=0;U8 csd[16];SD_sel();write_cmd(CMD9, 0);rsp = Get_rsp(R1);if (rsp != 0){SD_desel();Uart_Printf("error in getting SD info!!!\n");return ;//GET_INFO_ERR;}if (read_register(16, csd) != NO_ERR){SD_desel();return ;}SD_desel();Uart_Printf("SD information :\n");if (csd[0] & 0x40 ==0x40){Uart_Printf("version 2.0\n");Uart_Printf("size is : %d\n",1024 * (csd[8]<<8 + csd[9]));}else{Uart_Printf("version 1.x \n");Uart_Printf("size is : %d MByte\n", ((((csd[6]&0x03)<<10) | (csd[7]<<2) | ((csd[8]&0xC0)>>6) + 1) * (1 << ((((csd[9]&0x03)<<1) | ((csd[10]&0x80)>>7)) + 2)))>>11);}Uart_Printf("max block lenght is : %d\n",1<<(csd[5]&0x0f));}/****************************************************************************文件名:sd_cmd.c作用:中间层函数****************************************************************************//********************************************功能:向SD写入一个命令输入:cmd为命令,addr为SD卡片内地址输出:无********************************************/void write_cmd(U8 cmd, U32 addr){U8 i = 0;U8 temp[4];spi_rt_mode(); //spi发送与接收模式if (cmd <= 13) //前13个命令与地址无关{spi_write_byte((cmd & 0x3F) | 0x40); //命令最高两位必须是01for(i = 0; i < 4; i++) //发送4个0,协议规定的spi_write_byte(0);if (cmd == 0)spi_write_byte(0x95); //如果是CMD0,那么要发送CRC校正else spi_write_byte(0xff); //非CMD0,那么无需CRC校正,默认为0xFF}else{for(i = 0; i < 4; i++) //将32位的地址分割成4个字节,准备发送temp[i]=(char)(addr >> (24 - 8 * i));spi_write_byte((cmd & 0x3F) | 0x40); //命令最高两位必须是01for(i =0; i < 4; i++)spi_write_byte(temp[i]); //发送地址,共4个字节spi_write_byte(0xff); //非CMD0,那么无需CRC校正,默认为0xFF}}/********************************************功能:获取SD卡的容许字节,可能是一个或者两个字节输入:type为容许类型输出:容许字节,个数有容许类型而定********************************************/U16 Get_rsp(U8 type){U16 rsp, temp;spi_ro_mode(); //spi只读模式send_clk(); //先发送8个clkrsp = spi_read_byte(); //用spi读取容许字节if (rsp & 0x8)rsp = spi_read_byte();if (type == R2) //如果是R2类型,那么容许为两个字节,须再次读取{temp = rsp << 8;rsp = spi_read_byte();rsp = temp | rsp;}return rsp;}/********************************************功能:读取SD的一个block的内容,一般为512字节输入:buffer为数据缓存区头地址输出:无********************************************/void read_data(U8 *buffer){U32 i;U8 rsp = 0;while(!(rsp == 0xfe)) //容许字节的最低为0那么代表起始位rsp = spi_read_byte();for(i = 0;i < BLOCK_LEN; i++) //读一个block的内容,一般为512字节buffer[i] = spi_read_byte();for(i = 0; i < 2; i++) //读两个CRC校正码send_clk();send_clk(); //读完毕字节}/********************************************功能:写入SD的一个block的内容,一般为512字节输入:buffer为数据缓存区头地址输出:********************************************/U8 write_data(U8 *buffer){U16 rsp = 0, tmp = 0, busy = 0, i = 6;spi_rt_mode();spi_write_byte(0xfe); //起始位for(i = 0; i < 512; i++) //发送512个字节spi_write_byte(buffer[i]);for(i = 0; i < 2; i++) //发送16位的CRC校正spi_write_byte(0xff);spi_ro_mode(); //等待容许while(!(rsp == 0x1)){rsp =(U16)spi_read_byte();tmp = rsp;rsp &= 0x11;}while(!(busy == 0xff)) //判忙{busy = spi_read_byte();}tmp &= 0xe;if (tmp == 4)return NO_ERR;else{Uart_Printf("writing error!!!\n");return WR_SGL_BLK_ERR;}}/******************************************** 功能:输入:输出:********************************************/ U8 read_register(U8 len, U8 *buffer){U8 rsp = 0xff, i = 0;spi_ro_mode();while((rsp == 0xff) && (i < 100)){rsp=spi_read_byte();}if (i > 99){Uart_Printf("ERR in readding register!!!\n");return rsp;}if (rsp != 0xfe){buffer[0] = rsp;i = 1;}elsei = 0;for( ; i < len; i++)buffer[i] = spi_read_byte();for(i = 0; i < 2; i++ )send_clk();send_clk();return NO_ERR;}/*******************************************************************文件名:sd_hard.c作用:硬件层函数,移植时需根据处理器或者硬件构造的不同,对该文件的函数进展修改********************************************************************//********************************************功能:使能SPI,发送CLK输入:无输出:无********************************************/void send_clk(){rSIOCON |= (1 << 3); //使能SPIwhile (!(rINTPND & BIT_SIO)); //等待发送完毕rI_ISPC|=BIT_SIO; //去除中断标志}/********************************************功能:用SPI发送一个字节输入:dat为要发送的字节输出:无********************************************/void spi_write_byte(U8 dat){rSIODAT = dat;send_clk(); //SPI发送}/********************************************功能:用SPI读取外设一个字节输入:无输出:读到的一个字节********************************************/U8 spi_read_byte(void){send_clk(); //SPI发送return rSIODAT;}/********************************************功能:初始化SPI的端口输入:无输出:无********************************************/void spi_port_init(){rIVTT = 0;rPCONF = (rPCONF & 0xe3ff) | 0x1B0C00; //除了CLK,MISO,MOSI外,不改变其他位rPUPF |= 0x160; //使能MISO的上拉电阻}/***************************************************************文件名:sd_config.h作用:相关功能的宏定义,以便被以上三个文件调用,便于移植移植时需修改***************************************************************/#ifndef _SD_CONG#define _SD_CONG#define BLOCK_LEN (512) //一个block的长度#define CMD0 0#define CMD1 1 // 读OCR存放器#define CMD9 9 // 读CSD存放器#define CMD10 10 // 读CID存放器#define CMD12 12 // 停顿读多块时的数据传输#define CMD13 13 // 读Card_Status 存放器#define CMD16 16 // 设置块的长度#define CMD17 17 // 读单块#define CMD18 18 // 读多块,直至主机发送CMD12#define CMD24 24 // 写单块#define CMD25 25 // 写多块#define CMD27 27 // 写CSD存放器#define CMD28 28 // Set the write protection bit of the addressed group#define CMD29 29 // Clear the write protection bit of the addressed group#define CMD30 30 // Ask the card for the status of the write protection bits#define CMD32 32 // 设置擦除块的起始地址#define CMD33 33 // 设置擦除块的终止地址#define CMD38 38 //擦除所选择的块#define CMD42 42 // 设置/复位密码或上锁/解锁卡#define CMD55 55 // 制止下一个命令为应用命令#define CMD56 56 // 应用命令的通用I/O#define CMD58 58 // 读OCR存放器#define CMD59 59 // 使能或制止//错误返回#define INIT_FAIL 0#define NO_ERR 1#define WR_SGL_BLK_ERR 2#define GET_INFO_ERR 3#define R1 1 //SD卡容许类型,表示一个字节#define R2 2 //SD卡容许类型,表示两个字节//一下是移植时需修改的内容#define SD_desel() rPDATE=0x20; //使能SD卡#define SD_sel() rPDATE=0x00; //放开SD卡#define spi_high_speed() rSBRDR = 5; //spi高速模式#define spi_low_speed() rSBRDR = 99; //spi低速模式#define spi_ro_mode() rSIOCON = (0x0 << 7) | (0x0 << 6) | (0x0 << 5) | (0x0 << 4) | (0x0<< 3) | (0x0 << 2) | 0x1 //只读模式#define spi_rt_mode() rSIOCON = (0x0 << 7) | (0x0 << 6) | (0x1 << 5) | (0x0 << 4) | (0x0 << 3) | (0x0 << 2) | 0x1 //读写模式#endif。

读写SDMMC卡_SmartARM2200_

读写SDMMC卡_SmartARM2200_

ZLG/FS读写SD/MMC卡(SmartARM2200) 1.实验目的学会使用ZLG/SD软件包访问SD/MMC卡。

学会综合使用ZLG/FS软件包和ZLG/SD软件包以文件形式访问SD/MMC卡。

2.实验设备硬件:SmartARM2200开发板一套SD或MMC卡一张SD/MMC卡读卡器一个软件:Windows98/XP/2000操作系统,ADS 1.2集成开发环境µC/OS-II操作系统(V2.52)ZLG/SD软件包,ZLG/FS软件包3.实验内容综合利用ZLG/SD软件包与ZLG/FS软件包,ZLG/FS文件系统软件包通过ZLG/SD软件包以文件的形式来访问SD/MMC卡。

在SD/MMC卡上创建一个目录“ARM&FATS”和一个文本文件“单片机.txt”,并往该文件中添加内容。

4.实验预习要求仔细阅读《ARM嵌入式系统实验教程(二)》第1章的内容,了解SmartARM2200开发板的硬件结构。

仔细阅读《ARM嵌入式系统实验教程(二)》的内容,了解ADS 1.2集成开发环境、LPC2200专用工程模板、EasyJTAG仿真器的应用。

仔细阅读《ZLG_SD使用手册》(见产品光盘目录:ARM嵌入式系统实验教程(二)\第4章_基于uCOS-II的综合实验\4.4_SDMMC卡读卡器实验),理解ZLG/SD软件包的使用方法。

5.实验原理ZLG/FS是一个可移植到不同CPU上运行的文件系统管理软件包(支持FAT12、FAT16、FAT32文件系统),通过移植该软件包的读/写存储器接口函数,可以以文件的形式读/写如CF卡、SD/MMC卡、Flash芯片等存储介质。

本实验将示例用ZLG/FS文件系统读/写SD/MMC卡。

ZLG/FS读写SD/MMC卡必须移植一个函数,在本实验中,该函数为:uint16 SDCammand(uint8 Cammand, void *Parameter)下面的实验步骤将会提到该函数所在的文件。

FAT文件系统的SD卡单片机读写方法详解

FAT文件系统的SD卡单片机读写方法详解

FAT文件系统的SD卡单片机读写方法详解FAT(File Allocation Table)文件系统是一种常用的文件系统,被广泛应用于存储设备如SD卡上。

在单片机中使用SD卡进行读写操作时,需要使用FAT文件系统进行文件的管理和操作。

下面将详细介绍FAT文件系统的SD卡单片机读写方法。

1.SD卡初始化:在进行SD卡读写操作之前,首先需要初始化SD卡。

初始化SD卡的步骤如下:1.1硬件上电及等待稳定。

将SD卡模块供电,并等待SD卡电压稳定,通常需要几十毫秒的时间。

1.2发送复位命令。

向SD卡发送复位命令,命令的格式如下:CMD0:0x400x000x000x000x000x95发送这个命令后,SD卡会返回R1响应,其中bit 0为0表示复位成功。

1.3发送检测版本命令。

向SD卡发送检测版本命令,命令的格式如下:CMD8:0x480x000x000x010xAA0x87发送这个命令后,SD卡会返回R7响应,其中bit 0为0表示命令执行成功。

1.4判断SD卡类型。

根据R7响应中的数据,判断SD卡的类型,如果是SDHC卡或SDXC卡,需要进行额外的操作。

1.5发送初始化命令。

向SD卡发送初始化命令,命令的格式如下:CMD55:0x770x000x000x000x000xFFACMD41:0x690x400x000x000x000xFF循环发送这两个命令,直到SD卡返回R1响应的bit 0为0,表示初始化完成。

1.6发送读取OCR命令。

向SD卡发送读取OCR命令,命令的格式如下:CMD58:0x7A0x000x000x000x000xFF发送这个命令后,SD卡会返回R3响应,其中包含卡的OCR寄存器的内容。

2.FAT文件系统格式化:在SD卡上创建FAT文件系统之前,需要对SD卡进行格式化操作。

格式化操作会将SD卡分为引导扇区、FAT表、根目录区和数据区。

2.1创建引导扇区。

在SD卡的第一个扇区创建引导扇区,引导扇区包含引导记录和磁盘参数表。

SD卡读写操作详细说明

SD卡读写操作详细说明

51单片机实现对SD卡的读写SD卡SPI模式下与单片机的连接图:22.23.//获得16位的回应24. Read_Byte_SD(); //read the first byte,ignore it.25.do26. { //读取后8位27. tmp = Read_Byte_SD();28. retry++;29. }30.while((tmp==0xff)&&(retry<100));31.return(tmp);32.}2)初始化SD卡的初始化是非常重要的,只有进行了正确的初始化,才能进行后面的各项操作。

在初始化过程中,SPI的时钟不能太快,否则会造初始化失败。

在初始化成功后,应尽量提高SPI的速率。

在刚开始要先发送至少74个时钟信号,这是必须的。

在很多读者的实验中,很多是因为疏忽了这一点,而使初始化不成功。

随后就是写入两个命令CMD0与CMD1,使SD卡进入SPI模式初始化时序图:初始化例程:1.//--------------------------------------------------------------------------2.初始化SD卡到SPI模式3.//--------------------------------------------------------------------------4.unsigned char SD_Init()5.{6.unsigned char retry,temp;7.unsigned char i;8.unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};9. SD_Port_Init(); //初始化驱动端口10.11. Init_Flag=1; //将初始化标志置112.13.for (i=0;i<0x0f;i++)14. {15. Write_Byte_SD(0xff); //发送至少74个时钟信号16. }17.18.//向SD卡发送CMD019. retry=0;20.do21. { //为了能够成功写入CMD0,在这里写200次22. temp=Write_Command_SD(CMD);23. retry++;24.if(retry==200)25. { //超过200次26.return(INIT_CMD0_ERROR);//CMD0 Error!27. }28. }29.while(temp!=1); //回应01h,停止写入30.31.//发送CMD1到SD卡32. CMD[0] = 0x41; //CMD133. CMD[5] = 0xFF;34. retry=0;35.do36. { //为了能成功写入CMD1,写100次37. temp=Write_Command_SD(CMD);38. retry++;39.if(retry==100)40. { //超过100次41.return(INIT_CMD1_ERROR);//CMD1 Error!4.unsigned char Read_CSD_SD(unsigned char *Buffer)5.{6.//读取CSD寄存器的命令7.unsigned char CMD[] = {0x49,0x00,0x00,0x00,0x00,0xFF};8.unsigned char temp;9. temp=SD_Read_Block(CMD,Buffer,16); //read 16 bytes10.return(temp);11.}4)读取SD卡信息综合上面对CID与CSD寄存器的读取,可以知道很多关于SD卡的信息,以下程序可以获取这些信息。

SD卡硬件原理图及其读写程序

SD卡硬件原理图及其读写程序

SD卡硬件原理图及其读写程序2011-03-28 17:45转载自sail_007最终编辑sail_007 最近开始整理以前画过原理图和程序今天先整理出了SD卡的硬件和SPI方式的读写程序。

今后会陆续写把DS1302时钟芯片GPRS模块CAN总线通信PWM数控电压也整理出来。

一方面是想帮自己总结一下另外如果还能帮助到其他的单片机爱好者那也就更好了。

当然水平有限整理出来的东西可能也有许多错误的地方也请高手能指出不胜感激。

先发张SD卡的原理图。

说明我用的是5V单片机SD卡则是3.3v如果直接连接引脚长期使用会影响SD卡寿命。

我一开始选用了普通的光耦触发可能是导通速率不够快无法实现SPI通信后来我就改用9013就行了。

下图上US1是SD卡壳其实1到9引脚对应了SD卡的9个引脚10号引脚是卡插入标志也就是说当有SD卡插入时10号引脚会接3.3v的地这样单片机就可以查询是否有卡了。

在SPI总线模式下CS为主控制器向卡发送的片选信号SCLK为主控制器向卡发送的时钟信号INDataIn为主控制器向卡发送的单向数据信号MISODataOut为卡向主控制器发送的单向数据信号。

程序如下说明我用的是freescale的DP256单片机该单片机有SPI 设备接口只要将其初始化成功便可完成通信设置。

uchar CMD0RespCMD1RespCMD59RespCMD16RespCMD9RespC MD17RespCMD24RespCMD58Resp void SD_Initializevoiduchar csdbuf16TempValue ucharcmdparam4recbuf600resp4resptype uchar sendbuf600 ulong len ulong i ulong BlockAdd SD_InsertDetect Pim.pts.bit.pts70 //cs0 SD_SPIDelay25 Pim.pts.bit.pts71 //cs1 SD_SPIDelay2Pim.ddrs.bit.ddrs70 //pin cs direction Spi0.spicr1.bit.spe0 //spi enable Pim.ddrs.bit.ddrs71 //pin cs directionPim.pts.bit.pts70//cs0 Spi0.spibr.byte0x02 //8MHz31.25kHz0x07-0x00 Spi0.spicr1.bit.mstr1 //master modeSpi0.spicr1.bit.ssoe1 //ss output enable Spi0.spicr1.bit.cpol0//cpol0 //cpol1 070215 Spi0.spicr1.bit.cpha0 //cpha0Spi0.spicr2.byte0x18 //normal drive input pullup TempValueSpi0.spisr.byte//clear SPIF first step TempValueSpi0.spidr.byte//clear SPIF second stepSpi0.spicr1.bit.spe1 //spi enable CMD0RespSD_ResetSDCMD1RespSD_ActiveInit whileCMD1Resp0x01CMD1RespSD_ActiveInit 白开水易拉罐主页博客相册个人档案好友i贴吧看看Ta是谁吧页码1/5Ww2011/6/26/wolf9s/blog/item/47e2a620 212d80268744f98c.htmlvoid SD_SPIDelayuint value uint i for i 0 i valuei SPI_SendByte0xFF // 发送0xFF clock out 0xFF uchar SD_ResetSDvoid uchar param4 0000respSD_SendCmdCMD0 param SD_R1 resp return resp / 函数名称:void SPI_SendByte Name: void SPI_SendByte 功能描述: 通过SPI接口发送一个字节Function: send a byte by SPI interface 输入: INT8U byte: 发送的字节Input: INT8U byte: the byte that will be send 输出: 无Output: NULL / voidSPI_SendByteuchar byte uchar TempValue Spi0.spidr.byte byte / 发送数据放入SPI数据寄存器/ while0 Spi0.spisr.byte 0x80 / 等待SPIF置位即等待数据发送完毕/ / wait for SPIF being set that is wait for finishing of data being send / TempValueSpi0.spidr.byte / 函数名称: INT8U SPI_RecByte Name:INT8U SPI_RecByte 功能描述: 从SPI接口接收一个字节Function: receive a byte from SPI interface 输入: 无Input: NULL 输出: 收到的字节Output: the byte that be received / uchar SPI_RecBytevoid uint ReadCounter ReadCounter0Spi0.spidr.byte 0xFF while0 Spi0.spisr.byte 0x80 / 等待SPIF 置位即等待收到数据/ ReadCounter ifReadCounter25 break / wait for SPIF being set that is wait for being received data / returnSpi0.spidr.byte / 读取收到的字节read the byte received / / 函数名称: //INT8U SD_SendCmd Name: INT8USD_SendCmd 功能描述: 向卡发送命令并取得响应Function: send command to the cardand get a response 输入: INT8U cmd : 命令字Input: INT8U cmd : command byteINT8U param : 命令参数长度为4字节INT8U param :command parameterlength is 4 bytes INT8U resptype : 响应类型INT8U resptype: response type INT8U resp : 响应长度为1-5字节INT8U resp : responselength is 1-5 bytes 输出: 0: 正确0: 错误码Output: 0: right 0: error code / voidSD_SendCmduchar cmd uchar paramuchar resptype uchar resp long irlen uchar tmp Pim.pts.bit.pts70//cs0 SPI_SendBytecmd0x3F 0x40 / 发送命令头和命令字send command header and word / for i 3 i 0 i-- SPI_SendByteparami / 发送参数send parameters / SPI_SendByte0x95 / CRC校验码只用于第1个命令CRConly used for the first command / rlen 0 switch resptype / 根据不同的命令得到不同的响应长度/ / according various commandget the various response length / case 1: rlen 1 break case 2: rlen 2 break case 4: rlen 5 break default:SPI_SendByte0xFF Pim.pts.bit.pts71 break i 0 do / 等待响应响应的开始位为0 / / Wait for a responsea response is a start bitzero / tmp SPI_RecByte i while tmp 0x80 0 iSD_CMD_TIMEOUT for i rlen - 1 i 0 i-- respi tmp tmpSPI_RecByte / 循环的最后发送8clock at the last recycleclock out 8 clock / Pim.pts.bit.pts71//cs1 // return SD_NO_ERR //new statement 页码2/5Ww2011/6/26/wolf9s/blog/item/47e2a620 212d80268744f98c.html/ 函数名称: INT8U SD_ReadBlockName: INT8U SD_ReadBlock 功能描述: 从SD卡中读一个块Function: read a single block from sd card 输入: INT32U blockaddr: 块地址Input: INT32U blockaddr: address of block INT8U recbuf : 接收缓冲区长度512Bytes INT8U recbuf : the buffer of receivelength is 512Bytes 输出: 0: 正确0: 错误码Output: 0: right 0: error code / uchar SD_ReadBlockulong blockaddr uchar recbuf uchar param4resp // if blockaddrsds.block_num // return SD_ERR_OVER_CARDRANGE / 操作超出卡容量范围operate over the card range /SD_PackParamparam blockaddr / 将参数转化为字节形式change the parameter to bytes form / SD_SendCmdCMD17 param SD_R1 resp SD_ReadBlockDataSD_BLOCKSIZE recbuf/ 读出数据read data from sd card / return resp / 函数名称: INT8U SD_ReadBlockData Name: INT8USD_ReadBlockData 功能描述: 从SD卡中读取数据块Function: read block data from sd card 输入: INT32U len : 长度Input: INT32U len : length INT8U recbuf : 接收缓冲区INT8U recbuf : the buffer of receive 输出: 0: 正确0: 错误码Output: 0: right 0: error code / voidSD_ReadBlockDataulong len uchar recbuf uchar tmp ulong i 0 Pim.pts.bit.pts70//cs0 do / 等待接收数据开始令牌0xFE wait for receiving data start token 0xFE / tmp SPI_RecByte iwhiletmp 0xFF i SD_CMD_TIMEOUT for i 0 i len i recbufi SPI_RecByte / 接收数据receive data / i SPI_RecByte i i 0:错误码Output: 0: right 0: error code ucharSD_SetBlockLenulong length uchar param4respretSD_PackParamparam length //将参数转化为字节形式change the parameter to bytes form SD_SendCmdCMD16 paramSD_R1 resp return resp / / 函数名称: void SD_PackParam Name: void SD_PackParam 功能描述: 将32位的参数转为字节形式Function: change 32bit parameter to bytes form 输入: INT8U parameter: 字节参数缓冲区Input: INT8U parameter: the buffer of bytes parameter INT32U value : 32位参数INT32U value : 32bit parameter 输出: 无Output: NULL / void SD_PackParamuchar parameter ulong value valuevalue512 parameter3 ucharvalue 24 parameter2 ucharvalue 16 parameter1 ucharvalue 8 parameter0 ucharvalue / 函数名称: INT8USD_WriteBlock Name: INT8U SD_WriteBlock 功能描述: 向SD卡中写入一个块Function: write a block to sd card 输入: INT32U blockaddr: 块地址Input: INT32U blockaddr: address of block INT8U sendbuf : 发送缓冲区长度512Bytes INT8U sendbuf : the buffer of sendlength is 512Bytes 输出: 0: 正确0: 错误码Output: 0: right 0: error code / ucharSD_WriteBlockulong blockaddr uchar sendbuf 页码3/5Ww2011/6/26/wolf9s/blog/item/47e2a620 212d80268744f98c.html uchar param4resprettmp2 ulong i // if blockaddr sds.block_num // returnSD_ERR_OVER_CARDRANGE / 操作超出卡容量范围operate over the card range / SD_PackParamparam blockaddr / 将参数转化为字节形式change the parameter to bytes form / SD_SendCmdCMD24 param SD_R1 resp / 写单块命令write single block / SD_WriteBlockData0 SD_BLOCKSIZE sendbuf / 写入数据write data / return resp / 函数名称: INT8USD_WriteBlockData Name: INT8U SD_WriteBlockData 功能描述: 向sd卡写数据块Function: write block data to sd card 输入: INT8U bmulti : 是否为多块操作1:是0:否Input:INT8U bmulti : multi blocks operate 1:Y 0:N INT32U len : 长度INT32U len : length INT8U sendbuf: 发送缓冲区INT8U sendbuf : the buffer of send 输出: 0: 正确0: 错误码Output: 0: right 0: error code / void SD_WriteBlockDatauchar bmulti ulong len uchar sendbuf uint i uchar tmp Pim.pts.bit.pts70//cs0 SPI_SendByte0xFF / 开始发送数据之前发送8个clock clock out 8 clk before start / if bmulti 1SPI_SendByteSD_TOK_WRITE_STARTBLOCK_M / 写多块开始令牌start token of write multi blocks / elseSPI_SendByteSD_TOK_WRITE_STARTBLOCK / 写单块开始令牌start token of write single block / for i 0 i len iSPI_SendBytesendbufi / 发送数据send data / SPI_SendBytei 8 0xFF SPI_SendBytei 0xFF / 发送CRC16校验码send CRC16 check code / tmp SPI_RecByte Pim.pts.bit.pts71//cs1 SD_WaitBusy void SD_WaitBusy uchar tmpiPim.pts.bit.pts70//cs0 i0 do / 等待忙结束wait for being busy end / tmp SPI_RecByte i while tmp 0xFF i 10000 / 忙时收到的值为0xFF always receive 0xFF when card is busy /Pim.pts.bit.pts71//cs1 / 函数名称: void SD_HardWareInit Name: void SD_HardWareInit 功能描述: 初始化访问SD卡的硬件条件Function: initialize the hardware condiction that access sd card 输入: 无Input: NULL 输出: 无Output: NULL / uchar SD_InsertDetect uchar InflagifPim.ptp.bit.ptp30//sd insert Inflag1 else Inflag0 return Inflag 类别默认分类添加到搜藏分享到i贴吧浏览57 评论0 上一篇sd卡的读写转下一篇一般SD卡和SDHC卡读写函数 .c -... 最近读者网友评论发表评论姓名哦没他发内容插入表情▼ 闪光字页码4/5Ww2011/6/26/wolf9s/blog/item/47e2a620 212d80268744f98c.html 同时将此文章分享给好友验证码请点击后输入四位验证码字母不区分大小写发表评论�0�82011 Baidu看看Ta是谁吧页码5/5Ww2011/6/26/wolf9s/blog/item/47e2a620 212d80268744f98c.html。

SmartARM2200启动文件分析

SmartARM2200启动文件分析

SmartARM2200启动文件分析先看不同的工具链会提供一些不同的机制和方法帮助用户完成这一步操作,主要是跟链接器(Linker)相关。

下面是在ARM 开发工具环境ADS 下,一种常用存储器模型的直接实现:LDR r0, = |ImageROLimit| ;得到RO 段末的下一字节的地址,ROM 中的RW 的开始地址LDR r1, = |ImageRWBase| ;得到RAM 中的RW 段的初始地址LDR r3, = |ImageZIBase| ;全局变量的初始地址CMP r0, r1 ;BEQ LOOP1LOOP0 CMP r1, r3 ;是否到RAM 中的RW 段的末地址,如果没到,则一直将ROM(FLASH 变量与数据段拷贝到RAM 中LDRCC r2, [r0], #4;[R0]=[R1] STRCC r2, [r1], #4 ;BCC LOOP0LOOP1LDR r1, = |ImageZILimit| ; LOOP1 与LOOP2 执行将ZI 初始化为0MOV r2, #0LOOP2CMP r3, r1 STRCC r2, [r3], #4 ;BCC LOOP2 在ADS 里,有一些预先定义了的变量可以用(linker defined symbol)。

在下面的实现里,用到了几个预定义的变量:ImageROBase 该变量指定了RO 段的BASEImageROLimit 该变量指定了RO 段的LimitImageRWBase 该变量指定了RW 段的BASEImageRWLimit 该变量指定了RW 段的LimitImageZIBase 该变量指定了ZI 段的BASEImageZILimit 该变量指定了ZI 段的Limit 注:具体可以参考ADS Linker GuideImageROLimit 减ImageROBase 等于RO 段的大小ImageRWLimit 减ImageRWBase 等于RW 段的大小ImageZILimit 减ImageZIBase 等于ZI 段的大小(ImageROLimit 减ImageROBase)+ (ImageRWLimit 减ImageRWBase)=等于整个程序的大。

SD和MMC卡读写说明

SD和MMC卡读写说明

目录第1章 SD/MMC卡读写模块 (1)1.1 SD/MMC卡的外部物理接口 (1)1.1.1 SD模式 (2)1.1.2 SPI模式 (3)1.2 访问SD/MMC卡的SPI模式硬件电路设计 (4)1.2.1 SPI总线 (5)1.2.2 卡供电控制 (5)1.2.3 卡检测电路 (5)1.3 SD/MMC卡读写模块的文件结构及整体构架 (5)1.3.1 SD/MMC卡读写模块的文件组成 (5)1.3.2 SD/MMC读写模块整体框架 (6)1.4 SD/MMC卡读写模块的使用说明 (6)1.4.1 SD/MMC卡读写模块的硬件配置 (6)1.4.2 SD/MMC卡读写模块提供的API函数 (9)1.5 SD/MMC卡读写模块的应用示例一 (11)1.5.1 硬件连接与配置 (11)1.5.2 实现方法 (11)1.6 SD/MMC卡读写模块的使用示例二 (18)1.6.1 实现方法 (18)1.6.2 例子建立与运行步骤 (20)1.6.3 参考程序 (24)1.7 SD/MMC软件包应用总结 (27)第1章SD/MMC卡读写模块SD/MMC卡是一种大容量(最大可达4GB)、性价比高、体积小、访问接口简单的存储卡。

SD/MMC卡大量应用于数码相机、MP3机、手机、大容量存储设备,作为这些便携式设备的存储载体,它还具有低功耗、非易失性、保存数据无需消耗能量等特点。

SD卡接口向下兼容MMC(MutliMediaCard多媒体卡)卡,访问SD卡的SPI协议及部分命令也适用于MMC卡。

SD/MMC卡读写模块是ZLG 系列中间件的重要成员之一,又称为ZLG/SD。

该模块是一个用来访问SD/MMC卡的软件读写模块,目前最新版本为2.00,本版本不仅能读写SD卡,还可以读写MMC卡;不仅能在前后台系统(无实时操作系统)中使用,还可以在嵌入式操作系统μC/OS-II中使用。

本文模块只支持SD/MMC卡的SPI模式。

Arduino+ESP32之SD卡读写

Arduino+ESP32之SD卡读写

Arduino+ESP32之SD卡读写背景知识:有两种使⽤SD卡的⽅法,⼀种是使⽤SPI接⼝访问SD卡,另⼀种是使⽤SDMMC接⼝访问SD卡。

Arduino core for the ESP32中SPI⽅式占⽤4个IO⼝,SDMMC⽅式占⽤6个IO⼝,⼀般来说SDMMC⽅式速度要⽐SPI⽅式快。

1. SDMMC⽅式ESP32虽然有两组SDMMC接⼝,但Arduino core for the ESP32中只⽤到了其中⼀组,IO⼝连接为:DAT2 - IO12、DAT3 - IO13、CMD -IO15、CLK - IO14、DAT0 - IO2、DAT1 - IO4;bool begin(const char * mountpoint="/sdcard", bool mode1bit=false)挂载存储卡,输⼊参数分别为挂载点、是否使⽤⼀线模式;void end()取消挂载;sdcard_type_t cardType() 返回存储卡类型,0、1、2、3、4,分别如下:CARD_NONE 未连接存储卡;CARD_MMC mmc卡;CARD_SD sd卡,最⼤2G;CARD_SDHC sdhc卡,最⼤32G;CARD_UNKNOWN 未知存储卡;uint64_t cardSize() 返回存储卡⼤⼩字节数;uint64_t totalBytes() 返回⽂件系统总字节数;uint64_t usedBytes() 返回⽂件系统已⽤字节数;2. SPI⽅式bool begin(uint8_t ssPin=SS, SPIClass &spi=SPI, uint32_t frequency=4000000, const char * mountpoint="/sd", uint8_t max_files=5)挂载存储卡,输⼊参数分别为SS引脚号、SPI对象、时钟频率、挂载点、⽂件最⼤同时打开数;默认IO⼝连接为:CS - IO5、DI - IO23、SCLK - IO18、DO - IO19;void end()取消挂载;sdcard_type_t cardType() 返回存储卡类型,0、1、2、3、4,分别如下:CARD_NONE 未连接存储卡;CARD_MMC mmc卡;CARD_SD sd卡,最⼤2G;CARD_SDHC sdhc卡,最⼤32G;CARD_UNKNOWN 未知存储卡;uint64_t cardSize() 返回存储卡⼤⼩字节数;uint64_t totalBytes() 返回⽂件系统总字节数;uint64_t usedBytes(); 返回⽂件系统已⽤字节数3. 我的实验我⼿头的ESP32_CAM板⼦的原理图右图可知,我的SD卡接到了ESP32的GPIO12 13 14 15 2 4 这6个脚上,根据前述,这符合SDMMC⽅式的IO连接。

基于嵌入式ARM的SD卡的读写要点

基于嵌入式ARM的SD卡的读写要点

摘要SD卡(Secure Digital Memory Card)中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。

本实训的作品是利用基于ARM Cotex-M3内核的嵌入式处理器STM32自带的SDIO硬件接口来驱动SD卡,并结合文件系统 FATFS R0.07C来完成一个基于嵌入式ARM的SD卡读写的作品,现实向SD 卡写入一个txt文件,并读取SD卡的文件目标并通过串口打印到PC机显示。

关键词:嵌入式;ARM;STM32;SD卡;文件系统AbstractSD Card (Secure Digital Memory Card) Chinese translation for Secure Digital Card, it is a kind of based on semiconductor flash Memory of a new generation of Memory device, it is widely used in portable devices, such as Digital cameras, personal Digital assistant (PDA) and multimedia player, etc. This training work is based on ARM Cotex - M3 kernel embedded processor STM32 own SDIO hardware interface to drive the SD card, and combined with the file system FATFS R0.07 C to complete a based on embedded ARM of the SD card, speaking, reading and writing work, reality to SD card to a TXT file, and read SD card file goals and through the serial port print to PC display.Key words:embedded;ARM;STM32; SD Card; File system目录1 前言 (1)1.1ARM应用背景 (1)1.2研究内容 (2)1.3研究成果 (3)2 STM32处理器概述 (3)2.1STM32简介 (3)2.1.1 STM32F103VET6的参数 (4)2.2内部资源 (6)2.3C ORTEX-M3内核简介 (6)2.4STM32SDIO简介 (7)2.4.1 SDIO简介 (7)2.4.2 SDIO功能特性 (8)3 SDIO的原理及实现方法 (8)3.1原理 (9)3.2SDIO适配器 (10)3.3SDIO卡识别过程 (11)3.4SDIO写数据块 (12)3.5SDIO读数据块 (13)4 FATFS文件系统 (13)4.1F A T FS文件系统简介 (13)4.2F A T FS文件系统移植 (14)4.2.1移植前工作 (14)4.2.2开始移植 (14)5 测试及结果 (15)5.1JTAG仿真器介绍 (16)5.2现象及结果 (16)6 结论 (18)致谢 (19)参考文献 (20)1 前言1.1 ARM应用背景如今,学习一种处理器的就有许多ARM内核的处理器可供使用,现在社会已步入嵌入式学习阶段。

MMC卡数据的读写

MMC卡数据的读写

MMC卡数据的读写1. 本例功能介绍由于CPU 的数据容量有限,可以把CPU 的数据存放于MMC 中,并对其中数据进行读写操作,典型应用为数据配方功能,这些数据可以只存于 MMC (Load Memory) 中,而不占CPU 的容量(Working Memory),当需要使用时可通过程序读写。

注意 MMC 的存储次数为100000 次。

2. 示例系统的体系结构图 0 本例中选用一个S7-300 CPU314C-2DP, 并插入MMC 卡3. 本例需要的设备A. 需要软件STEP7 V5.2或以上版本B. 需要硬件1. 一个S7-300 CPU314C-2DP2. 带有CP5611 的 Field PG 7103. 512K MMC 卡4. 只在MMC 中创建数据块4.1 方法1:在STEP7 中手动创建只存于MMC 的数据块打开STEP7,创建一个新的项目,在“BLOCKS”插入数据块,例如DB1,点右键打开属性窗口,选择“Unlinked” ,这样DB1 将只存于MMC 中。

图 14.2 方法2: 在程序中创建只存于MMC 的数据块在OB1 中调用SFC82图 2这样M0.1 为1 时,将在MMC 中创建DB2,3,4,5,6。

每个DB 块容量为16K ,当MW4 等于5 时,完成创建工作,用户应复位M0.1。

图 35. 读写MMC 的数据5.1 写数据到MMC 卡中,调用SFC84图 4M0.2 为1 时,CPU 中的数据源DB10.DBB0~9 10 个字节将写到已经在MMC 中创建好的DB2.DBB0~9 中,M1.2 为1 MW6 为W#16#7002 时,用户将复位M0.2 。

5.2 读MMC 中的数据到CPU 中,调用SFC83图 5M0.3 为1 时,MMC 卡中的数据源DB2.DBB0~9 10 个字节将读到CPU DB10.DBB10~19 中,M1.3 为1,MW8 为W#16#7002 时,用户将复位M0.3。

SDMMC卡初始化及读写流程讲述

SDMMC卡初始化及读写流程讲述

二、MMC/SD卡的模型和工作原理PIN脚、SD卡总线、SD卡结构、SD卡寄存器、上电过程SD卡寄存器:OCR:操作电压寄存器: 只读,32位第31位:表示卡上电的状态位CID: 卡身份识别寄存器只读128位生产厂商、产品ID,生产日期和串号等CSD:部分可写128位卡的容量、擦出扇区大小、读写最大数据块的大小、读操作的电流、电压等等 CSR: 卡配置寄存器64位数据位宽RCA:16位相关的卡地址寄存器,卡识别过程中主控器和卡协商出来的一个地址三、SD卡命令和响应格式命令和相应格式SD卡命令,命令类型,ACMD命令响应类型、卡类型、卡状态转换表命令的格式:48位起始位0 方向位(host to card: 1, card to host: 0)内容CRC7 结束位1·响应的格式:48位或者136位卡命令:命令的类型:bc: broadcast without Response 无响应的广播bcr: broadcast with Response 有响应的广播ac: Address(point-to-point) Command: 点对点,DATA0~DATA3数据线上无数据adtc: Adress(point-to-point) Data Transfer Commands 点对点,DATA0~DATA3数据线上有数据CMD0, CMD2, CMD3, CMD55, ACMD41 命令可能会导致卡的状态发生变化响应类型:R1,R1b, R2, R3,R6(SD2.0扩展了R7)扩展内容:SPI工作模式:要知道的特点:只支持一个卡,没有RCA,命令只是MMC/SD的基本的子集SDHC:(支持2GB~32GB):理解CMD8的作用,命令格式和响应,了解CSDV2.0寄存器做了扩展SDIO WIFI:增加CMD52,CMD53CMD8可以通过重新定义先前保留的位,来扩展一些已经存在的命令的新功能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ZLG/FS读写SD/MMC卡(SmartARM2200) 1.实验目的学会使用ZLG/SD软件包访问SD/MMC卡。

学会综合使用ZLG/FS软件包和ZLG/SD软件包以文件形式访问SD/MMC卡。

2.实验设备硬件:SmartARM2200开发板一套SD或MMC卡一张SD/MMC卡读卡器一个软件:Windows98/XP/2000操作系统,ADS 1.2集成开发环境µC/OS-II操作系统(V2.52)ZLG/SD软件包,ZLG/FS软件包3.实验内容综合利用ZLG/SD软件包与ZLG/FS软件包,ZLG/FS文件系统软件包通过ZLG/SD软件包以文件的形式来访问SD/MMC卡。

在SD/MMC卡上创建一个目录“ARM&FATS”和一个文本文件“单片机.txt”,并往该文件中添加内容。

4.实验预习要求仔细阅读《ARM嵌入式系统实验教程(二)》第1章的内容,了解SmartARM2200开发板的硬件结构。

仔细阅读《ARM嵌入式系统实验教程(二)》的内容,了解ADS 1.2集成开发环境、LPC2200专用工程模板、EasyJTAG仿真器的应用。

仔细阅读《ZLG_SD使用手册》(见产品光盘目录:ARM嵌入式系统实验教程(二)\第4章_基于uCOS-II的综合实验\4.4_SDMMC卡读卡器实验),理解ZLG/SD软件包的使用方法。

5.实验原理ZLG/FS是一个可移植到不同CPU上运行的文件系统管理软件包(支持FAT12、FAT16、FAT32文件系统),通过移植该软件包的读/写存储器接口函数,可以以文件的形式读/写如CF卡、SD/MMC卡、Flash芯片等存储介质。

本实验将示例用ZLG/FS文件系统读/写SD/MMC卡。

ZLG/FS读写SD/MMC卡必须移植一个函数,在本实验中,该函数为:uint16 SDCammand(uint8 Cammand, void *Parameter)下面的实验步骤将会提到该函数所在的文件。

6.实验步骤1. 准备一张SD/MMC卡,并用SD/MMC卡读卡器将该SD/MMC卡格式化,如果卡本身已格式化为FAT16或FAT32,则不必再格式化了。

2. 用ADS1.2使用工程模板ARM Executable Image for UCOSII(for lpc2200)建立一个工程FileSD_SmartARM.mcp,生成一个目录FileSD_SmartARM。

3. 在目录FileSD_SmartARM的同级目录下放置文件夹arm和Source。

其中Source文件夹放置µC/OS-II操作系统(V2.52)源代码,arm目录中放置与LPC2200硬件相关的uCOS-II移植代码。

4. 在FileSD_SmartARM目录下建立一个目录SDMMC,在该目录下放置ZLG/SD软件包的所有文件,该软件包在产品光盘:ARM嵌入式系统实验教程(二)\第4章_基于uCOS-II的综合实验\4.4_SDMMC卡读卡器实验\ZLG_SD\SDMMC中。

将该软件包的配置头文件sdconfig.h放到FileSD_SmartARM\src中。

5. 在FileSD_SmartARM目录下建立一个目录File,在该目录下放置ZLG/FS软件包,该软件包在产品光盘:ARM嵌入式系统实验教程(二)\Chapter 5_uCLinux OperatingSystem\BootLoader and Sources\zlg_boot\file目录下。

注:SmartARM2200开发板比较前期的光盘(差别只是目录为中文的),则在:ARM与嵌入式系统实验教程(2)\第5章_uCLinux操作系统实验\BootLoader和源代码\zlg_boot\file6. 打开工程FileSD_SmartARM.mcp,在config.h文件中,删除将原有的语句“#include"..\..\Arm_Pc\pc.h"”。

7. 在工程中建立一个组ZLG/SD,将文件夹FileSD_SmartARM\SDMMC下的所有文件加入该组中。

sdconfig.h加入到*.h组中。

8. 在工程中建立一个组ZLG/FS,将文件夹FileSD_SmartARM\file\source和文件夹FileSD_SmartARM\file\os下的所有文件加入该组中。

9. 将FileSD_SmartARM\file\drive\SD中的SD.c加入到ZLG/FS中。

SD.c文件就是ZLG/SD软件包与ZLG/FS软件包的接口,它实现了ZLG/FS对SD/MMC卡文件的存取,SDCammand()函数就在该文件中。

10. 在config.h中加入以下代码,包含相关的头文件,见程序清单1。

注:程序清单1中的宏定义MAX_DISK_CACHES的值至少是16的两倍以上,建议用户使用256。

程序清单1(1)为ZLG/FS与ZLG/SD的移植接口,该函数在SD.c文件中。

程序清单1 需要包含的头文件#include "sdconfig.h"#include "sddriver.h"/********************************//* ZLG/FS需包含的头文件*//********************************/#define MAX_OPEN_FILES 1#define MAX_DISK_CACHES 256#include "fat.h"#include "OSFile.h"extern uint16 SDCammand(uint8 Cammand, void *Parameter); (1)extern char *strupr(char *Str);11. 由于ZLG/SD软件包需要一个信号量,使用到ZLG/FS的每一个任务就要增加一个信号量,ZLG/FS整体需要一个队列,所以本实验至少要有3个事件。

因此,必须修改os_cfg.h的宏定义。

(如果用户还用到其它事件,则需相应地增加该值)#define OS_MAX_EVENTS 312. 在config.h中使能外设VPB时钟为Fcclk / 4的4倍。

#define Fpclk (Fcclk / 4) * 413. 模板默认的外部RAM访问速度是比较慢的,为了充分发挥LPC2210的性能,可以在重新配置外部RAM的速度,如程序清单2所示。

程序清单2 重新配置SmartARM2200的外部存储器速度#ifdef __DEBUG //开发板上JP10接为:Bank0-RAM,Bank1-Flash,JP9接为:OUTSIDE MEMMAP = 0x3; //remapBCFG0 = 0x10001460; //外部RAMBCFG1 = 0x10000460; //外部Flash#endif__OUT_CHIP //开发板上JP10接为:Bank0-Flash,Bank1-RAM,JP9接为:OUTSIDE #ifdefMEMMAP = 0x3; //remapBCFG0 = 0x10000460; //外部FLASHBCFG1 = 0x10001460; //外部RAM#endif#ifdef __IN_CHIP //开发板上JP10接为:Bank0-RAM,Bank1-Flash,JP9接为:INSIDE MEMMAP = 0x1; //remapBCFG0 = 0x10001460; //外部RAMBCFG1 = 0x10000460; //外部Flash#endif14. 在main.c文件中添加两个函数:char *strupr(char *Str):用于文件名等的大小写转换,因为ARM的C语言库中没有该函数,所以需要自己编写。

uint8 GetDataTime(DATE_TIME *GetTime):用于标识文件的时间,该函数使用了LPC2210的实时时钟。

这两个函数请见与本文档一起发布的本实验参考源码。

15. 在main.c中增加实验本实验目的的代码。

见程序清单3所示,程序清单有详细的注释,请用户自行阅读。

注:ZLG/FS使用的API函数见光盘:ARM嵌入式系统基础教程\第8章_嵌入式系统开发平台\ZLG_FS\ZLG_FS.pdf文件。

本版本的ZLG/FS的函数OSAddFileDriver()比以前版本增加了一个参数,如程序清单3(1)所示,但该参数在这里将其置为NULL即可。

程序清单3 创建文件夹及文本文件int main (void){OSInit ();OSTaskCreate(Task0,(void *)0, &TaskStartStk[TaskStkLengh - 1], 1);OSTaskCreate(OSFileTask, (void *)0, &TaskStk[1023], 0); /* 操作文件任务的堆栈大小为1K */ ();OSStartreturn 0;}/******************************************************************************************* ** Task0 任务0*******************************************************************************************/ char *FileName = "a:\\单片机.txt";char WritFileData[]="\r\n******************Copyright (c) 周立功单片机发展有限公司***********************\r\n\\r\n\ZLG/FS是广州周立功单片机发展有限公司开发的面向嵌入式系统开发的小型文件系统,\r\n\是ZLG系列中间件的重要成员之一。

它是与FAT12、FAT16、FAT32高度兼容的文件系统,可以\r\n\直接与个人电脑交换文件。

它是可移植的、可固化的文件系统,可以用于前后台系统,也可\r\n\用于多任务环境。

目前ZLG/FS的最新版本为1.0。

\\r\n\\r\n*********************************ARM开发部门************************************\r\n";*pdata)(voidTask0void{HANDLE FHandle;pdata = pdata;LPC2210硬件初始化 */ TargetInit(); /*增加存储设备: SD/MMC卡*/ (1) OSAddFileDriver(SDCammand,NULL); /*FHandle = OSFileOpen(FileName, "rw"); /* 以可读/可写方式打开FileName文件 */ if (FHandle != Not_Open_FILE){ /* 打开文件成功*/OSFileSeek(FHandle, 0, SEEK_END); /* 指定文件读/写的位置 *//* 向 txt 文件中写入数据 */OSFileWrite(WritFileData, sizeof(WritFileData), FHandle);关闭文件 */OSFileClose(FHandle); /*在根目录下建立一个目录 *//*OSMakeDir("a:\\ARM&FATS");这句没有作用,只示例该函数的使用方法 */ OSRemoveDir("dir2.dir");/*写数据真正写入存储介质中,如SD卡中 */ OSAllCacheWriteBack(); /*移去该盘符 */OSRemoveFileDriver(0); /*}while (1); /* 本示例程序到此结束 */ (2)}16. 将SmartARM2200教学实验开发平台上JP1跳线(ISP)断开,JP10跳线设置为Bank0-RAM、Bank1-Flash。

相关文档
最新文档