我有一个SD卡(或SDHC卡)通过SPI模式连接到微控制器。我正在使用Chan的FAT库。在这里我使用了CodevisionAVR v2.05.3示例代码来自帮助。通过使用这个我读取文本文档并使用open existing打开文件。
然而,当我在创建新文件或尝试编写时,我无法打开文件(执行f_open)。给出错误错误:FR_INVALID_OBJECT。
如何清除此问题?
我的代码是
/* ATmega128 I/O register definitions */
#include <io.h>
#if defined(_CHIP_ATMEGA32_)
#warning using ATMEGA32
#define TIMSK1 TIMSK
#define UCSR0A UCSRA
#define UCSR0B UCSRB
//#define UCSR0C UCSRC //this is commented out
#define UBRR0H UBRRH
#define UBRR0L UBRRL
#define TXEN0 TXEN
#endif
/* FAT on MMC/SD/SD HC card support */
#include <ff.h>
/* printf */
#include <stdio.h>
/* string functions */
#include <string.h>
#include <delay.h>
/* Timer1 overflow interrupt frequency [Hz] */
#define T1_OVF_FREQ 100
/* Timer1 clock prescaler value */
#define T1_PRESC 1024L
/* Timer1 initialization value after overflow */
#define T1_INIT (0x10000L-(_MCU_CLOCK_FREQUENCY_/(T1_PRESC*T1_OVF_FREQ)))
/* USART Baud rate */
#define BAUD_RATE 9600
#define BAUD_INIT (_MCU_CLOCK_FREQUENCY_/(BAUD_RATE*16L)-1)
/* root directory path */
char path[] = "0:/fil.txt";
/* text to be written to the file */
char text[]="I like CodeVisionAVR!";
/* 100Hz timer interrupt generated by ATmega128 Timer1 overflow */
interrupt [TIM1_OVF] void timer_comp_isr(void)
{
/* re-initialize Timer1 */
TCNT1H = T1_INIT >> 8;
TCNT1L = T1_INIT & 0xFF;
/* MMC/SD/SD HC card access low level timing function */
disk_timerproc();
}
/* error message list */
flash char *flash error_msg[] = {
"", /* not used */
"FR_DISK_ERR",
"FR_INT_ERR",
"FR_INT_ERR",
"FR_NOT_READY",
"FR_NO_FILE",
"FR_NO_PATH",
"FR_INVALID_NAME",
"FR_DENIED",
"FR_EXIST",
"FR_INVALID_OBJECT",
"FR_WRITE_PROTECTED",
"FR_INVALID_DRIVE",
"FR_NOT_ENABLED",
"FR_NO_FILESYSTEM",
"FR_MKFS_ABORTED",
"FR_TIMEOUT"
};
/* display error message and stop */
void error(FRESULT res)
{
if ((res >= FR_DISK_ERR) && (res <= FR_TIMEOUT))
printf("ERROR: %p\r\n", error_msg[res]);
/* stop here */
while (1);
}
void main(void)
{
/* FAT function result */
FRESULT res;
/* will hold the information for logical drive 0: */
FATFS drive;
/* will hold the file information */
FIL file;
/* number of bytes written/read to the file */
unsigned int nbytes;
/* file read buffer */
char buffer[256];
/* initialize Timer1 overflow interrupts in Mode 0 (Normal) */
TCCR1A = 0x00;
/* clkio/1024 */
TCCR1B = (1<<CS12)|(1<<CS10);
/* timer overflow interrupts will occur with 100Hz frequency */
TCNT1H = T1_INIT >> 8;
TCNT1L = T1_INIT & 0xFF;
/* enable Timer1 overflow interrupt */
TIMSK1 = 1 << TOIE1;
/* initialize the USART0 TX, 8N1, Baud rate: 19200 */
UCSR0A = 0;
UCSR0B = 1 << TXEN0;
// UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
UBRR0H = BAUD_INIT >> 8;
UBRR0L = BAUD_INIT & 0xFF;
/* globally enable interrupts */
#asm("sei")
PORTB.4 = 0;
delay_ms(1000);
printf("\n\nDirectory listing for root of logical drive 0:\r\n");
/* mount logical drive 0: */
if ((res = f_mount(0, &drive)) == FR_OK)
printf("Logical drive 0: mounted OK\r\n");
else
/* an error occured, display it and stop */
error(res);
printf("%s \r\n",path);
/* open the file in read mode */
if ((res=f_open(&file,path,FA_READ))==FR_OK)
printf("1_File %s opened OK\r\n",path);
else
/* an error occured, display it and stop */
error(res);
/* read and display the file's content.
make sure to leave space for a NULL terminator
in the buffer, so maximum sizeof(buffer)-1 bytes can be read */
if ((res=f_read(&file,buffer,sizeof(buffer)-1,&nbytes))==FR_OK)
{
printf("%u bytes read\r\n",nbytes);
/* NULL terminate the char string in the buffer */
buffer[nbytes+1]=NULL;
/* display the buffer contents */
printf("Read text: \"%s\"\r\n",buffer);
}
else
/* an error occured, display it and stop */
error(res);
/* close the file */
if ((res=f_close(&file))==FR_OK)
printf("1_File %s closed OK\r\n\n\n",path);
else
/* an error occured, display it and stop */
error(res);
/* create a new file in the root of drive 0:
and set write access mode */
if ((res=f_open(&file,path, FA_OPEN_EXISTING))==FR_OK)
printf("File %s opened OK\r\n",path);
else
/* an error occured, display it and stop */
error(res);
/* close the file */
if ((res=f_close(&file))==FR_OK)
printf("2_File %s closed OK\r\n\n\n",path);
else
/* an error occured, display it and stop */
error(res);
if ((res=f_open(&file,path, FA_WRITE | FA_CREATE_ALWAYS))==FR_OK)
printf("File %s created OK\r\n",path);
else
/* an error occured, display it and stop */
error(res);
/* write some text to the file,
without the NULL string terminator sizeof(data)-1 */
if ((res=f_write(&file,text,sizeof(text)-1,&nbytes))==FR_OK)
printf("%u bytes written of %u\r\n",nbytes,sizeof(text)-1);
else
/* an error occured, display it and stop */
error(res);
/* close the file */
if ((res=f_close(&file))==FR_OK)
printf("3_File %s closed OK\r\n\n\n",path);
else
/* an error occured, display it and stop */
error(res);
/* open the file in read mode */
if ((res=f_open(&file,path,FA_READ))==FR_OK)
printf("1_File %s opened OK\r\n",path);
else
/* an error occured, display it and stop */
error(res);
/* read and display the file's content.
make sure to leave space for a NULL terminator
in the buffer, so maximum sizeof(buffer)-1 bytes can be read */
if ((res=f_read(&file,buffer,sizeof(buffer)-1,&nbytes))==FR_OK)
{
printf("%u bytes read\r\n",nbytes);
/* NULL terminate the char string in the buffer */
buffer[nbytes+1]=NULL;
/* display the buffer contents */
printf("Read text: \"%s\"\r\n",buffer);
}
else
/* an error occured, display it and stop */
error(res);
/* close the file */
if ((res=f_close(&file))==FR_OK)
printf("4_File %s closed OK\r\n",path);
else
/* an error occured, display it and stop */
error(res);
printf("done\r\n");
PORTB.4 = 1;
/* stop here */
while (1);
}
答案 0 :(得分:0)
来自文档:
FR_INVALID_OBJECT
文件/目录对象结构无效或给出了空指针。卷装入过程使逻辑驱动器的所有打开对象无效。
您的文件指针可能为空?
另外要考虑的是,您已将库配置为实际支持写入操作。在ffconf.h中你应该有:
#define _FS_READONLY 0