源码是从官网直接下载下来的,版本为R0.33 /*----------------------------------------------------------------------------/ / FatFs - Generic FAT Filesystem Module R0.13c / /-----------------------------------------------------------------------------/ 文件可以读写,也可以创建文件,但是在写文件时有一个奇怪的现象:通过PC文件浏览器显示文件大小为0,具体表现如下: 1、写入的内容使用DiskGenius可以查看到内容。 2、写入完成后使用该文件系统读取文件长度为0. 3、使用DiskGenius查看文件的目录,发现0x1C开始的值没有变(为0)。 4、如果使用PC将文件写入内容,比如100字节,那么使用单片机不管写入多少在PC上都只能看到100字节,而使用DiskGenius、Winhex可以看到单片机写入的所有内容,只是文件目录项的“文件长度”依旧为100. 之前测试FatFs的“阉割版”Petit FatFs时发现这个问题,以为FatFs没有这个问题了。 不知道其他朋友有没有遇到这个问题,一开始我以为是没有调用f_sync()同步文件内容,可是写入完成后我调用了f_sync()函数在f_close()也不起作用。 从WinHex的显示来看,单片机没有给WRITE.TXT分配起始簇,真是神奇了! WinHex读å PCæ件æµè§å¨ |
你是用的模拟SPI么?我看网上都是用的SDIO,但是从原理上来说应该都一样的。我用FatFS官网下载的demo和Cube生成的代码都测试了,全部都是一个现象:可以读、可以创建文件,但是就是不能正常写入文件,写操作完成后程序也能反馈FR_OK,但是在此读取的时候返回FR_DISK_ERR。
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM1_Init();
MX_USART1_UART_Init();
MX_FATFS_Init();
/* USER CODE BEGIN 2 */
FATFS fs;
FIL file;
FIL *fp = &file;
UINT br;
FRESULT res = FR_OK;
BYTE buffer[200];
printf("Initialize SD Card !\r\n");
res = f_mount(&fs, "0:\\", 1);
printf("f_mount(), res = %d\r\n", res);
if(FR_OK == res)
{
res = f_open(fp, "0:\\MESSAGE.TXT", FA_OPEN_EXISTING/*FA_OPEN_ALWAYS*/ | FA_READ);
printf("f_open(), res = %d\r\n", res);
if(FR_OK != res)
{
while(1);
}
}
if(FR_OK == res)
{
br = 0;
res = f_lseek(fp, 0);
printf("f_lseek(), res = %d\r\n", res);
res = f_read(fp, buffer, sizeof(buffer) - 1, &br);
printf("f_read(), res = %d, br = %d\r\n", res, br);
if(FR_OK != res && br < 1)
{
while(1);
}
else
{
int i = 0;
while(i < br)
{
putchar(buffer);
i ++;
}
}
}
res = f_close(fp);
printf("f_close(), res = %d\r\n", res);
res = f_open(fp, "0:\\TEST.TXT", /*FA_CREATE_NEW |*/ FA_WRITE);
printf("f_open(), res = %d\r\n", res);
if(FR_OK == res)
{
UINT bw = 0;
res = f_lseek(fp, f_size(fp));
printf("f_lseek(), res = %d\r\n", res);
res = f_write(fp, "Hello world !\r\n", sizeof("Hello world !\r\n"), &bw);
printf("f_write(), res = %d, bw = %d\r\n", res, bw);
}
f_sync(fp);
f_close(fp);
res = f_open(fp, "0:\\TEST.TXT", FA_OPEN_EXISTING | FA_READ);
printf("f_open(), res = %d\r\n", res);
res = f_lseek(fp, 0);
printf("f_lseek(), res = %d\r\n", res);
res = f_read(fp, buffer, sizeof(buffer) - 1, &br);
printf("f_read(), res = %d, br = %d\r\n", res, br);
if(FR_OK != res && br < 1)
{
// while(1);
}
else
{
int i = 0;
while(i < br)
{
putchar(buffer);
i ++;
}
}
f_close(fp);
f_mount(&fs, "0:\\", 0);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}