a3r3 0 10 августа, 2007 Опубликовано 10 августа, 2007 (изменено) · Жалоба Если эта команда, не используется для распознавания MMC/SD, однако. Мня. Ступил, однако :) Изменено 10 августа, 2007 пользователем a3r3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rudolph 0 10 августа, 2007 Опубликовано 10 августа, 2007 · Жалоба При помощи CMD1 карточка (microSD 1024 Mb Kingston ) активизировалась в SPI-режиме, т.е. я получил R1 == 0x00. Теперь попытался получить CSD. т.е. CMD9 с аргументом == 0. Последний байт с CRC7 выставляю в 0xFF. Вся команда: 0x49, 0x00,0x00, 0x00, 0x00, 0xFF. В ответ получаю - R1 == 0x00 - признак начала данных - 0xFE - 16 байт Если еще попинговать карту FF-ми, то получаем еще 1 байт. Странно, вроде, по идее, я должен получить 16 байт данных после 0xFE и CRC16, т.е. еще 2 байта. Что-то я не так сделал, но вот что? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a3r3 0 10 августа, 2007 Опубликовано 10 августа, 2007 · Жалоба Если еще попинговать карту FF-ми, то получаем еще 1 байт. Это как? Странно, вроде, по идее, я должен получить 16 байт данных после 0xFE и CRC16, т.е. еще 2 байта. Что-то я не так сделал, но вот что? А CRC включен (CMD59)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 10 августа, 2007 Опубликовано 10 августа, 2007 · Жалоба Последний байт с CRC7 выставляю в 0xFF. Вся команда: 0x49, 0x00,0x00, 0x00, 0x00, 0xFF. CRC = 0x00, у меня. В ответ получаю - R1 == 0x00 Точнее любое значение без старшего бита в течении не более 80 тактов - признак начала данных - 0xFE сканируя в течении не более 100ms - 16 байт Да. Если еще попинговать карту FF-ми, то получаем еще 1 байт. Ну получаете, то сколько угодно байт, но они все кроме первого 0xFF? Ну А может CRC 0xXXFF :) Не знаю, я в мусорник два байта вычитываю и все. Странно, вроде, по идее, я должен получить 16 байт данных после 0xFE и CRC16, т.е. еще 2 байта. Да. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rudolph 0 13 августа, 2007 Опубликовано 13 августа, 2007 (изменено) · Жалоба Это как? Ну отправляю 0xFF и жду, придет лии что нить еще, не равное 0xFF. А CRC включен (CMD59)? CRC не включен. В мануале написано, что в SPI он по умолчанию отключен, но я так понимаю, что эти байты(CRC16) все равно присылаются, но их надо игнорировать. Или я неправ? Изменено 13 августа, 2007 пользователем Rudolph Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rudolph 0 13 августа, 2007 Опубликовано 13 августа, 2007 · Жалоба Сейчас слегка переделал прием, чтобы только непрерывные последовательности байтов != FF принимать. Получается, после 0xFE принимается сначала 10 байт, не равных FF, затем сколько-то 0xFF и затем следующая последовательнеость - 7 байт не равных 0xFF. И все. Как-то непонятно. Вроде данные с CRC16 должны идти непрерывным массивом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a3r3 0 13 августа, 2007 Опубликовано 13 августа, 2007 · Жалоба В мануале написано, что в SPI он по умолчанию отключен, но я так понимаю, что эти байты(CRC16) все равно присылаются, но их надо игнорировать. Или я неправ? Присылаются, только стандарт не оговаривает, что в них передается. Сейчас слегка переделал прием, чтобы только непрерывные последовательности байтов != FF принимать. Получается, после 0xFE принимается сначала 10 байт, не равных FF, затем сколько-то 0xFF и затем следующая последовательнеость - 7 байт не равных 0xFF. И все. Как-то непонятно. Вроде данные с CRC16 должны идти непрерывным массивом. Данные всегда идут непрерывным массивом после токена, принимать нужно все. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rudolph 0 14 августа, 2007 Опубликовано 14 августа, 2007 · Жалоба Присылаются, только стандарт не оговаривает, что в них передается. Ессно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rudolph 0 15 августа, 2007 Опубликовано 15 августа, 2007 · Жалоба Короче, это я лось педальный. У меня ФФ-ы выкидывались, а один из них был в массиве CSD. Все нормально карточка отвечает теперь(00 + FE + 16 байт CSD + 2 CRC16) и даже осмысленные данные в CSD. Насчет CSD->C_SIZE, я так понял, что значения этого поля зависят от производителя? В мануале тошибы - одни значения, у SanDisk - другие. Мне Kingston возвращает третьи. А вот у 16Mb Sd card Canon - совпадает с мануалом от SanDisk. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
JohnSilver 1 3 ноября, 2008 Опубликовано 3 ноября, 2008 (изменено) · Жалоба Подскажите, люди добрые, что я не так делаю. Прошерстил все источники, просмотрел все исходники, написал прожку. Настройка портов: #define SPI_NPCS1_CONFIG (/*255<<24|0xFF<<16|*/AT91C_SPI_NCPHA|AT91C_SPI_BITS_8|(120<<8)) //400 kHz AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ; AT91C_BASE_PIOA->PIO_PER = AT91C_PIO_PA25 | AT91C_PIO_PA23; // DispRS and DispReset AT91C_BASE_PIOA->PIO_OER = AT91C_PIO_PA25 | AT91C_PIO_PA23; AT91C_BASE_PIOA->PIO_SODR = AT91C_PIO_PA25 | AT91C_PIO_PA23; // ======== Init SPI ================ AT91PS_SPI pSPI = AT91C_BASE_SPI ; AT91F_SPI_CfgPMC(); // Enables the SPI Clock AT91F_SPI_CfgPIO(); // Open PIO for SPI AT91F_SPI_Reset(pSPI);// Reset SPI AT91F_SPI_CfgMode(pSPI, SPI_MODE); // Configure SPI in Master Mode with No CS selected AT91F_SPI_CfgCs(pSPI, 0, SPI_NPCS0_CONFIG); // Configure SPI0 Display CX65 pSPI->SPI_CSR[1] = SPI_NPCS1_CONFIG; pSPI->SPI_IDR = 0xffffffff; //отключение прерываний AT91F_SPI_Enable(pSPI); // SPI_Enable AT91F_PIO_CfgInput(AT91C_BASE_PIOA, CARD_PROT|CARD_DET); AT91C_BASE_PIOA->PIO_PER = AT91C_PIO_PA9; // CS1 for MMC/SDC AT91C_BASE_PIOA->PIO_OER = AT91C_PIO_PA9; AT91C_BASE_PIOA->PIO_SODR = AT91C_PIO_PA9; Передача/прием байта: void xmit_spi(char dat) { while (AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE==0); AT91F_SPI_PutChar (AT91C_BASE_SPI, dat, 1); } static BYTE rcvr_spi (char dat) { char res; while (AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE==0); AT91F_SPI_PutChar (AT91C_BASE_SPI, dat, 1); while (AT91C_BASE_SPI->SPI_SR & AT91C_SPI_RDRF==0); res = (BYTE)( AT91C_BASE_SPI->SPI_RDR ); return res; } Работа с картой: do { __disable_interrupt(); DESELECT(); // поднять CS Delay_mks(100); for (n = 10; n; n--) xmit_spi(0xFF); /* 80 dummy clocks */ n=0; ty=0; SELECT(); // опустить CS Delay_mks(100); xmit_spi(0x40); Delay_mks(100); xmit_spi(0); Delay_mks(100); xmit_spi(0); Delay_mks(100); xmit_spi(0); Delay_mks(100); xmit_spi(0); Delay_mks(100); cmd=rcvr_spi(0x95); // Delay_mks(100); n=255; while (cmd == 0xFF && n) { n--; cmd = rcvr_spi(0xFF); } } while (cmd == 0xFF); DESELECT(); Сначала ваще ничего не получал в ответ (0xFF), потом поставил ожидание после каждой SPI посылки 100 мкс, начал получать 0x01 в ответ на CMD0 (для MMC карты, и 0x05 для SD). Если изменял время задержек мог получать всяку ерунду, типа сдвинутого ответа. Если убрать хоть одну задержку - ответ 0xFF, т.е. нет ответа. Пробовал ставить аппаратные задержки в SPI #define SPI_NPCS1_CONFIG (255<<24|0xFF<<16|AT91C_SPI_NCPHA|AT91C_SPI_BITS_8|(120<<8)) - нет ответа. MMC Canon 16MB microSD SanDisk 512MB SAM7S64 ЗЫ Дисплей от S65 на SPI0 - работает отлично. Изменено 3 ноября, 2008 пользователем John Silver Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dron_Gus 2 3 ноября, 2008 Опубликовано 3 ноября, 2008 · Жалоба Посылку и прием лучше сделать одной универсальной функцией. Ждать по while (AT91C_BASE_SPI->SPI_SR & AT91C_SPI_RDRF==0); и всегда вычитывать AT91C_BASE_SPI->SPI_RDR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
JohnSilver 1 3 ноября, 2008 Опубликовано 3 ноября, 2008 (изменено) · Жалоба делал, без разницы (собственно, как и предполагалось) во многих примерах чтение и запись сделаны раздельно, наверно что бы немножко экономить время Сам интерфейс походу работает (хоть с задержками, но работает). Проблема в том, что задержек много. Я еще конечно буду пробовать задержки плавно уменьшать, авось останется 1мкс, тады и фиг с ней. Изменено 3 ноября, 2008 пользователем John Silver Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dron_Gus 2 3 ноября, 2008 Опубликовано 3 ноября, 2008 · Жалоба Тогда по пунктам. Если после отправки не дождаться принятия байта, то он конда-нибудь все же примется. тем самым взведет соответствующий бит в статус-регистре. При следующей посылке с чтением вы посылаете байт и тут же проверяете флаг принятия байта. Но он остался взеведенным с прошлой посылки. При этом контроллер именно в этот момент принимает байт. Что вы в этот момент прочитаете из регистра принятых данных - х.з. Хорошо если предыдуший принятый байт. Соответственно с задержками это все будет как-то работать. Если уж так хочется иметь две разные функции, то перед отправкой делайте пустое чтение регистра принятых данных. тем самым сбросите флаг и дождетесь действительного нужного вам байта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leopold111 0 3 ноября, 2008 Опубликовано 3 ноября, 2008 · Жалоба Здравствуйте!!! Подскажите с инициализацией micro SD Apacer 1024Mb. Работаю через LPT. CMD и DAT подтянуты к питанию через 30к. Шлю CMD=0, ответ =1. CMD=1, ответ=255 и все, никание команды не принимает. При CMD=55 + CMD=41, эффект тот же. Если после CMD=0 ввести CMD=58 Ответ: 0 255 128 255. Ответ на CMD=8 ответ=9. Как ввести этой команде атрибуты нигде не нашел. А она вроде участвует в инициализации. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
JohnSilver 1 4 ноября, 2008 Опубликовано 4 ноября, 2008 · Жалоба Тогда по пунктам. Если после отправки не дождаться принятия байта, то он конда-нибудь все же примется. тем самым взведет соответствующий бит в статус-регистре. При следующей посылке с чтением вы посылаете байт и тут же проверяете флаг принятия байта. Но он остался взеведенным с прошлой посылки. При этом контроллер именно в этот момент принимает байт. Что вы в этот момент прочитаете из регистра принятых данных - х.з. Хорошо если предыдуший принятый байт. Соответственно с задержками это все будет как-то работать. Если уж так хочется иметь две разные функции, то перед отправкой делайте пустое чтение регистра принятых данных. тем самым сбросите флаг и дождетесь действительного нужного вам байта. Вообще логично, согласен. Уже сделал на одной функции. Инициализацию прошел, но с задержками. MMC: CMD0, CMD1, CMD16, дальше пока не пробовал. Но, откуда задержки? Ни в одном примере их нет, и у всех все работает. Сдираю пример "в ноль" для моего проца - без задержек не работает, уменьшаю задержку со 100 до 50 мкс - не работает. Есть у кого какие мысли по этому поводу? Здравствуйте!!! Подскажите с инициализацией micro SD Apacer 1024Mb. Работаю через LPT. CMD и DAT подтянуты к питанию через 30к. Шлю CMD=0, ответ =1. CMD=1, ответ=255 и все, никание команды не принимает. При CMD=55 + CMD=41, эффект тот же. Если после CMD=0 ввести CMD=58 Ответ: 0 255 128 255. Ответ на CMD=8 ответ=9. Как ввести этой команде атрибуты нигде не нашел. А она вроде участвует в инициализации. Спасибо. С командой CMD8 есть пример сдесь http://elm-chan.org/fsw/ff/ffsample.zip if (send_cmd(CMD8, 0x1AA) == 1) { /* SDHC */ Я так понял это команда для SDHC карт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться