давай я пояснение напишу к своему коду

spi_init:
setb _cs - выборка отключена
setb mosi - подтяжка к высокому
setb miso - аналогично
setb sck - аналогично
mov spcr, #01010001b - выставляем фазы по мануалу
далее ОБЯЗАТЕЛЬНО отсылка в SD/MMC десять штук 0xFFх - spi_sync_byte
это делается (дай Бог памяти) для гарантированного ресета контроллера внутри флэшки
call spi_sync_byte
call spi_sync_byte
call spi_sync_byte
call spi_sync_byte
call spi_sync_byte
call spi_sync_byte
call spi_sync_byte
call spi_sync_byte
call spi_sync_byte
call spi_sync_byte
; - обнуляем переменные параметров
clr a
mov param1, a
mov param2, a
mov param3, a
mov param4, a
call spi_send_command - отсылается CMD0 с нулевыми параметрами (сам байт команды <>0, см. процедурку spi_send_command)
call spi_read_response - ждем отклика
cjne a, #001h, _no_response - если не пришло сразу 0x01, значит карточки нет
_wait_for_init:
mov a, #CMD1 - отсылаем CMD1
call spi_send_command
call spi_read_response - ждем отклика, т.е. пока CMD1 не даст в результате выполнения 0x00
jnz _wait_for_init
setb cy - показываем, что инициализировались нормально
ret - возвращаемся в родительский код
_no_response:
mov last_error, #err_sd_init
clr cy - ошибка инициализации
ret
Так вот. Пока я не проставил 10 синков при невыбранной флешки, у меня инициализация шла как "то едем, то 3 раза не едем"

Похоже что у тебя также