搜索
bottom↓
回复: 45

Petit FatFs文件系统在MSP430的移植,送给需要的人

[复制链接]
(310607469)

出0入0汤圆

发表于 2012-3-24 20:08:12 | 显示全部楼层 |阅读模式
本帖最后由 cc1989summer 于 2012-3-24 20:12 编辑

【建议初学SD卡时先搞懂MSP430在无文件系统下的SD卡读写】

Petit FatFs 是FatFs 的精简版,专为 RAM较小的单片机设计的,我所测试的基本SD 读取以及写入程序 RAM 消耗通常在150 Byte左右。
因此可以适用于绝大多数MSP430单片机,本例使用的是MSP430F2274.移植到其他型号,仅需修改 硬件SPI接口部分的代码。

详见   http://elm-chan.org/fsw/ff/00index_p.html

可实现以下功能:
pf_mount - Mount/Unmount a Volume
pf_open - Open a File
pf_read - Read File
pf_write - Write File
pf_lseek - Move read/write Pointer
pf_opendir - Open a Directory
pf_readdir - Read a Directory Item

注意:不支持新建文件、删除文件等功能。不支持长文件名,不支持中文,中文会反应为 GB区位码。

首先 MSP430与 SD卡的接口,见TI 官方例程:  Interfacing the MSP430 With MMC/SD Flash Memory Cards (Rev. B)
www.ti.com/lit/an/slaa281b/slaa281b.pdf
http://www.ti.com/mcu/docs/litab ... =1&familyId=342
或者如下图所示:

MSP430F2274与SD 接口:

P3.7---------->CS
P3.5 MISO--->DO
P3.4 MOSI--->DI
P3.0 CLK----->SCLK

首先将SD卡 或者 microSD(TF卡)或者 MMC卡 格式化成 FAT(FAT16);
在根目录创建 文本文件,比如 abc.txt   内容为 Hello World


读取abc.txt 的代码为:
void main (void)
{
    WDTCTL = WDTPW + WDTHOLD;       // Stop watchdog timer
    BCSCTL1 = CALBC1_16MHZ;
    DCOCTL = CALDCO_16MHZ;
   
    spi_initialize();
    disk_initialize();
    pf_mount(&fs);
   
      pf_open("abc.txt");
      pf_read(Line, sizeof(Line), &s1);

写入代码为

  pf_open("abc.txt");
  res= pf_write(towrite, sizeof(towrite), &s2);
注意:写入文件,只能写入原文件大小的数据,不能大于,这是 Petit FatFs 的功能所限。

打开根目录下名为 hello的文件夹,并显示文件夹中文件的代码为
res= pf_opendir(&dir, "hello");
pf_readdir(&dir, &fno);

整个工程的原始代码见:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
(310593052)

出0入0汤圆

发表于 2012-3-25 00:08:29 | 显示全部楼层
厉害,帮顶
(310557898)

出0入0汤圆

发表于 2012-3-25 09:54:23 | 显示全部楼层
楼主威武……谢谢分享!
(310460670)

出0入0汤圆

发表于 2012-3-26 12:54:51 | 显示全部楼层
要是FLASH芯片就更好了
(310456583)

出0入0汤圆

发表于 2012-3-26 14:02:58 | 显示全部楼层
谢谢分享,还没有这方面研究,有空研究研究
(309942588)

出0入0汤圆

 楼主| 发表于 2012-4-1 12:49:33 | 显示全部楼层
顶。。。
(309942074)

出0入0汤圆

发表于 2012-4-1 12:58:07 | 显示全部楼层
launchpad 能跑吗
(309916664)

出0入0汤圆

 楼主| 发表于 2012-4-1 20:01:37 | 显示全部楼层
luhuaneda 发表于 2012-4-1 12:58
launchpad 能跑吗

必须能跑啊,上面已经说了,RAM消耗在150B左右,256B,512B的 msp430都是毫无压力的,launchpad只需修改 SPI相关代码即可。
(309916634)

出0入0汤圆

 楼主| 发表于 2012-4-1 20:02:07 | 显示全部楼层
luhuaneda 发表于 2012-4-1 12:58
launchpad 能跑吗

必须能跑啊,上面已经说了,RAM消耗在150B左右,256B,512B的 msp430都是毫无压力的,launchpad只需修改 SPI相关代码即可。
(309785151)

出0入0汤圆

发表于 2012-4-3 08:33:30 | 显示全部楼层
我也在调试Petit FatFs + MSP40写 micro SD卡, 请问:在pf_mount(&fs)找不到文件。用TI 430看了SEC 0的内容 发现没有0X4146
if (!disk_readp(buf, sect, BS_FilSysType, 2) && LD_WORD(buf) == 0x4146)        /* Check FAT12/16 */
                return 0;
if (_FS_FAT32 && !disk_readp(buf, sect, BS_FilSysType32, 2) && LD_WORD(buf) == 0x4146)        /* Check FAT32 */
               return 0;
这两句都通不过的。请问是不是我microSD卡的问题?我的microSD在电脑上,手机上都是没有问题的。请问要怎么处理microSD卡,还是要买新的?楼主指点啊。
(309775669)

出0入0汤圆

发表于 2012-4-3 11:11:32 | 显示全部楼层
先下载了再说。。。
(309772372)

出0入0汤圆

 楼主| 发表于 2012-4-3 12:06:29 | 显示全部楼层
GoodForum 发表于 2012-4-3 08:33
我也在调试Petit FatFs + MSP40写 micro SD卡, 请问:在pf_mount(&fs)找不到文件。用TI 430看了SEC 0的内 ...

先把disk_readp这个函数调试好了再说,很有可能是 接口函数没通顺,一般不是microSD的问题。
(309769353)

出0入0汤圆

发表于 2012-4-3 12:56:48 | 显示全部楼层
手上正好有launchpad 可以试下!
(309768259)

出0入0汤圆

发表于 2012-4-3 13:15:02 | 显示全部楼层
cc1989summer 发表于 2012-4-3 12:06
先把disk_readp这个函数调试好了再说,很有可能是 接口函数没通顺,一般不是microSD的问题。 ...

我用TI的程序写入数据512字节,再读出来是对的。 用在FATFS里面是用TI的读函数改过来的,读取的时候55AA正确读到。
(309750658)

出0入0汤圆

 楼主| 发表于 2012-4-3 18:08:23 | 显示全部楼层
GoodForum 发表于 2012-4-3 13:15
我用TI的程序写入数据512字节,再读出来是对的。 用在FATFS里面是用TI的读函数改过来的,读取的时候55AA ...

不行的额,要用 Petit FatFs中的函数,TI的函数在文件系统中是不行的,已试过……
(309746527)

出0入0汤圆

发表于 2012-4-3 19:17:14 | 显示全部楼层
本帖最后由 GoodForum 于 2012-4-3 19:37 编辑
cc1989summer 发表于 2012-4-3 18:08
不行的额,要用 Petit FatFs中的函数,TI的函数在文件系统中是不行的,已试过…… ...


多谢你~~~
读是可以用的。原来没注意block和sec的关系,现在用TI的函数可以读了。
不过写不能原来的,现在在看你的程序和Ti的程序改,还没有成功。
问一下,写文件的时候有什么限制啊? 我要每秒写几十个字节,写一个小时,有么有问题?内存不够,我也想一起写啊,没法办。


"注意:写入文件,只能写入原文件大小的数据,不能大于,这是 Petit FatFs 的功能所限。"
我建立一个txt文件里面全是空格共计300K,这样是不是可以写300K的数据了?非要这样做么?

fatfs内存需要太大,编译的时候一个fatfs变量,f_open()编译后溢出。

我一个小时就一次发帖....
(309745502)

出0入0汤圆

 楼主| 发表于 2012-4-3 19:34:19 | 显示全部楼层
GoodForum 发表于 2012-4-3 19:17
多谢你~~~
读是可以用的。原来没注意block和sec的关系,现在用TI的函数可以读了。
不过写不能原来的,现 ...

比如,你的一个文件是 123 byte,要写入新数据,只能将原来的数据覆盖,且所写内容大小必须为  123 byte,pff 适合读取文件,如字库等,不适合写……写的话用 Fatfs吧
(309738098)

出0入0汤圆

发表于 2012-4-3 21:37:43 | 显示全部楼层
我建立一个txt文件里面全是空格共计300K,这样是不是可以写300K的数据。这300K要一次写完么?还是说这次写1K,没面开机在写1k;或者在一次中分多次写,每次隔N秒写1K。
(309055398)

出0入0汤圆

 楼主| 发表于 2012-4-11 19:16:03 | 显示全部楼层
GoodForum 发表于 2012-4-3 21:37
我建立一个txt文件里面全是空格共计300K,这样是不是可以写300K的数据。这300K要一次写完么?还是说这次写1 ...

自己摸索吧,试试就知道了。
(309055068)

出0入0汤圆

发表于 2012-4-11 19:21:33 | 显示全部楼层
进来支持并学习
(308221055)

出0入0汤圆

发表于 2012-4-21 11:01:46 | 显示全部楼层
MARK
收藏
(307959426)

出0入0汤圆

发表于 2012-4-24 11:42:15 | 显示全部楼层
这个很实用啊
(303290222)

出0入0汤圆

发表于 2012-6-17 12:42:19 | 显示全部楼层
MARK
(299784694)

出0入0汤圆

发表于 2012-7-28 02:27:47 | 显示全部楼层
正要用呢
(281401003)

出0入0汤圆

发表于 2013-2-25 21:02:38 | 显示全部楼层
楼主威武……谢谢分享!
(281255596)

出0入0汤圆

发表于 2013-2-27 13:26:05 | 显示全部楼层
谢谢分享,不知道支持的容量和卡的种类怎么样?
(280027273)

出0入0汤圆

发表于 2013-3-13 18:38:08 | 显示全部楼层
不错哦,学习下
(280020088)

出0入0汤圆

发表于 2013-3-13 20:37:53 | 显示全部楼层
好资料,标记一下
(278026281)

出0入0汤圆

发表于 2013-4-5 22:28:00 | 显示全部楼层
cc1989summer 发表于 2012-4-3 19:34
比如,你的一个文件是 123 byte,要写入新数据,只能将原来的数据覆盖,且所写内容大小必须为  123 byte, ...

楼主可以再详细说下这个吗?

    如果文件1的和文件2同在SPI的一个BLOCK区内,如果改写文件1的内容,在物理层上必定要擦除这个block区,这样也会把文件2抹掉,除非把整个block区先备份出来,但是没有看到相应的代码。它是整么做到只改写文件1而不影响文件2的?

[list=2]
如果文件1的大小为123B,写入的时候可以只改写局部内容吗?比如将第7-9字节改成“abc”


因为我手头没有430+SD卡的环境,楼主可以帮确认下吗? 谢谢!
(277599347)

出0入0汤圆

 楼主| 发表于 2013-4-10 21:03:34 | 显示全部楼层
himm007 发表于 2013-4-5 22:28
楼主可以再详细说下这个吗?

如果文件1的和文件2同在SPI的一个BLOCK区内,如果改写文件1的内容,在物理 ...

这个是有文件系统的,不会整个BLOCK擦除。只修改文件1,其他一切不变
(277537732)

出0入0汤圆

发表于 2013-4-11 14:10:29 | 显示全部楼层
cc1989summer 发表于 2013-4-10 21:03
这个是有文件系统的,不会整个BLOCK擦除。只修改文件1,其他一切不变

后来我看了下FAT文件系统的介绍,簇是文件的最小IO单位,也就是说一个簇只能分配给一个文件。
这样即使一个文件只有100B,但它也要占用4KB的一个簇空间。擦除一个文件的时候,只需要把这个文件所占用的簇抹掉,而不会影响到其他的文件。
(268378280)

出0入0汤圆

发表于 2013-7-26 14:28:01 | 显示全部楼层
楼主思路很清晰
(268044575)

出0入0汤圆

发表于 2013-7-30 11:09:46 | 显示全部楼层
谢楼主,现在正研究MSP430F5438,也想弄SD呢~~借鉴一下
(252990059)

出0入0汤圆

发表于 2014-1-20 16:58:22 | 显示全部楼层
楼主,能推荐一些入门级的SD卡操作资料吗?
(252990043)

出0入0汤圆

发表于 2014-1-20 16:58:38 | 显示全部楼层
楼主,能推荐一些入门级的SD卡操作资料吗?
(248257698)

出0入0汤圆

发表于 2014-3-16 11:31:03 | 显示全部楼层
问一下楼主你说的“只能写入原文件大小的数据”什么意思
(248167766)

出0入0汤圆

 楼主| 发表于 2014-3-17 12:29:55 | 显示全部楼层
金美祖 发表于 2014-1-20 16:58
楼主,能推荐一些入门级的SD卡操作资料吗?


主要参考TI的官方资料 http://www.ti.com/lit/an/slaa281b/slaa281b.pdf



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
(248167569)

出0入0汤圆

 楼主| 发表于 2014-3-17 12:33:12 | 显示全部楼层
艾北之北 发表于 2014-3-16 11:31
问一下楼主你说的“只能写入原文件大小的数据”什么意思

意思是:写入文件,原来是多大的文件,写入后,还是多大。或者,原文是10个字,写入后文件还得是10个字
(246164377)

出0入0汤圆

发表于 2014-4-9 16:59:44 | 显示全部楼层
正需要,谢谢
(243317671)

出0入0汤圆

发表于 2014-5-12 15:44:50 | 显示全部楼层
问一下 程序里面那个s2应该怎么设置啊!我怎么写不进去数据啊
(243316798)

出0入0汤圆

发表于 2014-5-12 15:59:23 | 显示全部楼层
我想里面写数据返回值是卷没有被挂载,怎么把那,我就只把spi改了其他都没动啊
(239963433)

出0入0汤圆

发表于 2014-6-20 11:28:48 | 显示全部楼层
问一下大神我的文件系统也是FAT16的但是写东西发现有些越慢
(233113703)

出0入0汤圆

发表于 2014-9-7 18:10:58 | 显示全部楼层
楼主威武!
(233100983)

出0入0汤圆

发表于 2014-9-7 21:42:58 | 显示全部楼层
研究研究
(230526807)

出0入0汤圆

发表于 2014-10-7 16:45:54 | 显示全部楼层
不错,mark!
(180179270)

出0入0汤圆

发表于 2016-5-12 10:11:31 | 显示全部楼层
看看代码的基本框架!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2022-1-26 19:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表