static BYTE CardType;
DSTATUS disk_initialize (void)
{
DSTATUS stat=STA_NOINIT;
UINT tmr=10000;
volatile int RestTic=0x092a;
BYTE RxByte[5],i;
//--------------------------------------------------------------
while (RestTic--); // ждать 1мс
for (i=0; i<10; i++){ // передать >74 импульсов
Tx_byte (0x01, 0xff);
}
//------------------передать cmd0-------------------------------
RxByte[0]=SD_CmdTx(0, 0x00000000, 0x95);
if (RxByte[0] != 0x01) return STA_NOINIT;
//------------------передать cmd8--------------------------------
if (SD_CmdTx(8, 0x000001AA, 0x87)==0x01){
RxByte[0]=SD_Rx_byte();
RxByte[1]=SD_Rx_byte();
RxByte[2]=SD_Rx_byte();
RxByte[3]=SD_Rx_byte();
if ((RxByte[3]!=0xaa) '' (RxByte[2]!=0x1)) return STA_NOINIT;
//--------------------передать acmd41----------------------------------
while (tmr--){
RxByte[0]=SD_CmdTx (55, 0x00000000, 0xff);
RxByte[1]=SD_CmdTx(41, 0x40000000, 0xff);
if (RxByte[1]==0x00) break;
RestTic=0x092a; // задержка
while (RestTic--);
}
//--------------передать cmd58-----------------------------------------
CardType=CT_SD2;
if (SD_CmdTx (58, 0x00000000, 0xff)!= 0x0) return STA_NOINIT;
RxByte[0]=SD_Rx_byte();
RxByte[1]=SD_Rx_byte();
RxByte[2]=SD_Rx_byte();
RxByte[3]=SD_Rx_byte();
if (RxByte[0] ' 0x40) CardType=CT_SD2 | CT_BLOCK;
else CardType=CT_SD2;
}
//---------------------передать acmd41-----------------------------------
else
{
while (tmr--){
SD_CmdTx (55, 0x00000000, 0x95);
RxByte[0]=SD_CmdTx (41, 0x00000000, 0x95);
if (RxByte[0]==0x00) break;
RestTic=0x092a;
while (RestTic--);
}
CardType=CT_SD1;
SD_CmdTx (16, 512, 0x95); //--------передать cmd16
}
//-----------------------------------------------------------------------
return 0;
}
Цитата(adnega @ Jul 10 2015, 14:37)

Что ж пришло время засветить свой код)