OpenEdv-开源电子网

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

sd卡写一个扇区后 不能再读或者写扇区,求解!

[复制链接]

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2013-8-1
在线时间
18 小时
发表于 2013-10-28 20:50:54 | 显示全部楼层 |阅读模式
代码如下:
/*******************************************************************************
* Function Name : SD_WriteSingleBlock
* Description   : 写入SD卡的一个block
* Input         : u32 sector 扇区地址(sector值,非物理地址) 
*                  u8 *buffer 数据存储地址(大小至少512byte) 
* Output         : None
* Return         :  1: 成功
*                   0:失败
*******************************************************************************/
u8 SD_WriteSingleBlock(u32 sector,u8 *buff)
{
u8 r1;
u16 i;
SD_SPI2_SetSpeed(HIG);
//如果不是SDHC,给定的是sector地址,将其转换成byte地址
    if(SD_Type != SD_TYPE_V2HC)
    {
        sector = sector<<9;
    }  
r1=SD_Sent_CMD(CMD24,sector,0); //发送写单块命令
printf("CMD24 响应:%x\r\n",r1);
if(r1!=0)  return 0;
SD_CS_LOW();
SD_SPI_read_write(0xff);   //发3个字节让SD卡准备就绪
SD_SPI_read_write(0xff);
SD_SPI_read_write(0xff);
SD_SPI_read_write(0xfe);   //发送数据起始令牌
for(i=0;i<512;i++)   //发送一个块得数据
{
SD_SPI_read_write(*buff);
buff++;
}
SD_SPI_read_write(0xff); //发送两个伪CRC
SD_SPI_read_write(0xff);

r1=SD_SPI_read_write(0xff); //sd卡接受数据后返回校验值
if((r1&0x1f)!=0x05)  
{
SD_CS_HIG();
return 0;
}
SD_CS_HIG();
SD_SPI_read_write(0xff);   //额外的8个clock
return 1;
}

 串口打印如下:     


读函数没问题,可是一旦引用写函数之后,就不能读或者写了。用winhex看第一次引用写函数可以把数据写进去。

查看2.0协议知道R1格式响应0X40表示参数错误  


我知道问题应该是出现在写函数,可是我还是不知道为什么错了!!应该怎么改?

希望原子和各位网友帮帮忙!谢谢!!!



学习,只为变得更优秀!!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2013-8-1
在线时间
18 小时
 楼主| 发表于 2013-10-28 21:03:05 | 显示全部楼层
好吧!问题解决!以后真的要自己认真思考!原来是写扇区的时候没有给足够的时间就直接跳到下一个读写,导致命令响应出错!
学习,只为变得更优秀!!!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-10 03:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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