在CMD0 CMD8 CMD55 CMD41这几个命令之前都正常 可是一到获取SD卡大小的时候,发送CMD9,能正常响应0,可是到下一步等待数据令牌的时候总是返回0xFF。
程序如下,求解!!!
/*******************************************************************************
* Function Name : SD_GetCapacity
* Description : 获取SD卡的容量
* Input : None
* Output : None
* Return : u32 capacity
* 0: 取容量出错
*******************************************************************************/
u32 SD_GetCapacity()
{
u8 csd[16];
u32 Capacity;
u8 r1;
r1=SD_Get_CSD(csd);
if(r1==0) return 0; //获取失败
//如果为SDHC卡,按照下面方式计算
if((csd[0]&0xC0)==0x40)
{
csize = csd[9] + ((u16)csd[8] << 8) + 1;
Capacity = (u32)csize << 10;//得到扇区数
}
return Capacity;
}
/*******************************************************************************
* Function Name : SD_GetCSD
* Description : 获取SD卡的CSD信息,包括容量和速度信息
* Input : u8 *cid_data(存放CID的内存,至少16Byte)
* Output : None
* Return : u8
* 1:正确
* 0:错误
*******************************************************************************/
u8 SD_Get_CSD(u8 *CSD_buf)
{
u8 r1;
if(SD_Sent_CMD(CMD9,0,0x01)==0)
{
r1=SD_ReceiveData(CSD_buf,16,RELEASE);
if(r1==0) return 0;
return 1; //接收完成
}
else return 0; //接收出错
}
/*******************************************************************************
* Function Name : SD_ReceiveData
* Description : 从SD卡中读回指定长度的数据,放置在给定位置
* Input : u8 *buf(存放读回数据的内存>len)
* u16 len(数据长度)
* u8 release(传输完成后是否释放总线CS置高 0:不释放 1:释放)
* Output : None
* Return : u8
* 1:NO_ERR
* 0:错误信息
*******************************************************************************/
u8 SD_ReceiveData(u8 *buf,u16 len,u8 release)
{
u8 r1;
u16 retry=0;
SD_CS_LOW();
do //接受数据令牌0xfe
{
r1=SD_SPI_read_write(0xFF);
retry++;
}
while((r1!=0xFE)&&(retry<0XFFFF));
if(retry==0XFFFF)
{
SD_CS_HIG();
return 0;
}
while(len--) //开始接受数据
{
*buf=SD_SPI_read_write(0xff);
buf++;
}
SD_SPI_read_write(0xff); //16位伪CRC
SD_SPI_read_write(0xff);
if(release)
{
SD_CS_HIG();
SD_SPI_read_write(0xff);
}
return 1;
} |