OpenEdv-开源电子网

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

录音机实验中,写文件的问题

[复制链接]

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2015-2-3
在线时间
0 小时
发表于 2015-2-4 16:58:21 | 显示全部楼层 |阅读模式
5金钱
在正点原子的录音机实验中,往SD卡写录音文件时,出现如下问题:
res=f_write(f_rec,recbuf,512,&bw);//写入文件
返回值res为2,经检测,是在f_write()函数中的红色部分返回了。
FRESULT f_write (
FIL *fp, /* Pointer to the file object */
const void *buff, /* Pointer to the data to be written */
UINT btw, /* Number of bytes to write */
UINT *bw /* Pointer to number of bytes written */
)
{
FRESULT res;
DWORD clst, sect;
UINT wcnt, cc;
const BYTE *wbuff = buff;


*bw = 0; /* Initialize bytes written */

res = validate(fp->fs, fp->id); /* Check validity of the object */
if (res != FR_OK) LEAVE_FF(fp->fs, res);
if (fp->flag & FA__ERROR) /* Check abort flag */
{  printf("\n222222222:%0x\n",fp->flag);
LEAVE_FF(fp->fs, FR_INT_ERR);  
}
if (!(fp->flag & FA_WRITE)) /* Check access mode */
{printf("\n\1333331n");
LEAVE_FF(fp->fs, FR_DENIED);  
}
if (fp->fsize + btw < fp->fsize) btw = 0; /* File size cannot reach 4GB */

for ( ;  btw; /* Repeat until all data transferred */
wbuff += wcnt, fp->fptr += wcnt, *bw += wcnt, btw -= wcnt) {
if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */
if (fp->csect >= fp->fs->csize) { /* On the cluster boundary? */
if (fp->fptr == 0) { /* On the top of the file? */
clst = fp->org_clust; /* Follow from the origin */
if (clst == 0) /* When there is no cluster chain, */
fp->org_clust = clst = create_chain(fp->fs, 0); /* Create a new cluster chain */
} else { /* Middle or end of the file */
clst = create_chain(fp->fs, fp->curr_clust); /* Follow or streach cluster chain */
}
if (clst == 0) break; /* Could not allocate a new cluster (disk full) */
if (clst == 1) {printf("\n\444444n");ABORT(fp->fs, FR_INT_ERR); }
if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR);
fp->curr_clust = clst; /* Update current cluster */
fp->csect = 0; /* Reset sector address in the cluster */
}
#if _FS_TINY
if (fp->fs->winsect == fp->dsect && move_window(fp->fs, 0)) /* Write back data buffer prior to following direct transfer */
ABORT(fp->fs, FR_DISK_ERR);
#else
if (fp->flag & FA__DIRTY) { /* Write back data buffer prior to following direct transfer */
if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK)
ABORT(fp->fs, FR_DISK_ERR);
fp->flag &= ~FA__DIRTY;
}
#endif
sect = clust2sect(fp->fs, fp->curr_clust); /* Get current sector */
if (!sect) {printf("\n\55555555n");ABORT(fp->fs, FR_INT_ERR); }
sect += fp->csect;
cc = btw / SS(fp->fs); /* When remaining bytes >= sector size, */
if (cc) { /* Write maximum contiguous sectors directly */
if (fp->csect + cc > fp->fs->csize) /* Clip at cluster boundary */
cc = fp->fs->csize - fp->csect;
if (disk_write(fp->fs->drive, wbuff, sect, (BYTE)cc) != RES_OK)
ABORT(fp->fs, FR_DISK_ERR);
#if _FS_TINY
if (fp->fs->winsect - sect < cc) { /* Refill sector cache if it gets dirty by the direct write */
mem_cpy(fp->fs->win, wbuff + ((fp->fs->winsect - sect) * SS(fp->fs)), SS(fp->fs));
fp->fs->wflag = 0;
}
#else
if (fp->dsect - sect < cc) { /* Refill sector cache if it gets dirty by the direct write */
mem_cpy(fp->buf, wbuff + ((fp->dsect - sect) * SS(fp->fs)), SS(fp->fs));
fp->flag &= ~FA__DIRTY;
}
#endif
fp->csect += (BYTE)cc; /* Next sector address in the cluster */
wcnt = SS(fp->fs) * cc; /* Number of bytes transferred */
continue;
}
#if _FS_TINY
if (fp->fptr >= fp->fsize) { /* Avoid silly buffer filling at growing edge */
if (move_window(fp->fs, 0)) ABORT(fp->fs, FR_DISK_ERR);
fp->fs->winsect = sect;
}
#else
if (fp->dsect != sect) { /* Fill sector buffer with file data */
if (fp->fptr < fp->fsize &&
disk_read(fp->fs->drive, fp->buf, sect, 1) != RES_OK)
ABORT(fp->fs, FR_DISK_ERR);
}
#endif
fp->dsect = sect;
fp->csect++; /* Next sector address in the cluster */
}
wcnt = SS(fp->fs) - (fp->fptr % SS(fp->fs)); /* Put partial sector into file I/O buffer */
if (wcnt > btw) wcnt = btw;
#if _FS_TINY
if (move_window(fp->fs, fp->dsect)) /* Move sector window */
ABORT(fp->fs, FR_DISK_ERR);
mem_cpy(&fp->fs->win[fp->fptr % SS(fp->fs)], wbuff, wcnt); /* Fit partial sector */
fp->fs->wflag = 1;
#else
mem_cpy(&fp->buf[fp->fptr % SS(fp->fs)], wbuff, wcnt); /* Fit partial sector */
fp->flag |= FA__DIRTY;
#endif
}

if (fp->fptr > fp->fsize) fp->fsize = fp->fptr; /* Update file size if needed */
fp->flag |= FA__WRITTEN; /* Set file changed flag */

LEAVE_FF(fp->fs, FR_OK);
}

不懂?到底是哪里出现问题,检测SD卡中的文件都是0KB,显然是没有写进去。求解!!

最佳答案

查看完整内容[请看2#楼]

回复【8楼】名侦探: --------------------------------- w=1的时候代表2个字节。 剩下的你自己想。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-2-4 16:58:22 | 显示全部楼层
回复【8楼】名侦探:
---------------------------------
w=1的时候代表2个字节。
剩下的你自己想。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2015-2-3
在线时间
0 小时
 楼主| 发表于 2015-2-4 18:53:53 | 显示全部楼层
写wav录音头数据没问题,
res=f_write(&f_rec,&wavhead,sizeof(__WaveHeader),&bw);//写入头数据
if(res)  printf("\n 写入录音头数据!!\n");

为什么写录音的数据有问题呢?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-2-4 22:11:02 | 显示全部楼层
我们录音机代码不能录音??
你别改动我们代码试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

17

主题

102

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2014-10-14
在线时间
0 小时
发表于 2015-3-30 23:34:22 | 显示全部楼层
[mw_shl_code=c,true]这是战舰VS1053录音的时候的代码[/mw_shl_code] [mw_shl_code=c,true]if((w>=256)&&(w<896)) {     idx=0;          while(idx<512) //????????512×???     {       w=VS_RD_Reg(SPI_HDAT0);           recbuf[idx++]=w&0XFF;     recbuf[idx++]=w>>8;     }         res=f_write(f_rec,recbuf,512,&bw);//????????     if(res)     {     printf("err:%d\r\n",res);     printf("bw:%d\r\n",bw);     break;//???????í.       } sectorsize++;//??????????1,????32ms   } 请问一下原子哥,这个录音的时候,当W<512时是不是会写入很多0啊,每512个字节就有一些0掺在里面,为什么不会对录音文件有影响呢? [/mw_shl_code]
回复

使用道具 举报

17

主题

102

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2014-10-14
在线时间
0 小时
发表于 2015-3-30 23:34:37 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
请原子哥解答下
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-30 23:54:19 | 显示全部楼层
回复【4楼】名侦探:
---------------------------------
不可能的问题,就别纠结了。
试试就知道了,真要这么差劲,我不会做例程讲解的。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-30 23:56:01 | 显示全部楼层
回复【5楼】名侦探:
---------------------------------
网名的愿望挺好。
思想也得更得上才行哦...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

17

主题

102

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2014-10-14
在线时间
0 小时
发表于 2015-3-31 19:45:48 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
恩,我知道是可以的,思想我一定会跟上的,但是我还是有点纠结,就觉得很奇怪呀。如果我自己写程序,肯定会想方设法避免这些零的。这些零在文件最后也就好说了,关键他每512个字节里面就有可能有多余的0x00,为什么不会产生影响呢?本人愚钝,想不明白呀原子哥。
回复

使用道具 举报

17

主题

102

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2014-10-14
在线时间
0 小时
发表于 2015-4-1 00:26:45 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
经过你这一点拨,我发现我真是傻逼了,哎,看来理解的不够啊,谢谢原子哥了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 11:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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