SD卡读写程序设计三..docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
SD卡读写程序设计三.

该文章讲述了SD卡读写程序设计三. 一 、概述 今天的主要任务是建立SD操作底层驱动的框架。 二、SD用户层程序的编写 这几天看了周立功的《嵌入式软件开发实例》中关于SD卡操作的部分,又加了一个函数 void SD_GetCardInfo( void );现在共有5个函数: void SD_Config( void ); void SD_GetCardInfo( void ); void SD_ReadBlock( u32 BlockIndex, u8* ReadBuf ); void SD_WriteBlock( u32 BlockIndex, u8* WriteBuf ); void SD_EraseBlock( u32 BlockIndex, u32 BlockNum ); 1、SD_Config函数的编写 (1)主要任务是进行复位、激活、和设置块长度等。 (2)代码框架 void SD_Config( void ){ SD_Reset(); //命令0使卡复位,并进入SPI模式 SD_Activate(); //命令1激活卡进行内部处理退出空闲状态 SD_SetBlockLen ( BlockSize );//命令16设置块长度,一般为512字节 } 2. SD_ReadBlock( u32 BlockIndex, u8* ReadBuf )函数的编写 void SD_ReadBlock( u32 BlockIndex, u8* ReadBuf ){ u16 i=0 u16 TmpByte; SendCommand: SD_CmdReadSingle ( BlockIndex ); //发出读单块命令17 do { TmpByte = SPI_GetByte ( ); i++; } while ( (TmpByte != 0xFE ) ( i=1000 ) ); if ( i1000 ) goto SendCommand; //如果在这段时间内没有收到0xFE的令牌,重复读命令 for ( i=0; iBlockSize; i++ ) ReadBuf[i] = SPI_GetByte(); TmpByte = SPI_GetByte ( ); TmmByte = SPI_GetByte ( ); //不进行CRC校验 SPI_PutByte ( 0xFF ); //纯粹只是为了延时。 } 3. SDSPI.c和SDCmd.c文件框架的编写。 到了现在,可以先建立两个文件的框架。 u8 SPI_GetByte( void ); void SPI_PutByte( u8 SendByte ); void SD_Reset( void ); void SPI_Activate( void ); void SD_SetBlockLen ( u16 BlockSize ); void SD_CmdReadSinge ( u32 BlockIndex ); 其中大部分函数都是空函数,只是SPI_GetByte()返回0xFE,以防止读函数进入死循环。 下载、运行,输入命令sdrd,返回512个FE,说明程序框架是对的。 继续补充程序。 4. SD_WriteBlock( u32 BlockIndex, u8* WriteBuf )函 数的编写 void SD_WriteBlock( u32 BlockIndex, u8* WriteBuf ){ u16 i; SD_CmdWriteSingle( u32 BlockIndex ); //发写单块命令24 SPI_PutByte( 0xFF ); //进行延时 SPI_PutByte ( 0xFE ); //单块数据起始令牌 for ( i=0; iBlockLen; i++ ) SPI_PutByte( WriteBuf[i]); //写入SD卡缓冲区 SPI_PutByte( 0xEE ); SPI_PutByte ( 0xEE ); //CRC校验,这里不使用 SPI_GetByte( ); //获取数据响应 SD_WaitInBusy( ); //SD忙时,一直等待。 }又添加了两个命令层函数。 5、擦除函数框架 void SD_EraseBlock( u32 BlockIndex, u32 BlockNum ){ SPI_PutByte( 0xFF ); SD_SetEarseStart( BlockIndex );//设置擦除起始地址 SPI_PutByte( 0xFF ); SD_SetEarseStop( Blo

文档评论(0)

xy88118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档