Итак, вооружившись симулятором в дополнение к компилятору, удалось довести код до рабочего состояния.
Первая ошибка (ошибка существенная - рекомендуется изменить в основном репозитарии проекта), по спецификации SPI при инициализации должно быть подано не менее 74 импульсов, в проекте было так
Код:
for(i=0;i<9;i++) spi_send(0xff); // 88 перепадов SCK - для ввода карты в SPI-режим
надо так
Код:
for(i=0; i < 10; i++) spi_send(0xff); // 88 перепадов SCK - для ввода карты в SPI-режим
Следующий момент, при отсутствующей карте или ошибках монтажа дождаться сообщения об ошибке было проблематично - количество попыток отослать CMD1 (0xffff) помноженное на количество попыток получения ответа от карты в ф-ции send_sd_cmd (0xffff) было слишком велико. Уменьшил соответственно до 0xFF и 0x7FFF, также уменьшил количество попыток и в других ф-циях с 0xFFFF до 0x7FFF.
Следующим исправление было изменение скорости SPI, на которой инициализируется карта (мои карты не хотели инициализироваться на высокой скрости).
Было
Код:
SPCR =_BV(SPE)|_BV(MSTR); // разрешаем SPI, режим master, максимальная скорость
SPSR|= _BV(SPI2X); // удваиваем скорость обмена - глюкает с картой, поэтому пока не включаем
стало
Код:
SPCR =_BV(SPE)|_BV(MSTR)|_BV(SPR1);
SPSR|= _BV(SPI2X); // удваиваем скорость обмена - глюкает с картой, поэтому пока не включаем
И после успешной инициализации карты увеличиваю скорость
Код:
SPCR =_BV(SPE)|_BV(MSTR); // Init part II
Посмотрел в проекте vinxru - у него инициализация идет на минимальной скорости.
Исправленный файл во вложении.
Далее. В Stage2 неверно написан ник "Forh32" вместо "Forth32".
Также Stage2 не находит FDC, наверное есть какая-то ошибка.
Еще обнаружил что игрушка SUPTET.COM (с диска vadsoft.kdi) пишет в порты ВВ55, вот как бы ее пропатчить чтобы не писала...