在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; 
}  |