Angelborn 0 3 июля, 2007 Опубликовано 3 июля, 2007 · Жалоба Вобщем эту тему можно было и не открывать, рядом есть такая же, но тут другой вопрос рассматривается. Думаю, модераторы форума меня поймут. Суть проблемы в том, что карта 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, но суть дела не меняет). Там всё идёт. В реальной схеме проц виснет на инициализации. Предположительно - ошибка в реальном железе, а именно в уровнях напряжений. Если кто знает - подскажите, где может быть подвох. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TBI 0 5 июля, 2007 Опубликовано 5 июля, 2007 · Жалоба Делители для DI, CS и CLK - сверху 2,4 кОм, снизу 4,7 кОм А почему бы не сделать выход с открытым коллектором и подтянуть резисторами к + 3V3. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a3r3 0 5 июля, 2007 Опубликовано 5 июля, 2007 · Жалоба Ноги 8 и 9 карты висят в воздухе. Так делать нельзя. Неиспользуемые линии данных нужно подтянуть к питанию, иначе могут быть проблемы. Прошивка отлажена и проверена в Proteuse (там правда MMC, но суть дела не меняет). Там всё идёт. В реальной схеме проц виснет на инициализации. Меняет: инициализация SD и MMC отличается. На чем именно зацикливается инициализация? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SALOME 0 5 июля, 2007 Опубликовано 5 июля, 2007 (изменено) · Жалоба В софте ошибок быть не может. Прошивка отлажена и проверена в Proteuse (там правда MMC, но суть дела не меняет). Там всё идёт. В реальной схеме проц виснет на инициализации. Ну во первых, напряжение питание и напряжение уровней остальных выводов SPI должны быть одинаковы и в пределах 2,0 - 3,6В. Не буду утверждать, но 5В это многовато, хотя бывает и толейрантно (про это в datasheet). Во вторых, ММС и SD (особенно больших объемов памяти) все таки отличаются по протоколам инициализации. Надо смотреть свежий datasheet. Изменено 5 июля, 2007 пользователем SALOME Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Angelborn 0 5 июля, 2007 Опубликовано 5 июля, 2007 · Жалоба А почему бы не сделать выход с открытым коллектором и подтянуть резисторами к + 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 в сторону до лучших времён! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SALOME 0 6 июля, 2007 Опубликовано 6 июля, 2007 · Жалоба Насколько я знаю, инициализация 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. Увеличить скорость обмена Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Angelborn 0 6 июля, 2007 Опубликовано 6 июля, 2007 · Жалоба Инциализация FLASH_SD карты по протоколу SPI Вот я сегодня и проколупался зря. Карточка CMD_0 сьела и "заснула". CMD_1 слать смысла нет. Теперь вот пришёл с работы и почитал свою ветку. Оказывается различается протокол! Спасибо SALOME, за то, что пролили свет. SALOME, если вам не трудно, дайте ссылку на полный документ по инициализации именно SD-карты (т.е. тот, который легче всего освоить). Я тут поскачивал pdf-ок, но всё как-то не то. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SALOME 0 7 июля, 2007 Опубликовано 7 июля, 2007 · Жалоба SALOME, если вам не трудно, дайте ссылку на полный документ по инициализации именно SD-карты (т.е. тот, который легче всего освоить). Я тут поскачивал pdf-ок, но всё как-то не то. Для ММС можно больше практических примеров найти. Кстати причиной колупания может быть и не вполне исправная карта, извините за банальность. У меня такое было. Т.е. что-то принимает, а что-то нет. http://www.sdcard.org/ http://www.sandisk.com/Oem/Manuals/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Angelborn 0 9 июля, 2007 Опубликовано 9 июля, 2007 · Жалоба Спасибо ребята, всем, кто помог! У меня всё получилось, точнее в рамках той задачи, которую я пока перед собой ставил. Сначала подключил карту к LPT, написал прогу на VB и меня снова ожидали те же грабли: оказалось причина очень банальна. Я ждал после CMD0 ответа "0", а нужно было ждать "1". Но в VB гораздо легче отладить прогу, чем в 2051, в котором нет внутрисхемной отладки. Следующим шагом была написана прошивка для AT89C2051, читает блок 512 байт и посылает по UART. Рабочая. Уже гонялась. Пол-дела сделано! Осталось дописать блок, отвечающий за ЦАП (это будет либо 8bit R-2R, либо микросхема ЦАП). Там будет слаться команда CMD18 и бесконечное считывание данных. Всё висит в голове, а времени снова нету... И тогда чудище, под названием "Wav-плейер на AT89C2051" будет готово. Когда получится - выложу схему и исходники. P.S. Знаю, что сумашедший :) P.S. А карточка моя оказывается легко откликается на CMD0 и CMD1, видимо старого образца. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
QuickWitted 0 13 июля, 2007 Опубликовано 13 июля, 2007 (изменено) · Жалоба В своей конструкции я столкнулся с подобными проблемами - ОСНОВНАЯ из которых - ПОЧЕМУ не работает? :( В основу положил готовую версию программы на ассемблере под 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 , если её заремить оно читает, но возвращает все нули... В файле схема, исходник и дока... Изменено 13 июля, 2007 пользователем QuickWitted Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SALOME 0 13 июля, 2007 Опубликовано 13 июля, 2007 · Жалоба В своей конструкции я столкнулся с подобными проблемами - ОСНОВНАЯ из которых - ПОЧЕМУ не работает? :( Проблема не нова. И не так уж проста эта FLASH карта. Я сейчас делаю на ADuC для MMC. Выкладываю кость, может она Вас развлечет. На вопросы отвечу... FLASH_SD.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
QuickWitted 0 13 июля, 2007 Опубликовано 13 июля, 2007 · Жалоба На вопросы отвечу... Я использовал готовый исходник... там ответ един 01 ; Отправляет CMD0.Принимает отклик R1.Возвращает код отклика R1. ; Исправная карта всегда откликнется. При этом FLASH_SD может находится в спячке поэтому вопрос откликаться чем? куда не смотрел 01 а у меня 3F? Что можно покрутить? что не так делаю? У меня за это отвечает подпрограмма SPIInit в файле S_SPI.asm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SALOME 0 13 июля, 2007 Опубликовано 13 июля, 2007 (изменено) · Жалоба поэтому вопрос откликаться чем? куда не смотрел 01 а у меня 3F? Ну не обзательно в отклике R1 на команду CMD0 должно быть 01. Главное, чтобы бит7=0...Так, что у вас все нормально :). Этим вы перевели ее в режим обмена по SPI. Обратите внимание, что в CMD0 последний байт команды равен 0х95, а у всех других команд - 0xFF. Дальше карту надо инициировать (разбудить). Для этого посылаем команду CMD1. Вот здесь надо дождаться R1=0x00. Отклик R1 приходит не сразу, ну и далее смотрите мой исходник... Успехов. Я убежала.... Изменено 13 июля, 2007 пользователем SALOME Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
QuickWitted 0 14 июля, 2007 Опубликовано 14 июля, 2007 · Жалоба Ну не обзательно в отклике 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 чтение не работает что я не так делаю? Если тебе не трудно укажи прямой линк к дадащитам... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SALOME 0 14 июля, 2007 Опубликовано 14 июля, 2007 · Жалоба И с какого 0-5 единицы? Почему? 0х95 - контрольная сумма, а 0xFF тут при чём? Вопрос почему после CMD0 и CMD1 чтение не работает что я не так делаю? Если тебе не трудно укажи прямой линк к дадащитам... Вы не пока заморачивайтесь на остальных битах отклика от CMD0. Если Вы получили отклик с bit7=0, то карта жива и готова к обмену по SPI. 0х95 в CMD0, потому, что до этого карта может работать по другим протоколам обмена (не SPI) и там важна контрольная сумма (CRC). При работе в SPI контрольная сумма не высчитается, а этот байт играет другую роль. Причины, почему не просыпается Ваша карта после CMD1. (Надеюсь, что осцилом вы смотрите на все происходящее у вас на линиях SPI?): Неправлиьно настроен интерфейс SPI (не совпадает фаза, полярность, скорость) Не посылаете пустой байт перед отправкой команды Не соблюдаете задержку Ncr при получении отклика R1 У Вас не ММС карта У Вас живая, но неисправная карта и т.д. Еще раз напоминаю, что команду CMD1 следует повторить не менее 100 раз, пока не появится отклик. Даташит смотрите выше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться