команды SD Card

Здpавствуй, All!

Пытаюсь прочитать контроллером данные с флешки. Читается что-то непонятно... Я так думаю, что не правильно команды формирую.

Я вот собственное так делаю:

  1. 80 раз на SCK прыгаю при CS в единице.
  2. CS перевожу в ноль.
  3. {0xFF, CMD1, 0x00, 0x00, 0x00, 0x00, 0x95, 0xFF, 0xFF}
3.5. Читаю ответ - все путем
  1. {0xFF, CMD1,0x00,0x00,0x00,0x00,0xff, 0xFF, 0xFF} пока ответ не станет нулём.
4.5. Получаю ответ ноль - все нормально.
  1. Пытался далее отправить таким же макаром CMD9 и CMD10, ответ приходит, не знаю насколько правильный, но по количеству байт совпадает (16 байт): {0xFF, CMD10, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF,.....} и того 31 байт. У меня буфер SPI на 32 байта.

А вот данные прочитать не могу..Пытаюсь так {0xFF, CMD16, 0x00, 0x00, 0x00, 0x0A, 0x01, 0xFF, 0xFF} читаю ответ и получаю: {0x00, 0x01} //хочу прочитать первые 16 байт с флешки. Hачиная вот с первого байта.

потом посылаю: {0xFF, CMD17, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF....} читаю ответ и получаю непонятные мне данные.

Я предварительно сделал "dd if=/mnt/flash of=/temp/flash.bin" в linux Так вот, в flash.bin я, полученной CMD17, последовательности не нашел..

Подскажите где косяк может быть в алгоритме.. И еще, как быт с CS я не понял. сразу после инициализации просто забыть про него, или может его после выполнения команд нужно переключать?

С уважением - Aleksandr

Reply to
Aleksandr Lapshemkov
Loading thread data ...

Hi Aleksandr, hope you are having a nice day!

19 Nov 10, Aleksandr Lapshemkov wrote to All:

AL> Пытаюсь прочитать контроллером данные с флешки. Читается что-то AL> непонятно... Я AL> так думаю, что не правильно команды формирую.

AL> Я вот собственное так делаю: AL> 1. 80 раз на SCK прыгаю при CS в единице. AL> 2. CS перевожу в ноль. AL> 3. {0xFF, CMD1, 0x00, 0x00, 0x00, 0x00, 0x95, 0xFF, 0xFF} AL> 3.5. Читаю ответ - все путем

Где CMD0 ? Начинать надо с нее, именно по ней карта определяет правильный режим работы (SD или SPI)

AL> 4. {0xFF, CMD1,0x00,0x00,0x00,0x00,0xff, 0xFF, 0xFF} пока ответ не AL> станет AL> нулём. 4.5. Получаю ответ ноль - все нормально. 5. Пытался далее отправить AL> таким же макаром CMD9 и CMD10, ответ приходит, не знаю насколько AL> правильный, AL> но по количеству байт совпадает (16 байт): {0xFF, CMD10, 0x00, 0x00, 0x00, AL> 0x00, 0x01, 0xFF, 0xFF, 0xFF,.....} и того 31 байт. У меня буфер SPI на 32 AL> байта.

Бр... Таки SD или SPI режим? Для SPI режима последовательность инициализиации:

CMD0 -> CMD8 -> CMD58 -> ACMD41 -> CMD9. Причем в последовательности есть CMD0 -> CMD8 -> различия для SDHC и SD. Алгоритм нарисван в стандарте.

AL> А вот данные прочитать не могу..Пытаюсь так AL> {0xFF, CMD16, 0x00, 0x00, 0x00, 0x0A, 0x01, 0xFF, 0xFF} читаю ответ и AL> получаю: AL> {0x00, 0x01} //хочу прочитать первые 16 байт с флешки. Hачиная вот с AL> первого AL> байта.

AL> потом посылаю: AL> {0xFF, CMD17, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF....} читаю ответ и AL> получаю непонятные мне данные.

Как факт, все должно работать. Приведи инициализацию в соответсвие со стандартом, если не заработает - пиши, будем разбираться.

AL> Я предварительно сделал "dd if=/mnt/flash of=/temp/flash.bin" в linux AL> Так вот, в flash.bin я, полученной CMD17, последовательности не нашел..

Нафиг линукс, надо руководствоваться стандартом.

AL> Подскажите где косяк может быть в алгоритме.. AL> И еще, как быт с CS я не понял. сразу после инициализации просто забыть AL> про AL> него, или может его после выполнения команд нужно переключать?

Если мы в SPI-режиме, то обязательно после каждой транзакции поднимать в единицу. Иначе никто не гарантируется, что оно будет работать. Вообще даже странно, что оно так работает.

После поднятия CS надо дать еще несколько клоков карте (обычно 8).

WBR, AVB

Reply to
Alexey V Bugrov

Здpавствуй, Alexey!

Пятница 19 Hоября 2010 12:38, ты писал(а) мне, в сообщении по ссылке area://ru.embedded?msgid=2:5029/32@fidonet+4ce64775:

AL>> Я вот собственное так делаю: AL>> 1. 80 раз на SCK прыгаю при CS в единице. AL>> 2. CS перевожу в ноль. AL>> 3. {0xFF, CMD1, 0x00, 0x00, 0x00, 0x00, 0x95, 0xFF, 0xFF} AL>> 3.5. Читаю ответ - все путем

AB> Где CMD0 ? Hачинать надо с нее, именно по ней карта определяет AB> правильный режим работы (SD или SPI)

Прошу прощения, здесь я очепятался. CMD0 должно быть.

AL>> 4. {0xFF, CMD1,0x00,0x00,0x00,0x00,0xff, 0xFF, 0xFF} пока ответ AL>> не станет нулём. 4.5. Получаю ответ ноль - все нормально. 5. AL>> Пытался далее отправить таким же макаром CMD9 и CMD10, ответ AL>> приходит, не знаю насколько правильный, но по количеству байт AL>> совпадает (16 байт): {0xFF, CMD10, 0x00, 0x00, 0x00, 0x00, 0x01, AL>> 0xFF, 0xFF, 0xFF,.....} и того 31 байт. У меня буфер SPI на 32 AL>> байта.

AB> Бр... Таки SD или SPI режим? Для SPI режима последовательность AB> инициализиации:

нужен SPI режим.

AB> CMD0 -> CMD8 -> CMD58 -> ACMD41 -> CMD9. Причем в последовательности AB> есть различия для SDHC и SD. Алгоритм нарисван в стандарте.

У меня на карточке написано "SD Memory Card SDC-32M". По тех заданию нуна mmc, но я слышал, что с точки зрения SPI mmc и CD совместимы.

А что такое CMD8? 0_0 У меня в табличке с кодами написано вот такое(я ее в инете нарыл):

#define CMD8 0x48 // Reserved #define CMD41 0x69 // Reserved

AL>> А вот данные прочитать не могу..Пытаюсь так AL>> {0xFF, CMD16, 0x00, 0x00, 0x00, 0x0A, 0x01, 0xFF, 0xFF} читаю AL>> ответ и получаю: {0x00, 0x01} //хочу прочитать первые 16 байт с AL>> флешки. Hачиная вот с первого байта.

AL>> потом посылаю: AL>> {0xFF, CMD17, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF....} читаю AL>> ответ и получаю непонятные мне данные.

AB> Как факт, все должно работать. Приведи инициализацию в соответсвие со AB> стандартом, если не заработает - пиши, будем разбираться.

AL>> Я предварительно сделал "dd if=/mnt/flash of=/temp/flash.bin" в AL>> linux Так вот, в flash.bin я, полученной CMD17, AL>> последовательности не нашел..

AB> Hафиг линукс, надо руководствоваться стандартом. Так я форматнул флеху в винде, а как там слить образ без всяких сервисных кодов не знаю, вот и сделал в линуксе, там все просто и удобно.

AL>> Подскажите где косяк может быть в алгоритме.. AL>> И еще, как быт с CS я не понял. сразу после инициализации просто AL>> забыть про него, или может его после выполнения команд нужно AL>> переключать?

AB> Если мы в SPI-режиме, то обязательно после каждой транзакции поднимать AB> в единицу. Иначе никто не гарантируется, что оно будет работать. AB> Вообще даже странно, что оно так работает. AB> После поднятия CS надо дать еще несколько клоков карте (обычно 8).

О! это я учту обязательно! По ходу дела из-за этого оно у меня и работало так не стабильно. А иногда всетаки работало из-за того что я SPI в контроллере не правильно настроил. Он навароченый в мотороле, я его еще не поборол до конца? режимы всякие... ))

Там, короче, есть режим, огда SPI CS в 1 поднимает автоматом после передачи.

К сожалению Hапарник спалил свой программатор и забрал мой. :( У него срочная работа. Так что мне отлаживаться негде...Придется это дело немного замарозить. Купят новый - продолжим :)

С уважением - Aleksandr

Reply to
Aleksandr Lapshemkov

Hi Aleksandr, hope you are having a nice day!

19 Nov 10, Aleksandr Lapshemkov wrote to Alexey V Bugrov:

AB>> CMD0 -> CMD8 -> CMD58 -> ACMD41 -> CMD9. Причем в последовательности AB>> есть различия для SDHC и SD. Алгоритм нарисван в стандарте.

AL> У меня на карточке написано "SD Memory Card SDC-32M". По тех заданию нуна AL> mmc, AL> но я слышал, что с точки зрения SPI mmc и CD совместимы.

Ну не то что бы совсем совместимы, но таки очень много общего.

AL> А что такое CMD8? 0_0 У меня в табличке с кодами написано вот такое(я AL> ее в AL> инете нарыл):

AL> #define CMD8 0x48 // Reserved AL> #define CMD41 0x69 // Reserved

Есть такой документ

formatting link
Официальный и доступен нахаляву, включает поддрежку как SD, так и SDHC. Правда урезанный, но с точки зрения программинга достаточный.

WBR, AVB

Reply to
Alexey V Bugrov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.