首先申明,我只实现了部分的功能,没有提到的功能默认是没有的。
实现了:获得SD信息,获得总分区信息,获得某分区的信息,读取fat分区表功能。
具体有列出根目录下所有文件功能,查找某文件是否存在功能,显示某文件内容功能,删除某文件功能。
都仅限于在根目录下操作,且要满足8.3文件名格式。
因老师有要求,不能列出所有文件内容,现列出头文件,给各位一个参考。
/***********************************************************
*
* sd卡底层驱动
*
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* 文件名: sd.h
* 依赖性: 无
* 处理器: C8051F410
* 编译器: keil 3
* 单位: 宁夏大学
*
* 历史:
* <作者> <时间> <版本> <描述>
* 李居强 2011/11/11 V1.0 建立原始文档
*
************************************************************
*
* 程序版权声明
*
* 本程序为自由程序,您可以自由用于个人或商业行为。可以公布
* 程序代码,但是不得收费,不得修改。
*
* 本程序的版权归宁夏大学 李居强所有。
*
* 按照惯例 自由软件不会对因为使用该软件而造成的任何损失承担
* 任何责任。请谨慎考虑!
*
* 更多信息请访问我的博客:http://blog.csdn.net/lineter
*
* 本程序最终解释权归李居强所有。
*
***********************************************************/
#ifndef SD_H
#define SD_H
#include "..includecomplier.h"
#include "..include ypedefs.h"
#include "..includespi.h"
typedef enum //SD_ErrorList
{
SD_RESET_OK = 0x00, // SD卡重启成功
SD_RESET_TIMEOUT = 0x01, // SD卡重启超时(可能无卡)
SD_ACTIVE_TIMEOUT = 0x02, // SD卡初始化失败
SD_NO_SPI = 0x03, // SD卡不支持spi模式(大于2G)
SD_WRITE_BLOCK_ERROR = 0x04, // 不能设置为写块模式
SD_WRITE_BLOCK_TIMEOUT = 0x05, // 设置块写入超时
SD_WRITE_NOT_ACCEPT = 0x06, // 块写入未接受
SD_WRITE_SAVE_TIMEOUT = 0x07, // 块写入保存超时
SD_WRITE_BLOCK_OK = 0x08, // 块写入成功
SD_READ_BLOCK_TIMEOUT = 0x09, // 设置块读取超时
SD_READ_RESPOND_TIMEOUT = 0x0A, // 块读取响应超时
SD_READ_BLOCK_OK = 0x0B, // 块读取成功
SD_GET_CID_TIMEOUT = 0x0C, // 设置读取CID超时
SD_CID_NOT_RESPOND = 0x0D, // 读取CID未响应
SD_GET_CID_OK = 0x0E, // 读取CID成功
SD_GET_CSD_TIMEOUT = 0x0F, // 设置读取CSD超时
SD_CSD_NOT_RESPOND = 0x10, // 读取CSD未响应
SD_GET_CSD_OK = 0x11, // 读取CSD成功
SD_OTHER_ERROR = 0xFE,
SD_TIMEOUT_ERROR = 0xFF
}SD_ErrorList;
typedef enum // CommandList
{
SD_CAMMAND = 0x40, // SD卡命令标示
SD_RESET = 0x00, // SD卡重启:0
SD_RECOGNITION = 0x37, // SD卡识别:55
SD_ACTIVE = 0x01, // SD卡激活:1
SD_WRITE_BLOCK = 0x18, // SD卡写数据块:24
SD_READ_BLOCK = 0x11, // SD卡读数据块:17
SD_GET_CID = 0x0A, // 获得SD卡CID:10
SD_GET_CSD = 0x09, // 获得SD卡CSD:9
}CommandList;
byte sd_write_command(byte Command, dword date, byte CRC);
SD_ErrorList sd_reset(void);
SD_ErrorList sd_init(void);
SD_ErrorList sd_write_sector(byte *buffer, dword address);
SD_ErrorList sd_read_sector(byte *buffer, dword address);
word sd_get_capaity(void);
#endif
一定要注意,spi模式下SD卡最大支持2G的卡,以上的用不了的,我在这上面可浪费了大半天时间。一般只要程序无误,很快就可以调通的,读写扇区功能是很好实现的。