Да код простой:
Код:
driveStatus = disk_initialize(0);
Функция сама тоже от Чена:
Код:
/*-----------------------------------------------------------------------*/
/* Initialize Disk Drive */
/*-----------------------------------------------------------------------*/
DSTATUS disk_initialize (
BYTE drv /* Physical drive nmuber (0) */
)
{
BYTE n, cmd, ty, ocr[4];
if (drv) return STA_NOINIT; /* Supports only single drive */
if (Stat & STA_NODISK) return Stat; /* No card in the socket */
power_on(); /* Force socket power on */
FCLK_SLOW();
for (n = 10; n; n--) rcvr_spi(); /* 80 dummy clocks */
//for(int i=0;i<10;i++)
// SPI_transmit(0xff); //80 clock pulses spent before sending the first command
ty = 0;
int retry=0;
int reset_complete = 1;
BYTE response = 0x00;
do
{
response = send_cmd(CMD0, 0); //send 'reset & go idle' command
retry++;
if(retry>0x20)
{
reset_complete = 0; //time out, card not detected
break;
}
} while(response != 0x01);
if (reset_complete == 1/*send_cmd(CMD0, 0) == 1*/) /* Enter Idle state */
{
//sendStr0("Enter Idle state complite");
//Timer1 = 100; /* Initialization timeout of 1000 msec */
//_delay_ms(100);
if (send_cmd(CMD8, 0x1AA) == 1) { /* SDv2? */
for (n = 0; n < 4; n++) ocr[n] = rcvr_spi(); /* Get trailing return value of R7 resp */
if (ocr[2] == 0x01 && ocr[3] == 0xAA)
{ /* The card can work at vdd range of 2.7-3.6V */
//while (Timer1 && send_cmd(ACMD41, 1UL << 30)); /* Wait for leaving idle state (ACMD41 with HCS bit) */
int counter1 = 0;
char buff[100];
for (int i = 0; i < 10 && send_cmd(ACMD41, 1UL << 30); i++)
{
_delay_ms(10);
counter1+=10;
}
if (/*Timer1 && */send_cmd(CMD58, 0) == 0)
{ /* Check CCS bit in the OCR */
for (n = 0; n < 4; n++) ocr[n] = rcvr_spi();
ty = (ocr[0] & 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2; /* SDv2 */
}
}
} else { /* SDv1 or MMCv3 */
if (send_cmd(ACMD41, 0) <= 1) {
ty = CT_SD1; cmd = ACMD41; /* SDv1 */
} else {
ty = CT_MMC; cmd = CMD1; /* MMCv3 */
}
//while (Timer1 && send_cmd(cmd, 0)); /* Wait for leaving idle state */
for (int i = 0; i < 10 && send_cmd(cmd, 0); i++)
_delay_ms(10);
_delay_ms(10);
if (/*!Timer1 || */send_cmd(CMD16, 512) != 0) /* Set R/W block length to 512 */
ty = 0;
}
}
else
{
}
CardType = ty;
deselect();
if (ty) { /* Initialization succeded */
Stat &= ~STA_NOINIT; /* Clear STA_NOINIT */
FCLK_FAST();
} else { /* Initialization failed */
power_off();
}
return Stat;
}
Если результат не равен 0, то вывести на дисплей ошибку инициализации. Программа эту ошибку и выдает при первом включении. Пробовал вызывать эту функцию в цикле три раза подряд - результат тот же. Я еще не пробовал байпасом поиграть и подтягивающими резисторами.
Сообщение от
breeze
Аналогично
Одна из первых и любимых игр на Агат была — Bolo
Супер игрушка! Только ради нее стоит этот комп построить!
Всем спасибо за поддержку!