求助:STC12C5A60S2+SD+znFAT不能打开文件原因
SD卡初始化是可以的,也能进行扇区的读写测试但执行到znFAT的znFAT_Open_File(&FileInfo,"\\*.*",n,1)就没有回应了????例如下:
#include "uart.h"
#include "znFAT.h"
#include "STC12C5A60S2.h"
#include "sdx.h"
/**************************************************************
+---------------------------------------------------------+
|振南电子 高级外设测试 之打开SD卡根目录下test.txt文件 |
+---------------------------------------------------------+
此源码版权属 振南 全权享有,如欲引用,敬请署名并告知
严禁随意用于商业目的,违者必究,后果自负
振南电子
->产品网站 http://www.znmcu.cn/
->产品网店 http://shop.znmcu.cn/
->产品咨询 QQ :987582714
MSN:yzn07@126.com
WW :yzn07
程序说明:本程序调用znFAT的打开文件函数,打开SD卡根目录下的
test.txt文件。
注:SD卡相关教程请参见
《振南的疯狂单片机(51)》高级外围篇 之 《SD卡【II】》
**************************************************************/
///////////////////
#define ADDR 78 //要操作的SD卡的扇区地址
sbit LED=P1^3; //如果测试成功,此IO上连接的二极管被点亮
unsigned char xdata pbuf; //数据缓冲区
////////////////////
void test(void);
unsigned char Dev_No; //设备号
struct znFAT_Init_Arg *pArg; //用于指针文件系统参数集合的指针
struct znFAT_Init_Arg Init_Arg_SDCARD; //文件系统参数集合,用于记录文件系统的重要参数
struct FileInfoStruct FileInfo; //文件参数集合
void main()
{
P1M1=0x40; //1000000
P1M0=0xB0; //之前B0现改A0P1.7P1.5P1.4强推挽 10110000
UART_Init(); //串口初始化
UART_Send_Str("串口初始化成功\n"); //从串口输出文件参数信息
znFAT_Device_Init(); //存储设备初始化
UART_Send_Str("存储设备初始化成功\n");
pArg=&Init_Arg_SDCARD; //指针指向SD卡文件系统参数集合,znFAT将从这个集合中获取参数
Dev_No=SDCARD; //设备号为SDCARD,znFAT依照此设备号选择存储设备驱动
UART_Send_Str("读取信息中请稍后\n"); //从串口输出文件参数信息
znFAT_Init(); //文件系统初始化
UART_Put_Inf("总存储容量:(字节)",pArg->Total_Size); //从串口输出各种参数信息
UART_Put_Inf("每扇区字节:(个)",pArg->BytesPerSector);
UART_Put_Inf("每簇扇区:(个)",pArg->SectorsPerClust);
//////////////
test(); //读写测试
////////////////////
if(!znFAT_Open_File(&FileInfo,"\\*.*",0,1)) //打开\test.txt
{
UART_Send_Str("打开文件成功\n"); //从串口输出文件参数信息
UART_Send_Str("文件名为:");
UART_Send_Str(FileInfo.FileName);
UART_Send_Enter();
UART_Put_Inf("文件大小(字节):",FileInfo.FileSize);
UART_Put_Inf("文件当前偏移量(字节):",FileInfo.FileCurOffset);
UART_Send_Str("文件创建时间:\n");
UART_Put_Num(FileInfo.FileCreateDate.year);UART_Send_Str("年");
UART_Put_Num(FileInfo.FileCreateDate.month);UART_Send_Str("月");
UART_Put_Num(FileInfo.FileCreateDate.day);UART_Send_Str("日");
UART_Put_Num(FileInfo.FileCreateTime.hour);UART_Send_Str("时");
UART_Put_Num(FileInfo.FileCreateTime.min);UART_Send_Str("分");
UART_Put_Num(FileInfo.FileCreateTime.sec);UART_Send_Str("秒");
UART_Send_Enter();
}
else
{
UART_Send_Str("打开文件失败\n");
}
}
void test() //读写测试
{
int i=0;
unsigned char flag=0;
for(i=0;i<512;i++)
pbuf=i; //向数据缓冲区中写入0~255 0~255,共512个字节
UART_Send_Str("向缓冲区中装入完毕\r\n");
SD_Write_Sector(ADDR,pbuf);//将数据缓冲区中的512个字节的数据写入SD卡的第ADDR扇区中
UART_Send_Str("写 SD卡扇区完毕\r\n");
for(i=0;i<512;i++) //清空数据缓冲区
pbuf=0;
UART_Send_Str("清空缓冲区完毕\r\n");
SD_Read_Sector(ADDR,pbuf);//从SD卡的第ADDR扇区中读取512个字节的数据到数据缓冲区
UART_Send_Str("读 SD卡扇区完毕\r\n");
for(i=0;i<512;i++)
{
if(((unsigned char)i)!=pbuf)//对读出的数据进行匹配,如果不吻合则flag=1,否则flag=0
{
flag=1;
break;
}
}
UART_Send_Str("匹配完毕\r\n");
if(flag)
{
// LED=1; //发光二极管灭
UART_Send_Str("SD卡扇区读写测试失败!\r\n"); //数据不吻合
}
else
{
// LED=0; //发光二极管点亮
UART_Send_Str("SD卡扇区读写测试成功!\r\n"); //数据吻合
}
while(1);
} 哈哈,我昨天也正好做了这个测试,到创建文件时就不正常了。不能创建文件。 为嘛不用FatFS? mark。。。 我用那个完全测试的那个程序,
就是类似dos操作的那个.
没有问题.
另外请问楼上兄弟:fatfs在51下能跑起来吗? 回复【1楼】hero245
哈哈,我昨天也正好做了这个测试,到创建文件时就不正常了。不能创建文件。
-----------------------------------------------------------------------
期待你的成功资料!! 回复【4楼】yanjian1
另外请问楼上兄弟:fatfs在51下能跑起来吗?
-----------------------------------------------------------------------
有Petit FatFs,专用于小RAM单片机。
本人已测试,很好用,仅需极低RAM即可。 回复【楼主位】lf415744311
-----------------------------------------------------------------------
这个问题 有可能原因非常的简单, 你的SD卡不是fat32文件系统而是FAT文件系统
把SD卡格式化了,格式化成FAT32文件系统就OK了呵呵 ,当然还有可能是其他原因,但是 程序死在那里,多半是这个原因 mofan2 发表于 2012-2-22 00:43 static/image/common/back.gif
回复【楼主位】lf415744311
-----------------------------------------------------------------------
...
非常感谢我就是这种情况 我的读很正常,新建文件出问题,在板子上新建都ok,就是电脑识别不了,用winhex看也没有看到。创建文件失败啊!
页:
[1]