OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13490|回复: 19

求大神指导。我的SD卡写文件能够写的进去,但是在电脑上打开时什么都没有,求帮忙

[复制链接]

6

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-11-3
在线时间
0 小时
发表于 2014-11-20 12:03:07 | 显示全部楼层 |阅读模式
5金钱
如题,我的F4的板子,文件系统版本是R0.07e。已经调了4,5天了,快崩溃了,就大家帮我看看程序到底有什么问题,万分感谢!!!
/*********************************************************************************************************
*
* File               : main.c
* Hardware Environment: 
* Build Environment   : RealView MDK-ARM  Version: 4.20
* Version             : V1.0
* By                 : 
*
*                                  (c) Copyright 2005-2011, WaveShare
*                                       http://www.waveshare.net
*                                          All Rights Reserved
*
*********************************************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx.h"
#include "sdcard.h"
#include "usart.h"
#include "string.h"
#include "diskio.h"
#include "ff.h"

/* Private functions ---------------------------------------------------------*/
FATFS fs;            // Work area (file system object) for logical drive
FIL fsrc;      // file objects
FRESULT res;         // FatFs function common result code
UINT bw;         // File R/W count
XCHAR fileName[20]="test1.txt";

/*******************************************************************************
* Function Name : NVIC_Config
* Description   : Configures SDIO IRQ channel.
* Input         : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  /* Configure the NVIC Preemption Priority Bits */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
 
void WRUTE_File(void)

FRESULT res;
DIR dirs;
char path[16]={""};  
char buffer[512]; //??????????????×é
int i;
for(i=0;i<512;i++)
{
buffer='k';
}

printf(" ??????????:%d\r\n",disk_initialize(0));
printf("????????:%d\r\n",f_mount(0, &fs));
if (f_opendir(&dirs, path) == FR_OK)
{
if(f_open(&fsrc, fileName, FA_READ|FA_WRITE|FA_OPEN_ALWAYS)) 
    {
printf("can not open file\r\n");
    }
else
{
printf("here A\r\n");

if(f_lseek(&fsrc,fsrc.fsize))//f_size(&file)
{
printf("can not seek the file pointer\r\n");
}
else
{
printf("filesize=%d\r\n",fsrc.fsize);

res=f_write(&fsrc, buffer, 512, &bw);

if(res==FR_OK)//????&file????filename???????×???·??3000??????????×?????
{
printf(" write ok\r\n");
printf("bw=%d\r\n",bw);
}
else
{printf("can not write file\r\n");}
}

}
else{printf("cao not open dir\r\n");}
    f_close(&fsrc);      // ??±???????±?????f_open????????????
    f_mount(0, 0);  //????????????
printf("here C\r\n");

}

/*******************************************************************************
* Function Name : main
* Description   : Main program.
* Input         : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{   

  SystemInit();/* Clock Config */
  
  NVIC_Configuration();/* Interrupt Config */

  USART_Configuration();  

//printf("buffer=%s\r\n",buffer);
  WRITE_File();
  
  /* Infinite loop */
  while (1);
}


这些ABC是我用来调试用的,没有什么意义。我在SD卡里看test1.txt还是0KB,不知道是什么原因
麻烦大家帮我看看,这的是绝望了。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-11-20 12:44:10 | 显示全部楼层
写完数据记得要调用f_close函数,否则是不保存的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

6

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-11-3
在线时间
0 小时
 楼主| 发表于 2014-11-20 13:19:52 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
已经调用了啊,而且我还显示了bw的值也是512.可是SD卡始终是0KB,求老师帮忙看看,麻烦了,万分感谢!
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-11-20 13:29:45 | 显示全部楼层
回复【3楼】Mars_man:
---------------------------------
f_write之后立刻调用f_close
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

6

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-11-3
在线时间
0 小时
 楼主| 发表于 2014-11-20 13:44:54 | 显示全部楼层
回复【3楼】Mars_man:
---------------------------------
刚刚照您说的去检测了f_close();还真是出了问题,文件关闭失败,那为什么会失败呢?不都是这样用的吗?感谢老师在百忙之中已于的帮助。
回复

使用道具 举报

6

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-11-3
在线时间
0 小时
 楼主| 发表于 2014-11-20 13:47:54 | 显示全部楼层
回复【4楼】Badu_Space:
---------------------------------
4楼回复错了
太感谢老师给予的解答了,大赞一个,虽然我还没有找您说的在write后立即调用close,但是感觉这就是解决办法
回复

使用道具 举报

6

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-11-3
在线时间
0 小时
 楼主| 发表于 2014-11-20 18:01:02 | 显示全部楼层
[mw_shl_code=c,true]void OutPutFile(void) { FRESULT res1; DIR dirs; char path[16]={""}; char buffer[512]; //??????????????×é int i; for(i=0;i<512;i++) { buffer='k'; } printf(" ??????????:%d\r\n",disk_initialize(0)); printf("????????:%d\r\n",f_mount(0, &fs)); if (f_opendir(&dirs, path) == FR_OK) { if(f_open(&fsrc, fileName, FA_READ|FA_WRITE|FA_OPEN_ALWAYS)) { printf("can not open file\r\n"); } else { printf("here A\r\n"); if(f_lseek(&fsrc,fsrc.fsize))//f_size(&file) { printf("can not seek the file pointer\r\n"); } else { printf("filesize=%d\r\n",fsrc.fsize); res=f_write(&fsrc, buffer, 512, &bw); res1=f_close(&fsrc); if(res==FR_OK) { printf(" write ok\r\n"); printf("bw=%d\r\n",bw); } else {printf("can not write file\r\n");} if(res1==FR_OK){printf("close successful\r\n");} else{printf("close failed\r\n");} } } } else{printf("cao not open dir\r\n");} f_mount(0, 0); //???????????? printf("here C\r\n"); [/mw_shl_code]
老师,照你说的去做了,把f_close,加在了f_write之后,但是还是显示关闭错误,即不返回FR_OK,请老师在帮忙看看,感谢
回复

使用道具 举报

1

主题

16

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2014-11-12
在线时间
0 小时
发表于 2014-11-20 19:29:26 | 显示全部楼层
回复【7楼】Mars_man:
---------------------------------
每次f_write后调用f_sync()试试,你的代码我还没看,呵呵,我也再搞这个,等会看看你的代码
回复

使用道具 举报

1

主题

16

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2014-11-12
在线时间
0 小时
发表于 2014-11-20 19:35:45 | 显示全部楼层
建议发来整个工程文件,另外说说常错的可能性 :你打开文件夹,即f_opendir,但是你之后没关它;另外文件关闭失败,应该是你打开时就有毛病了,可能是路径没好,f_mount没好,或者干脆SD卡本身有毛病(没格式化好)......
LZ调用f_open()时,fileName[20] = "test1.txt",这里是用的相对路径吗,相对路径使能了吗,f_opendir进入相对路径了吗?

建议去掉f_opendir(),如果LZ的文件在SD卡根目录下,那就filepath = "0:test1.txt" 打开


回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-11-20 19:36:34 | 显示全部楼层
回复【7楼】Mars_man:
---------------------------------
你的filename怎么定义的?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

6

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-11-3
在线时间
0 小时
 楼主| 发表于 2014-11-20 21:33:06 | 显示全部楼层
回复【10楼】Badu_Space:
---------------------------------
lfilename定义为:XCHAR fileName[20]="test1.txt";
我发现真正走不通的是在f_close内部的f_sync()这个函数,就是因为这个函数,所以程序走不通。
回复

使用道具 举报

6

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-11-3
在线时间
0 小时
 楼主| 发表于 2014-11-20 21:35:31 | 显示全部楼层
回复【9楼】黑白边缘:
---------------------------------
您说的在f_write后用f_sync函数应该是有用的,但是我现在的情况是f_sync函数走不通,不知道为什么。。。。
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-11-21 10:45:48 | 显示全部楼层
回复【11楼】Mars_man:
---------------------------------
下面是我的操作,立马成功,电脑读取和写入的数据一样
f_mount(0, fs[0]); //挂载SD卡
f_open(filescr, "0:/SYSTEM/test1.txt", FA_OPEN_NEW_COVER);
f_write(filescr, buffer, sizeof(buffer), &bw);
f_close(filescr);
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

1

主题

16

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2014-11-12
在线时间
0 小时
发表于 2014-11-21 11:19:05 | 显示全部楼层
回复【12楼】Mars_man:
---------------------------------
如果ff.c没错的话(LZ没有无意中改动过),那么还是看看前面的f_open以及f_mount吧,前面的对了,后面一般不会出错。另外,建议LZ把调用f_mount的代码发来,如果可以f_open()用全路径吧;另外,LZ的SD卡最好在开发板上面进行格式化,并确保成功,程序简单,要错最有可能的不是逻辑,而是有些基本的LZ可能忽略了
回复

使用道具 举报

1

主题

16

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2014-11-12
在线时间
0 小时
发表于 2014-11-21 11:23:47 | 显示全部楼层
额,LZ有其他参考代码吗?发一点代码先

[mw_shl_code=c,true]int main(void) { FRESULT res; uint32_t byteswritten;   volatile int num = 0; HAL_Init(); SystemClock_Config(); res = FATFS_LinkDriver(&SDRAMDISK_Driver, RAMpath); if(res != FR_OK) Error_Handler(); res = FATFS_LinkDriver(&SD_Driver, SDpath); if(res != FR_OK) Error_Handler(); res = f_mount(&RAMFatFs, (TCHAR const*)RAMpath, 0); if(res != FR_OK) Error_Handler(); res = f_mount(&SDFatFs, (TCHAR const*)SDpath, 0); if(res != FR_OK) Error_Handler(); /* res = f_mkfs((TCHAR const*)SDpath, 0, 0); if(res != FR_OK) Error_Handler(); */ res = f_open(&SDFile, "1:STM000.c", FA_OPEN_ALWAYS | FA_WRITE); if(res != FR_OK)     Error_Handler(); write_buf(middle);       //往middle里面填满4096字节数据 while(1) {     num++; res = f_write(&SDFile, middle, 4096, (void *)&byteswritten); f_sync(&SDFile); } f_close(&SDFile); FATFS_UnLinkDriver(RAMpath); FATFS_UnLinkDriver(SDpath); /* Infinite loop */ while (1) { } } void write_buf(char middle[4096]) { char *p = "aaaaaaaabbbbbbbbeeeeeeeeffffffff"; int count = 0; while(count < 128) { count++; strncat(middle,p,128); } } [/mw_shl_code]

大致调用就这样了,里面有RAM,不过没用到
另外我的SD卡簇大小格式化成了4096

回复

使用道具 举报

6

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-11-3
在线时间
0 小时
 楼主| 发表于 2014-11-21 13:47:29 | 显示全部楼层
回复【13楼】Badu_Space:
---------------------------------
老师,可以把你的写一个字符数组到SD卡的程序给我看看吗,我用的是stm32f407的芯片,我真的是要崩溃了。邮箱745677020@qq.com,如果可以我想加一下您的QQ。谢谢!
回复

使用道具 举报

6

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-11-3
在线时间
0 小时
 楼主| 发表于 2014-11-21 13:50:31 | 显示全部楼层
回复【15楼】黑白边缘:
---------------------------------
兄弟,感谢!我也想问您要下,你的写一个字符数组到SD卡的程序,邮箱745677020@qq.com。你说的办法我都试了,但是还是没有起色,不知道是什么原因,我用的文件版本是R0.07e的,不知道这个会不会有影响
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-11-21 17:32:32 | 显示全部楼层
回复【17楼】Mars_man:
---------------------------------
我的是0.09b版本的,你还是换个新版本的吧
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

6

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-11-3
在线时间
0 小时
 楼主| 发表于 2014-11-21 21:52:29 | 显示全部楼层
回复【18楼】Badu_Space:
---------------------------------
请问在挂载文件系统之前,也就是f_mount()之前,要不要进行内存分配也就是调用memlloc函数?我看了原子哥的程序,他里面的程序就有,请问这个必须的吗
回复

使用道具 举报

6

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-11-3
在线时间
0 小时
 楼主| 发表于 2014-11-21 22:06:20 | 显示全部楼层
回复【15楼】黑白边缘:
---------------------------------
感谢兄弟的无私,把程序给了小弟。程序编译的时候有个错误:..\Inc\main.h(33): error:  #5: cannot open source input file "stm32f4xx_hal.h": No such file or directory
好像是没有"stm32f4xx_hal.h",请问怎么破,跪谢!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 04:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表