欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

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

    • 资源ID:13092771       资源大小:18.40KB        全文页数:17页
    • 资源格式: DOCX        下载积分:6金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要6金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    1、单片机读写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文件系统的重要扇区,一旦误

    2、写则可能会导致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则成功,其它

    3、则读取失败*/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 99) /如果命令超时,则执行超时处理 SD_desel(); Uart_Printf(fail in writing CMD17n); return WR_SGL_BLK_ERR;spi_ro_mode(); send_clk(); /发送8个clkread_data(rx_buf); /读取512字节SD_desel();

    4、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 99) /如果命令超时,则执行超时处理 SD_dese

    5、l(); Uart_Printf(fail in writing CMD17n); 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_

    6、low_speed(); /初始化时SPI的速度必须低于400khzspi_ro_mode(); /只读模式SD_sel(); /选择SD卡for (i = 0;i 10; i+) /发送至少75个clk send_clk(); while(rsp & (i+ 99) /初始化超时处理 Uart_Printf(fail in writing CMD0!n); return INIT_FAIL;i=0;SD_sel();while(rsp & (i+ 99) Uart_Printf(fail in writing CMD1!n); return INIT_FAIL;Uart_Printf(SD

    7、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) !=

    8、NO_ERR) SD_desel(); return ;SD_desel();Uart_Printf(SD information :n);if (csd0 & 0x40 =0x40) Uart_Printf(version n); Uart_Printf(size is : %dn,1024 * (csd88 + csd9); else Uart_Printf(version n); Uart_Printf(size is : %d MByten, (csd6&0x03)10) | (csd76) + 1) * (1 (csd9&0x03)7) + 2)11); Uart_Printf(ma

    9、x block lenght is : %dn,1(csd5&0x0f);/*文件名:作用:中间层函数*/*功能:向SD写入一个命令输入:cmd为命令,addr为SD卡片内地址输出:无*/void write_cmd(U8 cmd, U32 addr)U8 i = 0;U8 temp4;spi_rt_mode(); /spi发送与接收模式if (cmd = 13) /前13个命令与地址无关 spi_write_byte(cmd & 0x3F) | 0x40); /命令最高两位必须是01 for(i = 0; i 4; i+) /发送4个0,协议规定的 spi_write_byte(0); if

    10、 (cmd = 0) spi_write_byte(0x95); /如果是CMD0,则要发送CRC校正 else spi_write_byte(0xff); /非CMD0,则无需CRC校正,默认为0xFF else for(i = 0; i (24 - 8 * i); spi_write_byte(cmd & 0x3F) | 0x40); /命令最高两位必须是01 for(i =0; i 4; i+) spi_write_byte(tempi); /发送地址,共4个字节 spi_write_byte(0xff); /非CMD0,则无需CRC校正,默认为0xFF /*功能:获取SD卡的答应字节,

    11、可能是一个或者两个字节输入: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;/*功能:

    12、读取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字节 bufferi = spi_read_byte();for(i = 0; i 2; i+) /读两个CRC校正码 send_clk();send_clk(); /读结束字节 /*功能:写入SD的一个bl

    13、ock的内容,一般为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(bufferi);for(i = 0; i 2; i+) /发送16位的CRC校正 spi_write_byte(0xff);spi_ro_mode(); /等待答应while(!(rsp = 0x1) rsp =(U16)

    14、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 99) Uart

    15、_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;/*文件名:作用:硬件层函数,移植时需根据处理器或者硬件结构的不同,对该文件的函数进行修改*/*功能:使能SPI,发送CLK输入:无输出:无*/void send_clk()rSIOCON |= (1

    16、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() r

    17、IVTCNT = 0; rPCONF = (rPCONF & 0xe3ff) | 0x1B0C00; /除了CLK,MISO,MOSI外,不改变其他位rPUPF |= 0x160; /使能MISO的上拉电阻/*文件名:作用:相关功能的宏定义,以便被以上三个文件调用,便于移植 移植时需修改*/#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寄存

    18、器#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 CM

    19、D29 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 5

    20、6 / 应用命令的通用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() rSIOCO


    注意事项

    本文(单片机读写SD卡API模式读写.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开