|
资料全丢了。只剩下代码了。
uint8 __u8_SD_WaitReady( void )
{
uint8 r1 ;
uint16 retry ;
retry=0 ;
do
{
r1 = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
if(500 == retry)//如果卡异常,会死循坏!
{
retry++;
return 1 ;
}
}
while(r1!=0xFF);
return 0 ;
}
uint8 __u8_SD_Write_ ( uint8 command , uint32 data , uint8 CRC , uint8 isContinue )
{
uint8 re = 0;
uint8 wait = 0;
__u8_SD_SPI_TXRX_(SD_SPI_USER , 0 , 0xFF );
__u8_SD_SPI_TXRX_(SD_SPI_USER , 0 , 0xFF );
SD_CS_ENABLE();
// 命令发送
__u8_SD_SPI_TXRX_(SD_SPI_USER , 0 , (0x40 | ( command & 0x3F )) );
__u8_SD_SPI_TXRX_(SD_SPI_USER , 0 , ((data >> 24) & 0xFF) );
__u8_SD_SPI_TXRX_(SD_SPI_USER , 0 , ((data >> 16) & 0xFF) );
__u8_SD_SPI_TXRX_(SD_SPI_USER , 0 , ((data >> 8) & 0xFF) );
__u8_SD_SPI_TXRX_(SD_SPI_USER , 0 , (data & 0xFF) );
__u8_SD_SPI_TXRX_(SD_SPI_USER , 0 , (CRC) );
while( 0xFF == (re=__u8_SD_SPI_TXRX_(SD_SPI_USER , 0 , 0xFF)) )
{
wait++;
if(wait>200)
{
break ;
}
}
// 命令返回
if(0 == isContinue)
{
SD_CS_DISABLE();
__u8_SD_SPI_TXRX_(SD_SPI_USER , 0 , 0xFF);
}
return re;
}
unsigned char __u8_SD_ReceiveData_(unsigned char*data,signed int len,unsigned char isRelease)
{
unsigned char re ;
USER_SD_CS = 0;
// 等待SD卡发回数据起始令牌0xFE
do
{
re = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
}
while(re != 0xFE);
while(len--)
{
*data = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
data++;
}
//下面是2个伪CRC(dummy CRC)
__u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
__u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
//按需释放总线,将CS置高
if(isRelease == 1)
{
//传输结束
USER_SD_CS = 1;
__u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
}
return 0 ;
}
uint8 __u8_SD_Init_()
{
// 发送复位命令 CMD0 ,CS低电平有效 - > SPI
// DMD 55 ACMD 41 判断电压,CID,CMD16,CMD9,CSD
// CMD23 -> Write single block
// CMD55 -> ACMD,CMD55 -> 特殊命令指示符
//uint8 MaxDelay = 0;
uint8 RecData[4]={0,0,0,0};
uint16 loop = 0;
uint8 re = 0;
/*
USER_SD_CS = 0;
for(loop=0;loop<0xf00;loop++);
for(loop=0;loop<10;loop++)
{
__u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
}
*/
USER_SD_CS = 1;
for(loop=0;loop<0xf00;loop++);
for(loop=0;loop<10;loop++)
{
__u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
}
//
//MaxDelay = 0;
do
{
//发送CMD0,让SD卡进入IDLE状态
re = __u8_SD_Write_(CMD0,0,0x95,0);
//MaxDelay = re;
}
while( re!=0x01 );
re = 0;
re = __u8_SD_Write_(CMD8,0x1aa,0x87,1); // 卡类型认读
if( 0x01 == re )
{
RecData[0] = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
RecData[1] = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
RecData[2] = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
RecData[3] = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
// 31 - 28 27 - 12 11 - 8 7 - 0
// command v reserved vol accepted check pattern
// 0x00 0x00 0x01 0xAA
if(RecData[2]==0x01 && RecData[3]==0xAA)
{
// 支持电压范围,可以操作
// 发卡初始化指令CMD55+ACMD41
do
{
re = __u8_SD_Write_(CMD55,0,0,0);
if(re!=0x01)
{
return re ;
}
re = __u8_SD_Write_(ACMD41,0x40000000,0,0);
}
while(re != 0);
// 初始化指令发送完成,接下来获取OCR信息
// READ_OCR
re = __u8_SD_Write_(CMD58,0,0,1);
if(re != 0x00)
{
return re ;
// 如果命令没有返回正确应答,直接退出,返回应答
}
// 读OCR指令发出后,紧接着是4字节的OCR信息
RecData[0] = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
RecData[1] = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
RecData[2] = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
RecData[3] = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
// OCR接收完成,片选置高
USER_SD_CS = 1;
//
__u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
// 检查接收到的OCR中的bit30位(CCS),确定其为SD2.0还是SDHC
// 如果CCS=1:SDHC CCS=0:SD2.0
if(RecData[0]&0x40)
{
re = 4 ; // SDHC;
}
else
{
re = 2 ; // SD2.0
}
}
}
else
if(( 0x05 == re )||( 0x09 == re )) // R8不被支持
{
re = 1; // SD_TYPE
}
return re;
}
unsigned char __u8_SD_GetInfor_(sMicroSD * SD_HOST,unsigned char isShowInfor)
{
// CSD
unsigned char re = 0 ;
do
{
re = __u8_SD_Write_(CMD9,0,0xFF,1);
}
while( 0x00 != re );
// 接收16个字节的数据
__u8_SD_ReceiveData_(SD_HOST->CSD_data,16,1);
// CID
do
{
re = __u8_SD_Write_(CMD10,0,0xFF,1);
}
while( 0x00 != re );
// 接收16个字节的数据
__u8_SD_ReceiveData_(SD_HOST->CID_data,16,1);
if(1 == isShowInfor)
{
// 进行卡片识别
}
return 0 ;
} |
|