6

我的 SD 卡有问题。我正在使用 FatFs 库版本 R0.10b 来访问 SD 卡。

我的代码:

    // .... //
    FATFS fatfs;
    FIL plik;
    FRESULT fresult,res1,res2,res3,res4,res5;
    UINT zapisanych_bajtow = 0 , br;
    UINT zapianie_bajtow = 0;
    char * buffor = "123456789abcdef\r\n";
    unsigned short int i;

    void main(void) {

    // ... //

       res1 = f_mount(0,&fatfs); // returns FA_OK
        res2 = f_open( &plik, "f721.txt", FA_OPEN_ALWAYS | FA_WRITE ); // returns FA_OK
        if( res2 == FR_OK )
        {
                res3 = f_write( &plik, ( const void * ) buffor, 17, &zapisanych_bajtow ); // returns FR_DISK_ERR
        }

        res4 = f_close( &plik );// returns FR_DISK_ERR

        for(;;)
        {

        }
}

知道可能出了什么问题吗?

4

3 回答 3

2

我有类似的错误,只有一个区别。我尝试一次用f_write函数写入 4096 字节。它总是返回 FR_DISK_ERR。这是因为我试图在 FatFS 的 FIL 结构中写入更多的 IO 缓冲区大小(在 ff.h 中定义)。

typedef struct {
    FATFS*  fs;             /* Pointer to the related file system object (**do not change order**) */
    WORD    id;             /* Owner file system mount ID (**do not change order**) */
    BYTE    flag;           /* Status flags */
    BYTE    err;            /* Abort flag (error code) */
    DWORD   fptr;           /* File read/write pointer (Zeroed on file open) */
    DWORD   fsize;          /* File size */
    DWORD   sclust;         /* File start cluster (0:no cluster chain, always 0 when fsize is 0) */
    DWORD   clust;          /* Current cluster of fpter (not valid when fprt is 0) */
    DWORD   dsect;          /* Sector number appearing in buf[] (0:invalid) */
    DWORD   dir_sect;       /* Sector number containing the directory entry */
    BYTE*   dir_ptr;        /* Pointer to the directory entry in the win[] */
    DWORD*  cltbl;          /* Pointer to the cluster link map table (Nulled on file open) */
    UINT    lockid;         /* File lock ID origin from 1 (index of file semaphore table Files[]) */
    BYTE    buf[_MAX_SS];   /* File private data read/write window */
} FIL;

最后一个数组buf[_MAX_SS]是文件 IO 缓冲区。但是 _MAX_SS 是用户定义的参数(在 ff.h 中定义),因此您可以减少一次写入的字节数或最终更改 _MAX_SS 值。

我知道这不是你的情况,因为你一次只写 17 个字节,但这对其他人有帮助。

于 2016-02-05T14:24:45.323 回答
0

我完成 TMS 已经有几年了,但也许它会对你有所帮助:

FA_OPEN_ALWAYS  Opens the file if it is existing. If not, a new file is created.
To append data to the file, use f_lseek() function after file open in this method.

如果文件不存在,请使用:

FA_CREATE_NEW   Creates a new file. The function fails 
with FR_EXIST if the file is existing.
于 2014-08-19T13:37:21.687 回答
0

我在 MSP430 上实现 Chan FatFs 时遇到了同样的问题 - 在调用disk_write () 时总是收到 FR_DISK_ERR 结果。

我的问题原因如下:

  • xmit_datablock () 调用操作失败,返回 0。
  • xmit_datablock () 失败是因为xmit_spi_multi () 失败。
  • xmit_spi_multi () 失败,因为仅从缓冲区传输字节是不够的。每次写入后都必须从 RXBUF 读取。这是修复问题后的样子:

        /* Block SPI transfers */
        static void xmit_spi_multi (
            const BYTE* buff,   /* Data to be sent */
            UINT cnt            /* Number of bytes to send */
            )
        {
            do {
                volatile char x; 
                UCA1TXBUF= *buff++; while(! (UCA1IFG & UCRXIFG)) ; x = UCA1RXBUF; 
                UCA1TXBUF= *buff++; while(! (UCA1IFG & UCRXIFG)) ; x = UCA1RXBUF; 
    
            } while (cnt -= 2);
        }
    

    在修复此问题之前,每次写入 UCA1TXBUF 后都没有读取 UCA1RXBUF。修复 xmit_spi_multi() 后,disk_write() 中的 FR_DISK_ERR 问题得到解决。

于 2015-03-28T23:13:47.610 回答