OpenEdv-开源电子网

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

菜菜的菜鸟提问,各位大侠帮忙,关于FATFS的f_read()

[复制链接]

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2013-11-21
在线时间
21 小时
发表于 2014-1-18 16:16:12 | 显示全部楼层 |阅读模式
按照原子的方法,将SD卡中的字库写入FLASH的过程中,如果每次从SD卡中读4096个字节的话,不知为什么读出的全是0,只有每次读不超过512个字节是读出的是正确的。
请问各位,这是为什么?

while(res==FR_OK)
{
res=f_read(fftemp,WRBuff,4096,&ByteOfRead); //读指定文件的4096个字节的数据
                        while(ByteOfRead--)                                      //加入这段代码测试读出的内容,如果超过512,读出的全是0
                               {
                                 printf("%2X ",*WRBfuff)
                                 WRBuff++;
                                }
if(res!=FR_OK) break; //如果读文件错误,退出
SPI_FLASH_BufferWrite(WRBuff,FLASHOffset+FLASHAddr,4096);   //将读出的4096个字节写入FLASH
FLASHOffset+=ByteOfRead; //FLASH偏移量+读出的字节数
FONT_Update_Prog(x,y,size,fftemp->fsize,FLASHOffset); //显示更新速度
if(ByteOfRead!=4096) break; //读完,退出
}

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-1-18 19:08:05 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2013-11-21
在线时间
21 小时
 楼主| 发表于 2014-1-18 19:18:57 | 显示全部楼层
回复【2楼】正点原子:

你的WRBuff,够大吧?

---------------------------------
u8 * WRBuff;
WRBuff=mymllaoc(SRAMIN,4096);
回复 支持 反对

使用道具 举报

5

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2013-6-8
在线时间
2 小时
发表于 2014-1-18 19:54:43 | 显示全部楼层
回复【3楼】doltcat:
---------------------------------
你确定WRBuff++后你还能找回原来的 4096的内存块首地址么?
即使爬到最高的山上,一次也只能脚踏实地地迈一步。
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2013-11-21
在线时间
21 小时
 楼主| 发表于 2014-1-18 20:10:12 | 显示全部楼层
回复【4楼】倒拔萝卜:

回复【3楼】doltcat:
---------------------------------
你确定WRBuff++后你还能找回原来的 4096的内存块首地址么?

---------------------------------
我现在要解决的是每次从SD卡读4096个字节时,读出的全是0的问题,WRBuff++只是为了查看读出的字节是否正确(临时加上的一段代码,如果读出正确的话还是要去掉的)

WRBuff 是一个u8 的指针,而且用mymalloc分配了内存地址,这个地址应该是固定的,并且,如果每次从SD卡读512个字节的话,用printf显示出来的数据是正确的,但每次读4096个字节,显示的就且是0了
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2013-11-21
在线时间
21 小时
 楼主| 发表于 2014-1-18 20:47:02 | 显示全部楼层
问题找到,在SD卡的读盘函数(SD_ReadDisk)中的数据缓冲区设置不对,原来是  u8 SDIO_DATA_BUFFER[512];  改为u8 SDIO_DATA_BUFFER[4096]后,正常了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-1-18 22:37:26 | 显示全部楼层
那应该是你其他地方还改动了,我们的例程,是512的,没有任何问题啊,读取4096还是更大的数据块,都是可以的。
//读SD卡
//buf:读数据缓存区
//sector:扇区地址
//cnt:扇区个数
//返回值:错误状态;0,正常;其他,错误代码;    
u8 SD_ReadDisk(u8*buf,u32 sector,u8 cnt)
{
u8 sta=SD_OK;
u8 n;
if(CardType!=SDIO_STD_CAPACITY_SD_CARD_V1_1)sector<<=9;
if((u32)buf%4!=0)
{
for(n=0;n<cnt;n++)
{
sta=SD_ReadBlock(SDIO_DATA_BUFFER,sector+512*n,512);//单个sector的读操作
memcpy(buf,SDIO_DATA_BUFFER,512);
buf+=512;
}else
{
if(cnt==1)sta=SD_ReadBlock(buf,sector,512);     //单个sector的读操作
else sta=SD_ReadMultiBlocks(buf,sector,512,cnt);//多个sector  
}
return sta;
}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2013-11-21
在线时间
21 小时
 楼主| 发表于 2014-1-19 15:09:55 | 显示全部楼层
终于找到问题了,当初为了测试SD_ReadDisk()函数

if(cnt==1) sta=SD_ReadBlock(buf,sector,512);
   else sta=SD_ReadMultiBlocks(buf,sector,512,cnt);   //把这句给注释掉了忘记改回来了,所以,每次读超过一个扇区时,返回的全是0


在这次调试过程中,发现把SDIO_DATA_BUFFER[512] 改大一点,读SD卡很快,更新字库几乎不用等



回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 00:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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