收藏 分享(赏)

单片机读写SD卡.doc

上传人:ysd1539 文档编号:6851495 上传时间:2019-04-24 格式:DOC 页数:10 大小:43.50KB
下载 相关 举报
单片机读写SD卡.doc_第1页
第1页 / 共10页
单片机读写SD卡.doc_第2页
第2页 / 共10页
单片机读写SD卡.doc_第3页
第3页 / 共10页
单片机读写SD卡.doc_第4页
第4页 / 共10页
单片机读写SD卡.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、单片机读写 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 进行读写操作注意:进行写操作时,最好不要写前 7

2、00 个扇区,应为这些扇区都是 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

3、输入: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 个 clkread_data(rx_buf); /读取 512 字节SD_desel(); U

4、art_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_BL

5、K_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_m

6、ode(); /只读模式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 c

7、sd16;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) * (

8、1 7) + 2)11);Uart_Printf(“max block lenght is : %dn“,1 (24 - 8 * i);spi_write_byte(cmd /命令最高两位必须是 01for(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();

9、return NO_ERR;/*文件名:sd_hard.c作用:硬件层函数,移植时需根据处理器或者硬件结构的不同,对该文件的函数进行修改*/*功能:使能 SPI,发送 CLK输入:无输出:无*/void send_clk()rSIOCON |= (1 3); /使能 SPIwhile (!(rINTPND /等待发送完毕rI_ISPC|=BIT_SIO; /清除中断标志 /*功能:用 SPI 发送一个字节输入:dat 为要发送的字节输出:无*/void spi_write_byte(U8 dat)rSIODAT = dat;send_clk(); /SPI 发送 /*功能:用 SPI 读取外设

10、一个字节输入:无输出:读到的一个字节*/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#defi

11、ne 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 / 写单块 #d

12、efine 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 / 设置擦除块的起始地址#def

13、ine 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

14、 卡答应类型,表示一个字节#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

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报