[原创] Petit FatFs在MSP430的移植,送给需要的人

cc1989summer   2012-3-24 20:13 楼主
【建议初学SD卡时先搞懂MSP430在无文件系统下的SD卡读写】

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


可实现以下功能:
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)



或者如下图所示: msp430.JPG

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);

整个工程的原始代码见:
SD pff.rar (120.64 KB)
(下载次数: 356, 2012-3-24 20:13 上传)

回复评论 (8)

2推荐 espon2006 

无法连续写入资料

关於大大发的Petit Fatfa文章,我依造大大的指导,已经可以使用SD,但是,有个问题是为何在写入资料时, res= pf_write(towrite, sizeof(towrite), &s2);
假设每笔资料为64Bytes写入 &s2 暂存器内,只能写进512Bytes,之後就写不进SD了,用除错器查看&s2 内容,一样也是存到512,只後就归0,这到底是什么原因?
点赞  2012-5-23 08:51
这个东西非常不错,正好合适目前的开发,非常感谢。
点赞  2012-5-18 00:10
帮助很大。。。谢谢楼主分享
点赞  2013-3-12 16:50

移植问题

你好,谢谢你的无私分享哈。我移植到F5529的时候出现了问题。
typedef struct {
        WORD        index;                /* Current read/write index number */
        BYTE*        fn;                        /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */
        CLUST        sclust;                /* Table start cluster (0:Static table) */
        CLUST        clust;                /* Current cluster */
        DWORD        sect;                /* Current sector */
} DIR;  
编译的时候这里报错: expected an identifier。可以帮我解答下吗?谢谢。这个pff.h是直接复制过去的。
点赞  2013-12-10 22:40

移植问题

你好,谢谢你的无私分享哈。我移植到F5529的时候出现了问题。
typedef struct {
        WORD        index;                /* Current read/write index number */
        BYTE*        fn;                        /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */
        CLUST        sclust;                /* Table start cluster (0:Static table) */
        CLUST        clust;                /* Current cluster */
        DWORD        sect;                /* Current sector */
} DIR;  
编译的时候这里报错: expected an identifier。可以帮我解答下吗?谢谢。这个pff.h是直接复制过去的。
点赞  2013-12-10 22:43

移植问题

你好,谢谢你的无私分享哈。我移植到F5529的时候出现了问题。
typedef struct {
        WORD        index;                /* Current read/write index number */
        BYTE*        fn;                        /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */
        CLUST        sclust;                /* Table start cluster (0:Static table) */
        CLUST        clust;                /* Current cluster */
        DWORD        sect;                /* Current sector */
} DIR;  
编译的时候这里报错: expected an identifier。可以帮我解答下吗?谢谢。这个pff.h是直接复制过去的。
点赞  2013-12-10 22:44
我也遇到了。。。DIR在5529头文件里已经被定义了,因此要把DIR改了
点赞  2014-1-2 07:55
能发F5529 SD卡无系统的程序学习一下吗
点赞  2014-5-9 00:59
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复