Цитата(Linker @ Apr 10 2008, 19:25)

Не понял, о каком "запросе команды"идет речь и что это за байт 0xFF?
Посмотрел Ваши исходники. Что-то много всего. Я полагал, что нужно было расписать инициализацию SPI и команду CMD0. Это не более 10-15 откоментаренных строк. А у Вас просто УЖОС какой-то. На ночь глядя без бутылки не разберешься

. Интересно, что за проц такой?
Попробую все объяснить

" запрос команды" - это я так назвал посылку команды в карту (выставление на шину SPI 6 байт команды).
байт 0xFF - это байт Ncr
По документации для SPI режима есть таблица таймингов и графики (в 8 циклах). Полная версия документа SDA Physical Layer v 1.0 (полную версию на 2.0 я не нашел).
Ncs от 0 до прочерка (наверное бесконечность) время перед выставлением команды на шину
Ncr от 1 до 8 циклов. Время после последнего байта команды и до начала выставления картой ответа.
Nec от 0 до максимума (прочерк) время после ответа картой (нужно удерживать CS в 0)
Теперь об исходниках.
Я обнаружил что во многих исходниках первый Ncs байт все же выставляется (во многих даже два). Я этого не делал и SD карта молчала на все мои запросы. Но MMC отвечала. Добавив (я об этом писал ранее) этот байт перед отправкой команды, SD стала откликаться (что и делает сейчас). Причем нет нужды, как в примерах, CS при этом поднимать.
Я попытлся проделать как в примерах и посылать перед выставлением команды на шину два (минимум) байта 0xFF. Это привело к тому, что Ncr пришлось так же увеличить на один. Иначе ответ не вычитывался.
Так как SPI я не собираюсь использовать только для карты, и нет желания стоять в цикле и ждать когда SPI все отбарабанит. Я реализовал все через прерывание и буфер заданий. Соответственно городить циклы по проверке не 0xFF в ответе попросту неудобно. Да и как оказалось ненужно. Карта ответ выставляет всегда после Ncr=1.
MMC карта с этими же настройками нормально отвечает и даже можно прочитать пакет CID. Но вот беда. Я вижу что все данные (и ответы и данные) сдвинуты на один бит влево. Настройка SPI ситуацию не исправила, а даже ухудшила (сдвиг получился на два бита). Ну да с MMC я особо работать и не хочу.
По поводу исходников.
Они не так и сложны как кажутся

Коментариев там вагон. Правда порой просто скопированные со строкой.
SD_Card.cvoid SD_card_main(void) это основная процедура для вызова в main цикле приложения. Там находятся обработчики всех команд карты. В принципе больше там ничего нет (обработчики команд, обработчики принимаемых данных). Все общение с картойи и других процедур происходит по средством буфера SD_block. SD_block в последствии должен перекочевать из явного массива в работу через указатель. Сама процедура использует три массива SD_status (тут лежат подготовленная команда для отправки, и параметры карты), SD тут лежит текущая отправляемая/нная команда (структура) и response тут лежит ответ (тоже структура) на отправленную команду. По идее SD и response в последствии должны быть одним буфером на который будут накладываться эти структуры. Но это потом.
void SD_detect(void) это процедура для таймера. через определенное время, если карта свободна (никто с ней не работает, ниодна процедура) инициирует процесс опроса карты на предмет присутствия ее. Все действия по инициализации будут выполнены в SD_card_main
SPI.cbit Spi_WR(byte * dat, byte * complete, word LEN, byte type) производит попытку скопировать данные для отправки в SPI шину в свой буфер и производит запись в журнале заданий SPI о необходимости передачи данных. Если шина свободна, то инициирует передачу.
bit Spi_RD(byte * ptr, byte * complete, word LEN, byte type) делает запись в журнале заданий SPI о необходимости прочитать данные из устройства. Если шина свободна инициирует чтение.
void SPI_inter(void) собственно обработчик прерывания SPI. Производит передачу или прием данных в устройство на SPI шине согласно журналу заданий. Если задания закончились освобождает шину.
SPI_mas - собственно журнал заданий и массив для функции записи данных в SPI.
Все это написано под F120 (это 51 ядро 100 Мгц). На нем реализован алгоритм вычисления некой функции и по этому нет возможности тупо стоять в SPI пока все уйдет или прийдет. Для этого и реализована возможность работы задач SPI отдельно от основных вычислений. В этой системе реализована работа с графичиским LCD экраном, работа с матрицей 8 на 8 кнопок, передача данных по UART, работа с IIC устройствами. На борту 128 килобайт ОЗУ. Для этого включена работа с far памятью. Проц со всем этим нормально справляется. Не стоит говорить про АРМ и что либо другое (сам знаю). Но эту систему я реализовал в полном объеме (кроме карты SD, это не доделал) за 2 месяца.
В будующем пересяду на АРМ, но АРМ9. Ибо АРМ7 мало.
Вроде в кратце описал исходник и свои термины.
Вот в голову пришло. У меня подтяжки висят на свободных ногах SD карты к питанию. Может оставить ноги в воздухе???? Вроде подтяжки мешать не должны.
Сейчас решил перечитать спецификациют от корки до корки.