Перейти к содержанию
    

Проблема с SD картой

Вобщем эту тему можно было и не открывать, рядом есть такая же, но тут другой вопрос рассматривается. Думаю, модераторы форума меня поймут.

 

Суть проблемы в том, что карта SD не откликается на инициализацию, а проц попросту зацикливается. Режим используется SPI.

 

Сейчас растолкую схему.

 

Карта - miniSD из комплекта Nokia 6280. Так и наз. "NOKIA"

Проц - ATtiny2313, частота 1,3824 МГц (11,0592/8)

Питание проца +5В

Питание карты - через IRU101033 (+3,3В)

Делители для DI, CS и CLK - сверху 2,4 кОм, снизу 4,7 кОм

DO подается напрямую на ногу проца.

Используется порт B (выв. 12-15)

Ноги 8 и 9 карты висят в воздухе.

 

В софте ошибок быть не может. Прошивка отлажена и проверена в Proteuse (там правда MMC, но суть дела не меняет). Там всё идёт. В реальной схеме проц виснет на инициализации.

 

Предположительно - ошибка в реальном железе, а именно в уровнях напряжений. Если кто знает - подскажите, где может быть подвох.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Делители для DI, CS и CLK - сверху 2,4 кОм, снизу 4,7 кОм

 

А почему бы не сделать выход с открытым коллектором и подтянуть резисторами к + 3V3.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ноги 8 и 9 карты висят в воздухе.

Так делать нельзя. Неиспользуемые линии данных нужно подтянуть к питанию, иначе могут быть проблемы.

 

Прошивка отлажена и проверена в Proteuse (там правда MMC, но суть дела не меняет). Там всё идёт. В реальной схеме проц виснет на инициализации.

Меняет: инициализация SD и MMC отличается. На чем именно зацикливается инициализация?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В софте ошибок быть не может. Прошивка отлажена и проверена в Proteuse (там правда MMC, но суть дела не меняет). Там всё идёт. В реальной схеме проц виснет на инициализации.

Ну во первых, напряжение питание и напряжение уровней остальных выводов SPI должны быть одинаковы и в пределах 2,0 - 3,6В. Не буду утверждать, но 5В это многовато, хотя бывает и толейрантно (про это в datasheet).

Во вторых, ММС и SD (особенно больших объемов памяти) все таки отличаются по протоколам инициализации. Надо смотреть свежий datasheet.

Изменено пользователем SALOME

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему бы не сделать выход с открытым коллектором и подтянуть резисторами к + 3V3.

 

Ну я уже где-то видел такой делитель, где-то на немецком сайте. Конечно, коллектор - это вариант. В конечном итоге так и сделаю.

 

Ну во первых, напряжение питание и напряжение уровней остальных выводов SPI должны быть одинаковы и в пределах 2,0 - 3,6В. Не буду утверждать, но 5В это многовато, хотя бывает и толейрантно (про это в datasheet).

Во вторых, ММС и SD (особенно больших объемов памяти) все таки отличаются по протоколам инициализации. Надо смотреть свежий datasheet.

 

Забыл указать обьём - 64М. Думаю, это не так много.

 

Из-за другой работы пришлось немного отложить это дело. Но завтра подключу карту к LPT и без всяких процов посмотрю на ответы карты. Сейчас сел писать программу на Visual Basic (с си++ как-то не сложилось :) ), чтобы инициализировать карту напрямую.

Если не заработает, буду "терзать железо", а именно подтягивать выводы, уменьшать напряжение питания и т.д.

А, да, кстати. К LPT буду подключать с помощью STK200 на 244-ом буфере, спаял его когда-то для программирования AVR. Сначала с помощью тех-же делителей с +5В, а если не поможет, то снижу напряжение питания до 3.3 В.

 

 

Меняет: инициализация SD и MMC отличается. На чем именно зацикливается инициализация?

 

Насколько я знаю, инициализация SD и MMC в режиме SPI ничем не отличается. Если я не прав - поправьте меня, дайте ссылку на соотв. доку.

Ещё выяснил, что модель карты MMC в Proteuse настолько добрая, что работает даже без инициализации карты :) Отложил свой Proteus в сторону до лучших времён!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насколько я знаю, инициализация SD и MMC в режиме SPI ничем не отличается.

 

Function: Инциализация FLASH_SD карты по протоколу SPI

Description: Перевести карту в режим SPI, и разбудить.

1.Переход на SPI протокол (инициализация):

- после подачи питания: Fclk<400KHz; синхронизация и сдвиг бита по переднему

нарастающему фронту, пассивный уровень CLK -0;

- не подавая CS=0, оправить по SPI 10 пустых байт;

- подать команду CMD0 (сброс) и получить отклик 0х01. Bit_7=0 означает, что карта

откликнулась, Bit_0=1 - находится в спячке. Режим SPI сохранится до выключения питания.

2.Активизация карты в SPI режиме:

- подать CMD8 с аргументом пит. напряжения и емкости карты. Если в отклике эта команда

допустима (Bit_2=0), то карта ver2.00 и выше и она по напряжению совместима. Далее ее

следует вывести из спячки командой CMD41 и проверить емкость CMD58.

-если отклик R1 на CMD8 неверен, то применить ACMD41. Если карта не выходит из спячки,

то это не SD_карта.

-для MMC_карты применяется команда CMD1.

3. Увеличить скорость обмена

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Инциализация FLASH_SD карты по протоколу SPI

 

Вот я сегодня и проколупался зря. Карточка CMD_0 сьела и "заснула". CMD_1 слать смысла нет.

Теперь вот пришёл с работы и почитал свою ветку.

Оказывается различается протокол!

Спасибо SALOME, за то, что пролили свет.

 

SALOME, если вам не трудно, дайте ссылку на полный документ по инициализации именно SD-карты (т.е. тот, который легче всего освоить). Я тут поскачивал pdf-ок, но всё как-то не то.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

SALOME, если вам не трудно, дайте ссылку на полный документ по инициализации именно SD-карты (т.е. тот, который легче всего освоить). Я тут поскачивал pdf-ок, но всё как-то не то.

Для ММС можно больше практических примеров найти. Кстати причиной колупания может быть и не вполне исправная карта, извините за банальность. У меня такое было. Т.е. что-то принимает, а что-то нет.

http://www.sdcard.org/

http://www.sandisk.com/Oem/Manuals/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо ребята, всем, кто помог!

У меня всё получилось, точнее в рамках той задачи, которую я пока перед собой ставил.

Сначала подключил карту к LPT, написал прогу на VB и меня снова ожидали те же грабли: оказалось причина очень банальна. Я ждал после CMD0 ответа "0", а нужно было ждать "1". Но в VB гораздо легче отладить прогу, чем в 2051, в котором нет внутрисхемной отладки.

Следующим шагом была написана прошивка для AT89C2051, читает блок 512 байт и посылает по UART. Рабочая. Уже гонялась.

Пол-дела сделано!

Осталось дописать блок, отвечающий за ЦАП (это будет либо 8bit R-2R, либо микросхема ЦАП). Там будет слаться команда CMD18 и бесконечное считывание данных. Всё висит в голове, а времени снова нету...

И тогда чудище, под названием "Wav-плейер на AT89C2051" будет готово.

Когда получится - выложу схему и исходники.

 

P.S. Знаю, что сумашедший :)

P.S. А карточка моя оказывается легко откликается на CMD0 и CMD1, видимо старого образца.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В своей конструкции я столкнулся с подобными проблемами -

ОСНОВНАЯ из которых - ПОЧЕМУ не работает? :(

 

В основу положил готовую версию программы на ассемблере под AVR...

 

тут в архивчике в начале топика.

http://olympus.partak.ru/forum/viewtopic.p...c87f00458d4a4c8

 

пока делаю бук ридер...

 

Переделал исходник, откопал несколько багов, но после запуска выплыли проблемы

с инициализацией...

 

Карта MMC 32 мега... 9 и 8 концов нет...

 

1) в ответ на Reset вместо 01h стабильно выплывает 3F

 

A) Надо отправить более 74 сигналов CLK при CS и MOSI =1

Проще говоря послать 10 байтов 0xFF

В) Надо отправить команду Reset (40h) без параметров

C) Надо считать ответ от карты (нормальный ответ 01h)

 

2) при попытке прочесть выдаёт ошибку (не 0 ответ) на CMD17 до

запуска CMD13 который первый раз после включения выдаёт 0E00 а потом всегда 0000

 

3) далее после запуска CMD13 и прохода 1 части CMD17, не проходит проверка на данные

cpi R16_Tmp1,0xFE , если её заремить оно читает, но возвращает все нули...

 

В файле схема, исходник и дока...

 

Изменено пользователем QuickWitted

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В своей конструкции я столкнулся с подобными проблемами -

ОСНОВНАЯ из которых - ПОЧЕМУ не работает? :(

Проблема не нова. И не так уж проста эта FLASH карта. Я сейчас делаю на ADuC для MMC. Выкладываю кость, может она Вас развлечет. На вопросы отвечу...

FLASH_SD.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На вопросы отвечу...

 

Я использовал готовый исходник... там ответ един 01

 

; Отправляет CMD0.Принимает отклик R1.Возвращает код отклика R1.

; Исправная карта всегда откликнется. При этом FLASH_SD может находится в спячке

 

поэтому вопрос откликаться чем? куда не смотрел 01 а у меня 3F?

Что можно покрутить? что не так делаю?

 

У меня за это отвечает подпрограмма SPIInit в файле S_SPI.asm

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

поэтому вопрос откликаться чем? куда не смотрел 01 а у меня 3F?

Ну не обзательно в отклике R1 на команду CMD0 должно быть 01. Главное, чтобы бит7=0...Так, что у вас все нормально :). Этим вы перевели ее в режим обмена по SPI. Обратите внимание, что в CMD0 последний байт команды равен 0х95, а у всех других команд - 0xFF. Дальше карту надо инициировать (разбудить). Для этого посылаем команду CMD1. Вот здесь надо дождаться R1=0x00. Отклик R1 приходит не сразу, ну и далее смотрите мой исходник... Успехов. Я убежала....

Изменено пользователем SALOME

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну не обзательно в отклике R1 на команду CMD0 должно быть 01. Главное, чтобы бит7=0...Так, что у вас все нормально :). Этим вы перевели ее в режим обмена по SPI.

 

Из того что я прочёл по ММС следует вывод:

 

0- В спящем режиме - карта находится в спящем режиме и выполняется процесс инициализации;

1- Erase reset - стирание не выполнено, т.к операция прервана до исполнения;

2- Недопустимая команда - обнаружен недопустимый номер команды;

3- Ошибка CRC - последняя принятая команда не прошла проверку CRC;

4- Erase_seq_error - ошибка в команде стирания;

5- Ошибка адреса - блок пересекает границу физического сектора;

6- Ошибка параметра - аргумент команды вне допустимых пределов для данной карты.

7- всегда ноль

 

И с какого 0-5 единицы?

 

Что-то тут не так подумал колобок - медленно пережёвывая остатки лисы (Анекдот)

 

Обратите внимание, что в CMD0 последний байт команды равен 0х95, а у всех других команд - 0xFF.

 

Почему? 0х95 - контрольная сумма, а 0xFF тут при чём?

(CRC16 проверяется только при первой команде)

в др. примерах 0х95 постоянно...

 

Дальше карту надо инициировать (разбудить). Для этого посылаем команду CMD1. Вот здесь надо дождаться R1=0x00. Отклик R1 приходит не сразу, ну и далее смотрите мой исходник...

 

Вопрос почему после CMD0 и CMD1 чтение не работает что я не так делаю?

 

Если тебе не трудно укажи прямой линк к дадащитам...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И с какого 0-5 единицы?

 

Почему? 0х95 - контрольная сумма, а 0xFF тут при чём?

Вопрос почему после CMD0 и CMD1 чтение не работает что я не так делаю?

 

Если тебе не трудно укажи прямой линк к дадащитам...

Вы не пока заморачивайтесь на остальных битах отклика от CMD0. Если Вы получили отклик с bit7=0, то карта жива и готова к обмену по SPI.

0х95 в CMD0, потому, что до этого карта может работать по другим протоколам обмена (не SPI) и там важна контрольная сумма (CRC). При работе в SPI контрольная сумма не высчитается, а этот байт играет другую роль.

Причины, почему не просыпается Ваша карта после CMD1. (Надеюсь, что осцилом вы смотрите на все происходящее у вас на линиях SPI?):

Неправлиьно настроен интерфейс SPI (не совпадает фаза, полярность, скорость)

Не посылаете пустой байт перед отправкой команды

Не соблюдаете задержку Ncr при получении отклика R1

У Вас не ММС карта

У Вас живая, но неисправная карта и т.д.

Еще раз напоминаю, что команду CMD1 следует повторить не менее 100 раз, пока не появится отклик.

Даташит смотрите выше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...