在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
EETOP诚邀模拟IC相关培训讲师 创芯人才网--重磅上线啦!
查看: 2979|回复: 1

[求助] 求助,关于TF卡

[复制链接]
发表于 2012-4-6 20:28:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
求一份详细的关于TF卡的SPI模式操作的资料。或者谁能帮忙解决这个问题?

我的是STM32F107VCT6,没有SDIO的,所以想用SPI驱动TF卡,从网上下载了源码,移植成了自己的,但在移植FATFS的时候遇到了问题,不能创建文件(也不是完全不能),后来发现是多块写入函数出了问题(单块读,写,多块读都没有问题)。但到现在都还没解决。。。
现象是在连续调用多块写函数时(短时间连续调用,如果在两次写块之间加入延时,则会成功,但貌似正常情况下是不用延时的),第一次可以正常写入,但后面的数据不能写入,调试发现是写数据后没有收到TF卡的回应。请高手帮忙。
以下是源码:
//写入SD卡的N个block                                                                            
//输入:u32 sector 扇区地址(sector值,非物理地址)
//     u8 *buffer 数据存储地址(大小至少512byte)
//     u8 count 写入的block数目                  
//返回值:0: 成功
//       other:失败                                                                                                                          
u8 SD_WriteMultiBlock(u32 sector, const u8 *data, u8 count)
{
u8 r1;
u16 i;
u16 retry;                          
sector<<=9;
r1 |= SD_CMD(CMD55,0x00,0x95,0);
r1 |= SD_CMD(ACMD23,count,0x00,0);
r1 = SD_CMD(CMD25, sector, 0x00,0);//发多块写入指令
if(r1 != 0x00)
        return 1;  //应答不正确,直接返回         
GPIO_ResetBits(GPIOA,GPIO_Pin_4);//片选,开始准备数据传输   
SPI_RW(0xff);//先放3个空数据,等待SD卡准备好
SPI_RW(0xff);
SPI_RW(0xff);  
//--------下面是N个sector写入的循环部分
do
        {
    //放起始令牌0xFC 表明是多块写入
    SPI_RW(0xFC);          
    //放一个sector的数据
    for(i=0;i<512;i++)
            {
        SPI_RW(*data++);
            }
    //发2个Byte的dummy CRC
    SPI_RW(0xff);
    SPI_RW(0xff);
   
    //等待SD卡应答
    r1 = SPI_RW(0xff);
    if((r1&0x1F)!=0x05)
            {
        GPIO_SetBits(GPIOA,GPIO_Pin_4);//如果应答为报错,则带错误代码直接退出
        return r1;
            }
retry=0;                  
    //等待SD卡写入完成
        if(SD_WaitDataReady()==1)
                {
            GPIO_SetBits(GPIOA,GPIO_Pin_4);    //等待SD卡写入完成超时,直接退出报错
            return 1;
                }          
        }while(--count);//本sector数据传输完成  
//发结束传输令牌0xFD
r1 = SPI_RW(0xFD);
if(r1==0x00)
        {
    count =  0xfe;
        }
if(SD_WaitDataReady()) //等待准备好
        {
        GPIO_SetBits(GPIOA,GPIO_Pin_4);
        return 1;  
        }
//写入完成,片选置1
GPIO_SetBits(GPIOA,GPIO_Pin_4);
SPI_RW(0xff);
/×下面是延时,貌似正常情况下不用,或者不用这么长时间×/
retry=2000;//1250
while(retry--)
   SPI_RW(0xFF);//SPI读写函数  
return count;   //返回count值,如果写完则count=0,否则count=1
}
 楼主| 发表于 2012-4-6 22:14:55 | 显示全部楼层
问题已解决,原来在卡写入数据之后的忙状态应该判断是不是不为0xFF,而不是判断为0
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-6-2 22:32 , Processed in 0.021037 second(s), 11 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表