TMS320F2812 FatFs f_write returns FR_DISK_ERR

谁说我不能喝 提交于 2019-12-10 16:36:27

问题


I have problem with an SD card. I'm using the FatFs library ver R0.10b to access the SD card.

My code:

    // .... //
    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(;;)
        {

        }
}

Any idea what might be wrong?


回答1:


I had similar error with just one difference. I tried to write 4096bytes with f_write function at once. And it always returned FR_DISK_ERR. And this was caused because I tried to write more then is size of IO buffer in FIL structure in FatFS (defined in 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;

The last array buf[_MAX_SS] is the file IO buffer. But _MAX_SS is user defined parameter (defined in ff.h) so you can decrease the amount of bytes written at once or eventually change the _MAX_SS value.

I know this is not your case because you only write 17 bytes at once, but this can be helpful for others.




回答2:


It's few years when I finished with TMS but maybe it will help you:

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.

If file does not exists use:

FA_CREATE_NEW   Creates a new file. The function fails 
with FR_EXIST if the file is existing.



回答3:


I had the same issue with implementation of Chan FatFs on MSP430- always received FR_DISK_ERR result on calling disk_write().

My reason of the issue was the following:

  • operation failed on xmit_datablock() call, it returned 0.
  • xmit_datablock() failed because of xmit_spi_multi() failed.
  • xmit_spi_multi() failed because it was not enough to just transmit bytes from buffer. It was necessary to read from RXBUF after every write. Here it is how it looks after the issue was fixed:

        /* 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);
        }
    

    Before fixing the issue there was no read from UCA1RXBUF following every write to UCA1TXBUF. After fixing xmit_spi_multi() my issue with FR_DISK_ERR in disk_write() was solved.



来源:https://stackoverflow.com/questions/25384564/tms320f2812-fatfs-f-write-returns-fr-disk-err

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!