代码如下:
/******************************************************************************** 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表示参数错误
我知道问题应该是出现在写函数,可是我还是不知道为什么错了!!应该怎么改?
希望原子和各位网友帮帮忙!谢谢!!!
|