OpenEdv-开源电子网

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

麻烦问下原子,板子里带的FATFS例程的问题。

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2011-7-24
在线时间
0 小时
发表于 2011-7-24 20:42:42 | 显示全部楼层 |阅读模式
这几天我学习了原子板子里的FATFS例程。

自己试了下,用固体库移植成功了。

但是我还是存在了两个问题,和网上下的别人移植好的程序不一样,请教下原子。


一个是,f_write每次最多只能写入512个字节,多了就会返回FR_DISK_ERR错误。我下载的别人的代码,写入4096都可以啊。。。这个是怎么回事呢?

还一个很怪。。类似这样的语句。。

res=f_open(&file, "1141.TXT", FA_OPEN_ALWAYS|FA_WRITE ); 

     res = f_lseek(&file,file.fsize); 
     

f_printf(&file,"123445"); 

如果卡内没有1141.txt这个文件,那一切正常,建立好这个文件并且写入, 

但是只要是已经存在这个文件了,那程序就会卡在 res = f_lseek(&file,file.fsize);这句。jtlink调试也没看出来停在哪了。

麻烦原子能帮我看看。

用的都是您板子里的例程语句。SD卡的驱动什么都的,我只改成了固体库。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-7-24 21:25:15 | 显示全部楼层
f_write是可以写入很大一个数的,没有512限制的.
不能建立1141这个文件,应该也不存在这种现象吧.你试试建立别的文件,然后lseek试试.会不会有问题?

出现问题的原因,最主要的两个方面:1,SD卡底层驱动有问题.这里要特别注意,我就遇到过非常奇特的现象的.最底层的sd读写有问题.2,移植的问题.这个问题比较好解决,重点看看和fatfs挂钩的几个函数有没有错误即可.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2011-7-24
在线时间
0 小时
 楼主| 发表于 2011-7-24 21:29:01 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
不是不能建立1141的,原子,是如果建立之前已经有这个文件无法写入。。

SD卡底层驱动我是直接用的板子里的程序,应该没问题吧。

移植的问题,这到有可能,可是和FATFS挂钩,不就是只有disio文件里的单块写入和多块写入的一个SPI接口程序吗?
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2011-7-24
在线时间
0 小时
 楼主| 发表于 2011-7-24 21:46:38 | 显示全部楼层
我找到问题了,是底层驱动的问题。嘿,原子。。。。

//--------下面是N个sector写入的循环部分
do
{
//放起始令牌0xFC 表明是多块写入
SPIx_ReadWriteByte(0xFC);   
//放一个sector的数据
for(i=0;i<512;i++)
{
SPIx_ReadWriteByte(*data++);
}
//发2个Byte的dummy CRC
SPIx_ReadWriteByte(0xff);
SPIx_ReadWriteByte(0xff);

//等待SD卡应答
r1 = SPIx_ReadWriteByte(0xff);
if((r1&0x1F)!=0x05)
{
Set_SD_CS;    //如果应答为报错,则带错误代码直接退出
return r1;
}    
//等待SD卡写入完成
if(SD_WaitDataReady()==1)
{
Set_SD_CS;    //等待SD卡写入完成超时,直接退出报错,-------------------------------------就在这报错的。
return 1;
}    
}while(--count);//本sector数据传输完成  
//发结束传输令牌0xFD
r1 = SPIx_ReadWriteByte(0xFD);
if(r1==0x00)
{
count =  0xfe;
}

可是,这下我不会改了,这个不太明白,直接移植的你的代码。。   
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-7-24 21:53:09 | 显示全部楼层
FA_OPEN_ALWAYS|FA_WRITE,可能不对.
就是挂钩函数有问题,会导致死机的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2011-7-24
在线时间
0 小时
 楼主| 发表于 2011-7-24 22:17:51 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
//等待SD卡写入完成
//返回值:0,成功;   
//    其他,错误代码;
u8 SD_WaitDataReady(void)
{
u8 r1=MSD_DATA_OTHER_ERROR;
u32 retry;
retry=0;
do
{
r1=SPIx_ReadWriteByte(0xFF)&0X1F;//读到回应
printf("r1%d\r\n",r1);
printf("retry%d\r\n",retry);
if(retry==0xfffe)return 1; 
retry++;
switch (r1)
{    
case MSD_DATA_OK://数据接收正确了  
r1=MSD_DATA_OK;
break;  
case MSD_DATA_CRC_ERROR:  //CRC校验错误
return MSD_DATA_CRC_ERROR;  
case MSD_DATA_WRITE_ERROR://数据写入错误
return MSD_DATA_WRITE_ERROR;  
default://未知错误    
r1=MSD_DATA_OTHER_ERROR;
break;  
}   
}while(r1==MSD_DATA_OTHER_ERROR); //数据错误时一直等待


 我的问题就在这,这个r1也就是收到的响应,我看值一直都是0X1F啊。。。不知道怎么弄的,好像没有这个指令啊。
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-10-13
在线时间
0 小时
发表于 2015-10-13 19:49:13 | 显示全部楼层
SD_Info MicroSD_GetDataResponse(void)
{
uint32_t counter = 0;
SD_Info response, rvalue;

while (counter <= 64)
{
/* Read response */
response = (SD_Info)MicroSD_IO_ReadByte();
/* Mask unused bits */
response &= 0x1F;
switch (response)
{
case SD_DATA_OK:
{
rvalue = SD_DATA_OK;
break;
}
case SD_DATA_CRC_ERROR:
return SD_DATA_CRC_ERROR;
case SD_DATA_WRITE_ERROR:
return SD_DATA_WRITE_ERROR;
default:
{
rvalue = SD_DATA_OTHER_ERROR;
break;
}
}
/* Exit loop in case of data ok */
if (rvalue == SD_DATA_OK)

            break; 
        }
/* Increment loop counter */
counter++;
}
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-10-13
在线时间
0 小时
发表于 2015-10-13 19:52:14 | 显示全部楼层
SD_Info MicroSD_GetDataResponse(void)
{
uint32_t counter = 0;
SD_Info response, rvalue;

while (counter <= 64)
{
/* Read response */
response = (SD_Info)MicroSD_IO_ReadByte();
/* Mask unused bits */
response &= 0x1F;
switch (response)
{
case SD_DATA_OK:
{
rvalue = SD_DATA_OK;   //SD_DATA_OK ==0x05 为何一直是0
break;
}
case SD_DATA_CRC_ERROR:
return SD_DATA_CRC_ERROR;
case SD_DATA_WRITE_ERROR:
return SD_DATA_WRITE_ERROR;
default:
{
rvalue = SD_DATA_OTHER_ERROR;
break;
}
}
/* Exit loop in case of data ok */
if (rvalue == SD_DATA_OK)

            break; 
        }
/* Increment loop counter */
counter++;
}


在写得不到令牌0XFE而是0,这个怎么处理???????????
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 23:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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