打印
[微控制器/MCU]

LPC1114 FAT下读写SD卡

[复制链接]
2040|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
无语凝咽|  楼主 | 2010-6-25 23:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前一贴里利用的是SSP总线下进行扇区的读写,这一贴将在FAT文件系统下进**的读写。



       本来想自己写个简单的FAT文件系统,但是,在前不就,本人写了个FAT在AVR ICC下能够正常的运行,移植到LPC2148中来时死活不运行,这让我对自己写FAT失去了信心。本身FAT就是个比较复杂的东东,没有那么都时间去写。

再说了自己写的总是兼容性上有一定的问题。所以,决定还是移植一个比较好的文件系统吧。



    在网络上的文件系统常见的有四个:UC/FS;ZLG/FS;efsl;FatFS。



第一个:UC/FS。文件系统没得什么说的,UCOSII那个公司开发的,稳定性,兼容性应该都不会差。

第二个:ZLG/FS。周立功的很多的开发板上面都送了这个文件系统的源代码的,在网上找到一个现成的读写硬盘的,只是是基于LPC2200系列的处理器的。

第三个:efsl。是一个开源的项目,免费,只需要提供读扇区和写扇区2个函数。第四个是FatFs,跟efsl一样,也是一个开源的项目,移植的时候比efsl多几个简单的函数。

第四个:FatFS。开源,免费,高效!



通过综合考虑,决定移植第四个

相关帖子

沙发
无语凝咽|  楼主 | 2010-6-25 23:19 | 只看该作者
网上移植的文字很多,大家可以参考一下:http://www.cnblogs.com/ylshu/archive/2009/09/25/1574106.html







       在FatFs R0.08中,文件结构稍有改变。如果需要可以到官方网进行下载:http://elm-chan.org/fsw/ff/00index_e.html



FatFs的FatFs有两个文件夹,一个是 doc ,FatFs的说明,包括特性,系统函数,以及可能的一些问题,另一个就是源代码文件夹src了,总共8个文件,diskio.c和diskio.h是硬件层,ff.c和ff.h是FatFs的文件系统层和文件系统的API层,integer.h是文件系统所用到的数据类型的定义,ffconf.h为文件系统配置文件,tff.c和tff.h是Tiny的文件系统层和文件系统的API层,还有一个00readme.txt简要的介绍了FatFSHE FatFs/Tiny,包括他们所支持的API,怎么配置等等。







      移植的问题:







     第一个数据类型:在integer.h里面去定义好数据的类型。这里需要了解你用的编译器的数据类型,并根据编译器定义好数据类型。







     第二个就是配置:打开ffconf.h(我用的FatFs,不是Tiny,可以在此头文件中进行定义),文件系统的配置裁剪等均在此头文件中进行定义配置。







     第三个函数编写:打开diskio.c,进行底层驱动编写。



disk_initialize  -  Initialize disk drive

disk_status     -  Get disk status

disk_read       -  Read sector(s)

disk_write       -  Write sector(s)

disk_ioctl        -  Control device dependent features

get_fattime     -  Get current time





disk_initialize : 如果不需要可以直接返回0;也可以调用SD初始化函数。







       disk_status:    不需要直接返回。



   



       disk_read:      注意参数,如果读取多个扇区时一定要编写一个读多个扇区的函数,而不能用循环来调用读单个扇区的函数否则效率就不搞了。







       disk_write:      和上面的disk_read函数一样。







       disk_ioctl:       仅仅在格式化的时候被使用,在调试读写的时候,这个函数直接让他返回0就OK 了。







       get_fattime:    获取时间,此函数是通过RTC获取,如果没有此功能的可以用别的方式获取,不用的话,返回0就行。







移植就主要是更改这些,之后就可以运行试试了。

使用特权

评论回复
板凳
无语凝咽|  楼主 | 2010-6-25 23:19 | 只看该作者
/**************************************************************************************
* FunctionName   : MMCReadMultipleBolck()
* Description    : 读取一扇区数据到buffer缓冲中
* EntryParameter : NO
* ReturnValue    : 返回操作状态:失败-1;成功-0
**************************************************************************************/
uint8_t MMCReadMultipleBolck(uint32_t addr,uint8_t *buf,uint8_t count)
{
    uint16_t i;

  if (MMCWriteCmd(CMD18,0xFF,addr) != 0x00)           // 发送CMD18
  {
      return 1;                                    // 读取失败
  }

  do
  {
   while (SSPTransceiver(0xFF) != 0xFE)
   {
    ;                                 // 等待数据接受开始,受到0xFE表示开始
   }

   for (i=0; i<512; i++)                        // 读取数据
   {
    *buf++ = SSPTransceiver(0xFF);
   }

   SSPTransceiver(0xFF);                 // 取走CRC字节
   SSPTransceiver(0xFF);

  }while (--count);

  MMCWriteCmd(CMD12,0xFF,0x00);                      // CMD12发送停止命令

  return 0;
}

使用特权

评论回复
地板
无语凝咽|  楼主 | 2010-6-25 23:19 | 只看该作者
/**************************************************************************************
* FunctionName : MMCWriteMultipleBlock()
* Description : 把buffer中的数据写入一个扇区中
* EntryParameter : NO
* ReturnValue : NO
**************************************************************************************/
uint8_t MMCWriteMultipleBlock(uint32_t addr,uint8_t *buf,uint8_t count)
{
uint16_t i;
uint8_t tmp;

if (MMCWriteCmd(CMD25,0xFF,addr) != 0x00) // 发送CMD25到SD卡中去
{
return 1; // 写入失败
}

do
{
SSPTransceiver(0xFC); // Send start block token 0xfc (0x11111100)

for (i=0; i<512; i++) // 写入数据
{
SSPTransceiver(*buf++);
}

SSPTransceiver(0xFF); // 写入CRC字节
SSPTransceiver(0xFF);
tmp = SSPTransceiver(0xFF); // 读取XXX0 0101字节
tmp &= 0x1F;

if (tmp != 0x05)
{
return 1; // 写入失败
}

while (SSPTransceiver(0xFF) == 0x00)
{
; // BUSY等待
}
}while (--count);

SSPTransceiver(0xFD); // send 'stop transmission token'
while (SSPTransceiver(0xFF) == 0x00)
{
; // BUSY等待
}

return 0;
}

使用特权

评论回复
5
hotpower| | 2010-7-4 00:59 | 只看该作者
记录

使用特权

评论回复
6
年轻不在| | 2010-7-12 21:16 | 只看该作者
AVR ICC功能这么强呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

399

帖子

1

粉丝