原创 SD卡读写程序设计(三)

2009-11-10 21:59 5037 10 12 分类: MCU/ 嵌入式

一、概述
今天的主要任务是建立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 ( i>1000 ) goto SendCommand; //如果在这段时间内没有收到0xFE的令牌,重复读命令


  for ( i="0"; i<BlockSize; i++ )
     ReadBuf = 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"; i<BlockLen; i++ )
      SPI_PutByte( WriteBuf); //写入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( BlockIndex+BlockNum-1 );//设置擦除终止地址
  SPI_PutByte( 0xFF );


  SD_CmdErase( );//开始擦除
  SPI_PutByte( 0xFF );
  SD_WaitInBusy( ); //SD忙时,一直等待。  
}

文章评论2条评论)

登录后参与讨论

用户230905 2009-12-10 13:58

大家好,我想编写一个简单的应用来实现向SD卡写入一个数据,然后再调用标准读函数来读取刚才写入的数据,我的操作系统是linux2.6版本,编译器是gcc,请问一下标准的读写函数是什么呢?要怎么编写呢?

用户1593293 2009-12-3 10:23

支持原创
相关推荐阅读
nthq2004 2010-05-08 20:04
USB自定义设备驱动02
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  本来还想编写应用程序测试一下自定...
nthq2004 2010-05-07 21:35
USB自定义设备驱动01
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  一、USB设备驱动入门1、学习目...
nthq2004 2010-05-04 21:01
智林开发板上实现自定义的USB HID设备
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  一、自定义HID设备的相关概念1...
nthq2004 2010-05-01 21:58
U盘例程在智林开发板上的移植
 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 一、移植前的准备工作1、有哪些操...
nthq2004 2010-04-30 19:19
U盘实现流程跟踪分析02
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />   二、追踪USB大容量设备的实现...
nthq2004 2010-04-27 21:51
U盘实现流程跟踪分析01
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />   一、追踪USB大容量设备的实现...
我要评论
2
10
关闭 站长推荐上一条 /2 下一条