本帖最后由 gh131413 于 2014-4-21 08:49 编辑
点赞  2014-4-18 21:37
引用: gh131413 发表于 2014-4-18 14:18
我把里面的H文件共7个放入到ICCAVR的C盘include中,然后还有deviceio.c和znFAT.c我加入到了工程中和我的 ...

LZ把这个头文件放到工程里面试试

    pgmspace.zip (2014-4-18 21:45 上传)

    3.8 KB, 下载次数: 3

点赞  2014-4-18 21:46
引用: gh131413 发表于 2014-4-18 17:01
算了,这一块太难了,准备放弃……

话说LZ是想研究怎样实现对SD卡的各种操作还是赶着做项目用SD卡做外置内存
点赞  2014-4-18 22:08
引用: gh131413 发表于 2014-4-18 21:37
针对前面我最开始发的程序,结合FATFS,比如说读取SD卡的BMP图片,那么我在下面diskio.c里面怎么写?我前面 ...

以下是我最近一次使用这个家伙的代码参考。

在diskio里面,我其实只关心读,所以写函数我就空着了。
初始化的时候,原本是在disk_initialize里初始化SD卡,后来由于种种原因,我在别处另外初始化了,所以这里关于SD的初始化就注释掉啦,相当于也是个空的。
读的时候,由于pfatfs是内存节约型,所以可能会反复读取同一扇区,所以我加了一个全局静态数组,它试图反复读同一扇区的时候,我就直接从数组里反给它

实际使用的时候,按照说明里的,这样做就可以了
FATFS fs;//定义一个工作用的内存结构
if(sdcard_init() == 0)//这就是我的手工处理SD卡初始化,如果你写在了disk_initialize里,这就不需要初始化了,直接初始化文件系统即可
  {
    printf("Sdcard OK.\n");
  }
  else
  {
    printf("Sdcard NG!\n");
    return;
  }


t = pf_mount(&fs);//这就是初始化文件系统啦,这个函数将会去调用你的disk_initialize,还会调用读扇区以识别sd卡中的文件系统,pfatfs只支持单个分区
    if(t == FR_OK)
    {
      printf("FS OK.\n");
    }
    else
    {
      printf("FS NG!\n");
      return;
    }

    t = pf_open("/mp3/test1.mp3");//我没有使用opendir的功能,我当时知道固定读取哪个文件,所以直接写了以根开始的全路径
    if(t == FR_OK)
    {
      printf("file open OK.\n");

      addr_buf = 0x10000000;
      while(pf_read((void*)(addr_buf), 0x2000, &ret_size) == FR_OK)//同样的,没有使用测量文件长度的功能,就读啊读,一直读到文件结束
      {
        addr_buf += ret_size;
        if(ret_size < 0x2000)
        {
          break;
        }
      }
      printf("file read OK.\n");//其实严格意义上讲,这里就判断读取完成是不正确的。我就是偷懒啦
    }
    else
    {
      printf("file open NG.\n");
      return;
    }


然后继续后续处理吧。

下面是diskio里面的主要内容有:
==============================================================
static u8 sector_buf[0x200];
static DWORD sector_num = 0xFFFFFFFF;

/*-----------------------------------------------------------------------*/
/* Initialize Disk Drive                                                 */
/*-----------------------------------------------------------------------*/

DSTATUS disk_initialize (void)
{
        DSTATUS stat;

        // Put your code here
  sector_num = 0xFFFFFFFF;

//  if(sdcard_init() == 0)
//  {
//    dbg_puts("Init sdcard complete!\n");
//    stat = RES_OK;
//  }
//  else
//  {
//    dbg_puts("Init sdcard failed!\n");
//    stat = RES_ERROR;
//  }  

  stat = RES_OK;
        return stat;
}



/*-----------------------------------------------------------------------*/
/* Read Partial Sector                                                   */
/*-----------------------------------------------------------------------*/

DRESULT disk_readp (
        BYTE* dest,                        /* Pointer to the destination object */
        DWORD sector,                /* Sector number (LBA) */
        WORD sofs,                        /* Offset in the sector */
        WORD count                        /* Byte count (bit15:destination) */
)
{
        DRESULT res;

        // Put your code here
  if(sector != sector_num)
  {
    sector_num = sector;
    sdcard_read(sector_num, sector_buf);
  }

  memcpy(dest, §or_buf[sofs], count);

  res = RES_OK;

        return res;
}



/*-----------------------------------------------------------------------*/
/* Write Partial Sector                                                  */
/*-----------------------------------------------------------------------*/

DRESULT disk_writep (
        const BYTE* buff,                /* Pointer to the data to be written, NULL:Initiate/Finalize write operation */
        DWORD sc                /* Sector number (LBA) or Number of bytes to send */
)
{
        DRESULT res = RES_ERROR;


        if (!buff) {
                if (sc) {

                        // Initiate write process

                } else {

                        // Finalize write process

                }
        } else {

                // Send data to the disk

        }

        return res;
}


点赞  2014-4-18 22:21
引用: gh131413 发表于 2014-4-18 20:53
那个FAT文件可以在SD卡读取图片,读取TXT,或MP3上通用不,另外你做好的程序能发上来参考一下吗?看你 ...

读什么文件和文件系统是没有关系的。无论读什么文件都是二进制的数据流而已。
点赞  2014-4-18 22:23
引用: huo_hu 发表于 2014-4-18 20:24
有关系,读也一样,除非你的文件不大于一个簇,fat表没有问题,是你的程序没有看fat表的问题

呵呵,我是说Fatfs库函数的问题会导致写越界,我们只是提供一个存储层的硬件接口,这就是所谓的分层,硬件接口层不必去考虑(文件)系统层的问题,文件系统层也不必考虑应用层的问题,每个层都把自己责任内的做好,最终就是我们只需要读一个扇区,写一个扇区,把这个基本动作做对就OK啦,我们完全不用去看fat表。
点赞  2014-4-18 22:27
引用: gh131413 发表于 2014-4-18 21:28
这方面小白一个,真想删了这帖子……

没准管理员认为你开了一篇好帖子哪……
点赞  2014-4-18 22:32
本帖最后由 gh131413 于 2014-4-21 08:49 编辑
点赞  2014-4-19 09:45
本帖最后由 gh131413 于 2014-4-21 08:49 编辑
点赞  2014-4-19 09:56
本帖最后由 gh131413 于 2014-4-21 08:50 编辑
点赞  2014-4-19 14:49
此刻感觉这块不适合我了,提升不了了
点赞  2014-4-19 15:22
基础决定
点赞  2014-4-19 15:22
引用: gh131413 发表于 2014-4-19 09:45
编译通不过,请问哪个地方要加const,然后照搬你程序吧!呵呵,实在是看不懂……

就是之前你说的那个地方加一个const, writep实现的地方

这个代码应该不会编不过的,你可以把你编译error贴出来看看

别那么着急放弃。其实不了解FAT内部原理也是没关系的。我知道内部的情况,实际调用库的时候也用不上,而且这玩意没有什么需要你调试的,如果有问题也就发生在库外,和FAT也没有关系。
点赞  2014-4-19 17:22
引用: sjtitr 发表于 2014-4-19 17:22
就是之前你说的那个地方加一个const, writep实现的地方

这个代码应该不会编不过的,你可以把你编译err ...

编译可以通过了,但是我不知道你发的程序是有放在主程序MAIN下还是怎么回事,主程序下需要调入那几个程序吗?
点赞  2014-4-19 19:02
引用: gh131413 发表于 2014-4-19 19:02
编译可以通过了,但是我不知道你发的程序是有放在主程序MAIN下还是怎么回事,主程序下需要调入那几个程序 ...

根据你的需要,只要是按顺序调用就行啊。

首先要挂载文件系统,用mount那个函数

mount成功才可以打开文件,用open

open成功才可以read其中的数据。

这个是精简的文件系统,所以只能支持单个文件系统,单个分区,单个已经打开的文件,所以没有文件指针的概念。
点赞  2014-4-19 20:10
本帖最后由 gh131413 于 2014-4-21 08:50 编辑
点赞  2014-4-19 23:36
引用: gh131413 发表于 2014-4-19 23:36
t = pf_mount(&fs);//这就是初始化文件系统啦这个为什么这么写,我加这一句就编译错误了,需定义变量比如 ...

你不会什么都没定义就直接调用了吧……
点赞  2014-4-19 23:40
本帖最后由 gh131413 于 2014-4-21 08:50 编辑
点赞  2014-4-20 00:30
引用: gh131413 发表于 2014-4-20 00:30
res = f_mount(0, &fs); // 先mount设备,即使你的SD卡
   res = f_open(&fl, filename, FA_OPEN_EXI ...

恕我直言,这个事就和FAT完全没有关系了。

而且你用的是胖大版,是比精简版要复杂一点。有好些工作用的结构体对象要定义。
建议你找它网页上的源例子抄回来先编译运行ok,然后再一点点改吧。
点赞  2014-4-20 09:34
引用: gh131413 发表于 2014-4-20 00:30
res = f_mount(0, &fs); // 先mount设备,即使你的SD卡
   res = f_open(&fl, filename, FA_OPEN_EXI ...

http://elm-chan.org/fsw/ff/en/open.html

这里的两个例子,上面是挂载单个分区,下面是同时挂载两个分区。
优先参考上面的。

额……我有点不知道该从哪帮你分析了……相信我,你现在的情况跟FAT没有关系,就是不太会理解别人的代码应该如何使用。
难道是协作开发做得少?
点赞  2014-4-20 09:42
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复