我的SD卡有问题。我正在使用FatFs库ver 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(;;)
{
}
}
知道可能出现什么问题吗?
答案 0 :(得分:1)
我遇到了类似的错误,只有一个区别。我试着一次用 f_write 函数写4096bytes。它总是返回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个字节,但这对其他人有帮助。
答案 1 :(得分: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.
答案 2 :(得分:0)
我在MSP430上实现Chan FatFs时遇到了同样的问题 - 在调用 disk_write ()时始终收到FR_DISK_ERR结果。
我的问题原因如下:
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的问题。