分类: 嵌入式
2012-07-15 22:07:04
程序:
(1) spi.h,spi.c 包括SPI总线数据发送接收函数;
(2) sd.h,sd.c 包括SD卡初始化、块读写等函数;
(3) uart.h,uart.c 包括括串口发送接收函数;
(4) diskio.h,diskio.c 包括移植FATfs需要的函数;
(5) ff.h,ff.c,integer.h 包括FATfs文件系统;
(6) mcu_init.h,mcu_init.c 包括C8051F340单片机硬件初始化函数;
(7) test1_main.c 包括main函数和一些测试函数;
程序源码下载
调试需要注意的问题:
(1) 卡各个引脚电平必须正确:DI,DO,CLK加上拉电阻(也可不加);
(2) 首先应测试卡是否能正确初始化,初始化时SPI时钟为100K~400K;
参考:
(1) SanDisk Secure Digital Card Product Manual Version2.2
(2) Microsoft Extensible Firmware Initiative FAT32 File System Specification
(3) (主要参考,非常好)
(4) Chan fs:
2010年11月27日补充:(编辑一下帖子,结果图片和程序包包都不见了,过两天再给大家弄上来)
从发此文以来,经常有网友发来邮件请教相关问题,由于时隔一年有余,很多东西都忘掉了,而且大家遇到的问题我当时可能没有遇到,实在无法回复大家,今天查看邮件时又有网友咨询,我就在电脑里翻箱倒柜的找到一个当时写的很简单的调试记录发上来供大家参考吧。内容如下:
调试过程中遇到的问题:
(1) SanDisk ultra卡初始化读写成功,但换成其他的卡后初始化失败,调整SPI时钟速度也不行。最后测试SCK,DO和CS引脚电平,发现CS在高电平时还不到1V,大约80mV,通过换CS引脚到P2.1问题解决;
(2) SanDisk、KingSton、KingMax卡初始化成功,但唯独KingMax卡在读写过程中失败,改变SPI时钟速率(变慢)问题解决;
(3) 在读写单块、多块函数中,变量retry如果设为unsigned char型,比较时(retry>0xfe)容易出现读写失败,把retry设为unsigned int型,并retry>0xfffe后,问题解决;
(4) KingSton 卡在读单块、读多块成功后,开始在第1000块处写单块、写双块,成功后开始文件读写测试:写一个512字节的文件,按理论不够一簇(这里为4K),但空间需占一簇(4K),加上格式化后已占用的一簇(4K),应该已用8K,但发现已用空间为1M,且删除该文件后占用空间仍为1M。把第1000块写改为第 10000块写后问题解决。分析:可能第1000块有一些分区数据,在写1000块过程中覆盖了一些信息。
(5) SanDisk-2G标准卡热拔插后,初始化失败,MCU手动复位后初始化成功。在初始化函数中,发送两次CMD1问题解决;
(6) KingSton、KingMax卡写完多块后再读多块出错。把while(!SPI_receive())改为while(SPI_receice()!=0xff)后问题解决。
其他:
(1) FATfs中的Block、Sector概念和SD卡定义的相反;
(2) 各类盘在格式化成FAT32后已用空间为4K或1K,个人认为已用的空间为根目录所占用。4K其实为1个簇的大小,此簇包含8个sector,即 8*512Byte=4096B=4KB;1K为簇是2个sector的情况,因此从格式化后已用空间大小就可知该盘分配簇的大小。
以上仅供参考。:)