




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机读写 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 Uart_Printf(“fail in writing CMD17n“); return WR_SGL_BLK_ERR; spi_ro_mode(); send_clk(); /发送 8 个 clk read_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 Uart_Printf(“fail in writing CMD17n“); return WR_SGL_BLK_ERR; spi_ro_mode(); send_clk(); /发送 8 个 clk write_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 的速度必须低于 400khz spi_ro_mode(); /只读模式 SD_sel(); /选择 SD 卡 for (i = 0;i 99) /初始化超时处理 Uart_Printf(“fail in writing CMD0!n“); return INIT_FAIL; i=0; SD_sel(); while(rsp 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 csd16; 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 (csd0 Uart_Printf(“size is : %dn“,1024 * (csd86) + 1) * (1 7) + 2)11); Uart_Printf(“max block lenght is : %dn“,1 (24 - 8 * i); spi_write_byte(cmd /命令最高两位必须是 01 for(i =0; i 99) Uart_Printf(“ERR in readding register!n“); return rsp; if (rsp != 0xfe) buffer0 = rsp; i = 1; else i = 0; for( ; i len; i+) bufferi = 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); /使能 SPI while (!(rINTPND /等待发送完毕 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() rIVTCNT = 0; rPCONF = (rPCONF /除了 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 =
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025新职工入场安全培训考试试题【达标题】
- 2025公司员工安全培训考试试题答案综合卷
- 2025厂里职工安全培训考试试题含答案【综合卷】
- 2025合作协议、活动执行合同书
- 2025合同终止仍有年终奖 管理资料详解
- 2025设备采购协议合同范本
- 2025官方版商业店铺租赁合同书
- 2025年的合同效力如何评估
- 2025电子产品买卖合同范本
- 2025年碳化硅磨块合作协议书
- 2025年重庆市中考物理模拟试卷(一)(含解析)
- 《服务营销双主动》课件
- 公司法公章管理制度
- 演出经纪人员资格备考资料2025
- 成都交通投资集团有限公司招聘考试真题2024
- (二模)嘉兴市2025年高三教学测试语文试卷(含答案)
- 湖北省宜昌二中2025年高考化学考前最后一卷预测卷含解析
- 医院不良事件上报制度
- MTK安全架构研究-全面剖析
- 10S505 柔性接口给水管道支墩
- DZ∕T 0227-2010 地质岩心钻探规程(正式版)
评论
0/150
提交评论