Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с SD картой
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
Страницы: 1, 2, 3
Angelborn
Вобщем эту тему можно было и не открывать, рядом есть такая же, но тут другой вопрос рассматривается. Думаю, модераторы форума меня поймут.

Суть проблемы в том, что карта 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
Цитата(Angelborn @ Jul 3 2007, 20:30) *
Делители для DI, CS и CLK - сверху 2,4 кОм, снизу 4,7 кОм


А почему бы не сделать выход с открытым коллектором и подтянуть резисторами к + 3V3.
a3r3
Цитата(Angelborn @ Jul 3 2007, 21:30) *
Ноги 8 и 9 карты висят в воздухе.

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

Цитата(Angelborn @ Jul 3 2007, 21:30) *
Прошивка отлажена и проверена в Proteuse (там правда MMC, но суть дела не меняет). Там всё идёт. В реальной схеме проц виснет на инициализации.

Меняет: инициализация SD и MMC отличается. На чем именно зацикливается инициализация?
SALOME
Цитата(Angelborn @ Jul 4 2007, 00:30) *
В софте ошибок быть не может. Прошивка отлажена и проверена в Proteuse (там правда MMC, но суть дела не меняет). Там всё идёт. В реальной схеме проц виснет на инициализации.

Ну во первых, напряжение питание и напряжение уровней остальных выводов SPI должны быть одинаковы и в пределах 2,0 - 3,6В. Не буду утверждать, но 5В это многовато, хотя бывает и толейрантно (про это в datasheet).
Во вторых, ММС и SD (особенно больших объемов памяти) все таки отличаются по протоколам инициализации. Надо смотреть свежий datasheet.
Angelborn
Цитата(TBI @ Jul 5 2007, 11:09) *
А почему бы не сделать выход с открытым коллектором и подтянуть резисторами к + 3V3.


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

Цитата(SALOME @ Jul 5 2007, 12:28) *
Ну во первых, напряжение питание и напряжение уровней остальных выводов SPI должны быть одинаковы и в пределах 2,0 - 3,6В. Не буду утверждать, но 5В это многовато, хотя бывает и толейрантно (про это в datasheet).
Во вторых, ММС и SD (особенно больших объемов памяти) все таки отличаются по протоколам инициализации. Надо смотреть свежий datasheet.


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

Из-за другой работы пришлось немного отложить это дело. Но завтра подключу карту к LPT и без всяких процов посмотрю на ответы карты. Сейчас сел писать программу на Visual Basic (с си++ как-то не сложилось smile.gif ), чтобы инициализировать карту напрямую.
Если не заработает, буду "терзать железо", а именно подтягивать выводы, уменьшать напряжение питания и т.д.
А, да, кстати. К LPT буду подключать с помощью STK200 на 244-ом буфере, спаял его когда-то для программирования AVR. Сначала с помощью тех-же делителей с +5В, а если не поможет, то снижу напряжение питания до 3.3 В.


Цитата(a3r3 @ Jul 5 2007, 11:33) *
Меняет: инициализация SD и MMC отличается. На чем именно зацикливается инициализация?


Насколько я знаю, инициализация SD и MMC в режиме SPI ничем не отличается. Если я не прав - поправьте меня, дайте ссылку на соотв. доку.
Ещё выяснил, что модель карты MMC в Proteuse настолько добрая, что работает даже без инициализации карты smile.gif Отложил свой Proteus в сторону до лучших времён!
SALOME
Цитата(Angelborn @ Jul 6 2007, 02:43) *
Насколько я знаю, инициализация 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
Цитата(SALOME @ Jul 6 2007, 12:49) *
Инциализация FLASH_SD карты по протоколу SPI


Вот я сегодня и проколупался зря. Карточка CMD_0 сьела и "заснула". CMD_1 слать смысла нет.
Теперь вот пришёл с работы и почитал свою ветку.
Оказывается различается протокол!
Спасибо SALOME, за то, что пролили свет.

SALOME, если вам не трудно, дайте ссылку на полный документ по инициализации именно SD-карты (т.е. тот, который легче всего освоить). Я тут поскачивал pdf-ок, но всё как-то не то.
SALOME
Цитата(Angelborn @ Jul 7 2007, 01:19) *
SALOME, если вам не трудно, дайте ссылку на полный документ по инициализации именно SD-карты (т.е. тот, который легче всего освоить). Я тут поскачивал pdf-ок, но всё как-то не то.

Для ММС можно больше практических примеров найти. Кстати причиной колупания может быть и не вполне исправная карта, извините за банальность. У меня такое было. Т.е. что-то принимает, а что-то нет.
http://www.sdcard.org/
http://www.sandisk.com/Oem/Manuals/
Angelborn
Спасибо ребята, всем, кто помог!
У меня всё получилось, точнее в рамках той задачи, которую я пока перед собой ставил.
Сначала подключил карту к LPT, написал прогу на VB и меня снова ожидали те же грабли: оказалось причина очень банальна. Я ждал после CMD0 ответа "0", а нужно было ждать "1". Но в VB гораздо легче отладить прогу, чем в 2051, в котором нет внутрисхемной отладки.
Следующим шагом была написана прошивка для AT89C2051, читает блок 512 байт и посылает по UART. Рабочая. Уже гонялась.
Пол-дела сделано!
Осталось дописать блок, отвечающий за ЦАП (это будет либо 8bit R-2R, либо микросхема ЦАП). Там будет слаться команда CMD18 и бесконечное считывание данных. Всё висит в голове, а времени снова нету...
И тогда чудище, под названием "Wav-плейер на AT89C2051" будет готово.
Когда получится - выложу схему и исходники.

P.S. Знаю, что сумашедший smile.gif
P.S. А карточка моя оказывается легко откликается на CMD0 и CMD1, видимо старого образца.
QuickWitted
В своей конструкции я столкнулся с подобными проблемами -
ОСНОВНАЯ из которых - ПОЧЕМУ не работает? sad.gif

В основу положил готовую версию программы на ассемблере под 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 , если её заремить оно читает, но возвращает все нули...

В файле схема, исходник и дока...
Нажмите для просмотра прикрепленного файла
SALOME
Цитата(QuickWitted @ Jul 13 2007, 18:09) *
В своей конструкции я столкнулся с подобными проблемами -
ОСНОВНАЯ из которых - ПОЧЕМУ не работает? sad.gif

Проблема не нова. И не так уж проста эта FLASH карта. Я сейчас делаю на ADuC для MMC. Выкладываю кость, может она Вас развлечет. На вопросы отвечу...
QuickWitted
Цитата(SALOME @ Jul 13 2007, 16:30) *
На вопросы отвечу...


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

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

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

У меня за это отвечает подпрограмма SPIInit в файле S_SPI.asm
SALOME
Цитата(QuickWitted @ Jul 13 2007, 18:48) *
поэтому вопрос откликаться чем? куда не смотрел 01 а у меня 3F?

Ну не обзательно в отклике R1 на команду CMD0 должно быть 01. Главное, чтобы бит7=0...Так, что у вас все нормально smile.gif. Этим вы перевели ее в режим обмена по SPI. Обратите внимание, что в CMD0 последний байт команды равен 0х95, а у всех других команд - 0xFF. Дальше карту надо инициировать (разбудить). Для этого посылаем команду CMD1. Вот здесь надо дождаться R1=0x00. Отклик R1 приходит не сразу, ну и далее смотрите мой исходник... Успехов. Я убежала....
QuickWitted
Цитата(SALOME @ Jul 13 2007, 17:12) *
Ну не обзательно в отклике R1 на команду CMD0 должно быть 01. Главное, чтобы бит7=0...Так, что у вас все нормально smile.gif. Этим вы перевели ее в режим обмена по 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
Цитата(QuickWitted @ Jul 14 2007, 10:35) *
И с какого 0-5 единицы?

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

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

Вы не пока заморачивайтесь на остальных битах отклика от CMD0. Если Вы получили отклик с bit7=0, то карта жива и готова к обмену по SPI.
0х95 в CMD0, потому, что до этого карта может работать по другим протоколам обмена (не SPI) и там важна контрольная сумма (CRC). При работе в SPI контрольная сумма не высчитается, а этот байт играет другую роль.
Причины, почему не просыпается Ваша карта после CMD1. (Надеюсь, что осцилом вы смотрите на все происходящее у вас на линиях SPI?):
Неправлиьно настроен интерфейс SPI (не совпадает фаза, полярность, скорость)
Не посылаете пустой байт перед отправкой команды
Не соблюдаете задержку Ncr при получении отклика R1
У Вас не ММС карта
У Вас живая, но неисправная карта и т.д.
Еще раз напоминаю, что команду CMD1 следует повторить не менее 100 раз, пока не появится отклик.
Даташит смотрите выше.
QuickWitted
Цитата(SALOME @ Jul 14 2007, 10:04) *
Дальше карту надо инициировать (разбудить). Для этого посылаем команду CMD1. Вот здесь надо дождаться R1=0x00. Отклик R1 приходит не сразу, ну и далее смотрите мой исходник...
Еще раз напоминаю, что команду CMD1 следует повторить не менее 100 раз, пока не появится отклик.


Отловил пару глюков в исходном тексте,
откопал плохую пайку сопротивления 47к

CMD0 - начала правильно отвечать 01h
(до этого глючило из-за сопротивления)

Легче не стало CMD1 проходить не хочет
(отправляю 256х128 раз ну и?)

Стало интересно - как CRC считается?

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

там их много – какой именно?
А лучше если не трудно закиньте сюда…
QuickWitted
Цитата
При работе в SPI контрольная сумма не высчитается, а этот байт играет другую роль.

Под FF переделал. При CMD0 – 95 в остальных FF

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

Цифрового нет – а так смотрю... плюс использую для дебагинга RS-232

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

Он софтовый (не харда) В исходном примере он же В ТЕОРИИ работал…
(если верить автору сайта)
хотя по кол-во найденных мной ляпов я потихоньку начинаю сомневаться...

Т.к. он использует вывод только в 1 месте, то в будущем (после запуска) перейду на харду...

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

посылается

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

Вроде есть, но уточню: Сколько она должна быть? Где должна стоять?

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

Это как - чуть-чуть беременна? В картридере работает...
Сунул MMC-Mikro результат тот же…
QuickWitted
С задержками разобрался...
Далее вопрос как инициализировать карты MMCmicro ?
после запуска с той-же инициализацией считать с неё получается только статус...

Как проверять может ли карта выдавать данные при чтении?
В оригинале было при CMD17 = read block контролировали
ответ 0xFE, а приходит 0xFC

при отключении проверок и случайной ошибке во вводе
вешается карточка...
SALOME
Цитата(QuickWitted @ Jul 14 2007, 23:33) *
С задержками разобрался...
Далее вопрос как инициализировать карты MMCmicro ?

Как проверять может ли карта выдавать данные при чтении?
В оригинале было при CMD17 = read block контролировали
ответ 0xFE, а приходит 0xFC

при отключении проверок и случайной ошибке во вводе
вешается карточка...

Не знаю точно, но наверное Micro - это просто другой корпус.
При чтении блока надо обязательно дождаться 0xFE - это маркер. После него пойдет собственно блок данных. По умолчанию он=512 байт.
Действий по отключению проверок что-то не догоняю smile.gif
QuickWitted
Цитата(SALOME @ Jul 16 2007, 08:55) *
При чтении блока надо обязательно дождаться 0xFE - это маркер.

Одно но ОН не приходит sad.gif вместо него 0хFC

ldi R20_Arg1,0x11 ; CMD17 = read block
rcall SPISendC

rcall SPIReadOtvet ; Прочтём ответ

tst R0_Vozv ; Проверим считалось ли?
breq PC+2
rjmp MMCErrRed1 ; Ошибка при чтении 1

rcall SPIReadOtvet
mov R16_Tmp1,R0_Vozv


; Здесь проблема - приходит 0xFC вместо 0xFE

; cpi R16_Tmp1,0xFE ; Признак данных ?
; breq PC+2
; rjmp MMCErrRed2 ; Ошибка при чтении 2


Цитата
Действий по отключению проверок что-то не догоняю smile.gif

Если отключить проверку (просто заремил 3 строки выше)
на 0xFE (вместо него наблюдается 0хFC) - работает,
но при ошибке ввода - (с клавы через терминал адрес задаю)
вместо Error имеем повисание карточки sad.gif
(Т.е. не адекватное поведение)

А в целом всё работает (С картой 32метра)
Т.е. я считал тестовый 32 мегабайтный файл
(содержащий 00000001:00000002...) записанный с картридера...

Цитата
Не знаю точно, но наверное Micro - это просто другой корпус.

Да, но он с адаптером (под стандартный) и размером 512мб
Подозреваю он имеет др. инициализацию...
Вообще вы с какой карточкой работаете?

Я раритет в 32 метра ели нашёл - микро везде...
(просто в енете вычитал, что в зависимости от версии
они могут иметь разную систему команд, а мне стартануть надо
было – сейчас думаю про микро)

И доков у меня нет crying.gif
Задержки где и сколько должны быть?
если нетрудно дай ПРЯМОЙ урл к пдфке или кинь сюда...

Вот дока на MMCplus но это другое...
Нажмите для просмотра прикрепленного файла
jasper
Вот последняя версия:
http://www.sdcard.org/sd_memorycard/Simpli...ecification.PDF
QuickWitted
Цитата(jasper @ Jul 16 2007, 10:19) *


За спецификацию спасибо, но таймингов я там неувидел twak.gif

У меня огрызок есть, но в нём цифрового значения таймингов - нет...
В своей проге я действовал по схеме - догадайся сам и выстави от фонаря...
Но мне интересно минимальное их значение (умножу 1,25 и выставлю в проге)
Нажмите для просмотра прикрепленного файла
jasper
Здесь вроде было.
QuickWitted
Цитата(jasper @ Jul 16 2007, 11:26) *
Здесь вроде было.


Открыть картинку не могу (ст.3-8)...
у меня вместо картинки - пустота...

У тебя в верхней части картинка читается?

хотя если спросить гуглю, то
http://mipsa.p.lodz.pl/download/BazaWiedzy...-rs-mmcv1.0.pdf

но там по моему не всё...
1) какая задержка после 10 пустых байтов во время резета до перепада CS из 1 в 0 ?
2) какая после перепада CS из 1 в 0 и перед началом тактирования при чтении/записи?
jasper
Цитата
Открыть картинку не могу (ст.3-8)...
у меня вместо картинки - пустота...

Действительно. sad.gif

Цитата
но там по моему не всё...
1) какая задержка после 10 пустых байтов во время резета до перепада CS из 1 в 0 ?
2) какая после перепада CS из 1 в 0 и перед началом тактирования при чтении/записи?

Там в параграфе 5.7 времена расписаны.


ЗЫ: Вот еще дока.
QuickWitted
Народ как работать с MMCmicro?
(или датащит кто к ней нашёл)

Ну и в качестве подведения итогов....

У кого какие карточки получилось запустить?

У меня MMC 32мб. Схему смотри выше...
Подозреваю (исходя из датащита) с этим алгоритмом будут работать карты от 8 до 128 мб...
Карта MMCmicro 512Мб по этому алгоритму инициализацию проходит, но читаться отказывается...
(впрочем статус считать получается)
Angelborn
Цитата(QuickWitted @ Jul 17 2007, 06:25) *
Народ как работать с MMCmicro?
(или датащит кто к ней нашёл)

Ну и в качестве подведения итогов....

У кого какие карточки получилось запустить?

У меня MMC 32мб. Схему смотри выше...
Подозреваю (исходя из датащита) с этим алгоритмом будут работать карты от 8 до 128 мб...
Карта MMCmicro 512Мб по этому алгоритму инициализацию проходит, но читаться отказывается...
(впрочем статус считать получается)


Высылаю тебе алгоритм работы с MMC, который мне здорово помог при написании моей программы. Кстати её ещё нужно корректировать, т.к. с быстродействием сильный напряг.
У AT89C2051 с кварцем на 11 МГц звук получается 8 кГц. А с кварцем на 20 МГц 22 кГц, что уже очень неплохо. ЦАП поставлю 8 bit, скорее всего DAC7513 (12 bit, просто был под рукой).

Выслал мне этот алгоритм один хороший человек. Кстати, написан он на Algoritm Bilder, для начала лучше ознакомится с его схемами.
QuickWitted
Цитата(Angelborn @ Jul 17 2007, 10:46) *
Высылаю тебе алгоритм работы с MMC, который мне здорово помог при написании моей программы. Кстати, написан он на Algoritm Bilder.


Мысль раз - Algoritm Bilder тот что я скачал в прошлом месяце работает только под АВР
Мысль два - на картинке что прислал ты про численное значение задержек ни слова...
Мысль три - набор инструкций скаченный с FinalProjekt'а у меня у самого есть,
одно но - кривой он. Я как раз его доделываю…
Мысль четыре - о последовательности команд твой пример не даёт ни
малейшего представления...

Цитата
Кстати её ещё нужно корректировать, т.к. с быстродействием сильный напряг.

выше я тоже не окончательный вариант выкладывал...

как вариант переходи на АВР.
Мой алгоритм с описанием и схемой валяется выше…
Если интересно поясню что и как…
(сам до этого проекта на 51 серии работал – пока не понял,
что для его реализации производительности не хватит…)

Если не трудно дай посмотреть твой вариант как есть...

Цитата
для начала лучше ознакомится с его схемами.

ничего нового...

У тебя с какими карточками получалось работать?
По какой схеме включены?


Вот под SD на пике и бейсике, но с описанием
http://www.compsys1.com/support/PBP_Files/mmc/mmc_demo.bas
Angelborn
Цитата(QuickWitted @ Jul 17 2007, 11:09) *
Мысль раз - Algoritm Bilder тот что я скачал в прошлом месяце работает только под АВР
Мысль два - на картинке что прислал ты про численное значение задержек ни слова...


Где ты видел хоть какое-то упоминание о задержке? В этом алгоритме есть слово "delay"?
Карта - очень шустрое устройство, у меня прекрасно без задержек работает на 1 МГц, больше пока нет времени попробовать, но точно придётся, я уже писал.
Насчёт конструкции на AVR особо не напрягайся! Уже давно придумали очень неплохое решение на 32-ой меге, сам не повторял, но с исходником ознакомился.
http://pol-sem.narod.ru/polymuson/polymuson.htm

А последовательность команд описана SALOME в этой теме на 1 стр, не читал, правда? Придётся повторить:
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. Увеличить скорость обмена

У меня лично последовательность такая CMD0-CMD1-CMD18....... т.е. непрерывное чтение блоков.

Вполне возможно, что подкачало твоё железо.
Лично я собрал переходник между 5 и 3.3 В следующим способом:
Взял 244-буфер M74HC244b1, запитал его от 3,3В (с 5 стабилизатор IRU101033).
Ноги CS, DI, CLK карточки соединил с выходами буфера, соответствующие ноги проца через резисторы 100-200 Ом на входы буфера. DO через буфер без резисторов. 8 и 9 ноги через 2 резистора 10-100 кОм подтянул на +3,3В. Схемы нет, но она и так до ужаса простецкая.
Если умеешь писать на VB, могу прислать исходник для компа, для проверки карточки по LPT. Там всё до ужаса просто.
Удачи!
QuickWitted
Цитата(Angelborn @ Jul 18 2007, 02:02) *
Где ты видел хоть какое-то упоминание о задержке? В этом алгоритме есть слово "delay"?
Карта - очень шустрое устройство, у меня прекрасно без задержек работает на 1 МГц, больше пока нет времени попробовать, но точно придётся, я уже писал.


Без задержек при 2х мегах она даже инициализироваться не хочет sad.gif
(это была основная причина почему у меня не работало...)

Цитата
Насчёт конструкции на AVR особо не напрягайся! Уже давно придумали очень неплохое решение на 32-ой меге, сам не повторял, но с исходником ознакомился.
http://pol-sem.narod.ru/polymuson/polymuson.htm


Мне асемблер ближе...

Цитата
А последовательность команд описана SALOME в этой теме на 1 стр, не читал, правда? Придётся повторить:


Повторяй, не повторяй а с картами более 128 метров всё равно не работает smile.gif
правильней сказать при команде сет блок показывает кукиш twak.gif
и на резет отвечает 00h

(Уточню: У МЕНЯ на карте 32метра только признак данных не по мануалу, а всё остальное РАБОТАЕТ.)

Ладно повторю вопрос: КАК РАБОТАТЬ С ММСмикро ?
или задержки у меня маленькие/большие или последовательность команд не та...

ВОПРОС2: У кого есть датащит на микро? поделитесь плиз...

ВОПРОС3: Если у вас с картами большого объема и/или MMCмикро удалось стартануть поясните последовательность команд...

Цитата
Вполне возможно, что подкачало твоё железо.
Лично я собрал переходник между 5 и 3.3 В следующим способом:
Схемы нет, но она и так до ужаса простецкая.


Моя схема, прошивка и описание выше в архиве...
ЗЫ. прошивка старая без задержек...
посмотри что-ли...

А то сам с собой разговариваю и некто меня не слышит crying.gif
jasper
Цитата
ВОПРОС2: У кого есть датащит на микро? поделитесь плиз...

Немного правда.
SALOME
Цитата(QuickWitted @ Jul 18 2007, 11:30) *
(Уточню: У МЕНЯ на карте 32метра только признак данных не по мануалу, а всё остальное РАБОТАЕТ.)
Ладно повторю вопрос: КАК РАБОТАТЬ С ММСмикро ?

Ну а если все РАБОТАЕТ, то чего хотите от нас? Если у Вас не тот "признак", а данные правильные, то чем Вы так обеспокоены? Юзайте эту свою странную карту на здоровье.. smile.gif и забудтьте про признаки.
А лучше попробуйте другую карту. Рискну предположить, что ЭТА карта, во первых явно старая (давно уже таких в продаже нет) и кроме того вы ее основательно зачухали своими экспериментами smile.gif
QuickWitted
Цитата(SALOME @ Jul 18 2007, 11:32) *
Ну а если все РАБОТАЕТ, то чего хотите от нас? Если у Вас не тот "признак", а данные правильные, то чем Вы так обеспокоены?
Юзайте эту свою странную карту на здоровье.. smile.gif


Ковыряя чужой исходник откопал:

; SD_START_TOKEN 0xFE
; SD_MULTI_START 0xFC

Одно но, концы их растут из библиотеке и далее не совсем понятно...

Цитата
А лучше попробуйте другую карту.


Пришли к тому от чего начали...

КАК работать с MMCмикро?

ДРУГИХ У НАС НЕ ПРОДАЮТ...
(правда ещё можно плюсы поискать, но микро есть в наличии)

Цитата
Рискну предположить, что ЭТА карта, во первых явно старая (давно уже таких в продаже нет) и кроме того вы ее основательно зачухали своими экспериментами smile.gif


Идёт в стандартной поставке с сот телефонами...
так что новая...


Цитата(jasper @ Jul 18 2007, 10:42) *
Немного правда.


За спецификацию низкоуровневого (эл. протакола) спасибо...
Мне бы логический... типа как инициализировать и т.д.

Нечто вроде нащупал:
http://www.samsung.com/global/business/sem...note_200606.pdf
Angelborn
Цитата(QuickWitted @ Jul 18 2007, 07:30) *
правильней сказать при команде сет блок показывает кукиш twak.gif


А чем тебя блок 512 байт не устраивает? Пробовал не посылать сет блок? Я с твоим исходником не ознакамливался, большой дифицит времени (2работы). Так что за недопонимание ситуации прости, если что.
Я, дабы не колупаться зря, купил себе картридер, простенький такой, у нас в конфискате стоит 35 грн (180руб). После истязаний сую в него карту и если всё ОК то продолжаю пытки. А неделю возится с подгоревшей картой - уж звиняйте, не по мне wacko.gif .
QuickWitted
Цитата(Angelborn @ Jul 18 2007, 12:16) *
А чем тебя блок 512 байт не устраивает? Пробовал не посылать сет блок?


пока нет... раньше он не отключался - щас перехожу на модульную схему программирования...
(каждый кусок в своей процедуре) тогда можно будит и попробовать...
(напомню - ковыряю чужой исходник)

Цитата
Я, дабы не колупаться зря, купил себе картридер, если всё ОК то продолжаю пытки.

Аналогично (через него и залил тестовый файл)

Цитата
А неделю возится с подгоревшей картой - уж звиняйте, не по мне


Карта 32мб пока работает, про не тот ответ смотри выше...

А доку на новые карточки нужно...
Тут немного есть (приводил выше), и становится ясно что работать надо по другому
с большими картами...

http://www.samsung.com/global/business/sem...note_200606.pdf


У меня не получается считать с Nного байта (на карте в 32 метра)
т.е. в CMD17 удаётся установить только адрес блока...
Пример - 00 04 50 00 – начало первого файла

при попытке изменения последних 3 нулей - повисание карточки...
(проверку на данные я же отключил)

но мне и не надо - читаю блоками по 512... но все таки...
(есно значение блока при попытке было минимальным и за границу блоков не цепляло)
Angelborn
Странное дело, конечно... Я CMD16 не посылал, тем самым оставив 512 байт блока. А в аргументе CMD17 или CMD18 у меня последние нули, т.е. например 00 04 10 00. Если поменять последние нули, то вылезет ошибка о границе блока.
QuickWitted
Цитата(Angelborn @ Jul 18 2007, 13:18) *
Странное дело, конечно... Я CMD16 не посылал, тем самым оставив 512 байт блока. А в аргументе CMD17 или CMD18 у меня последние нули, т.е. например 00 04 10 00. Если поменять последние нули, то вылезет ошибка о границе блока.


Где то читал что не все карточки держат побайтовую адресацию...
Так у кого работает?

А про 512 по умолчанию это не для всех...

Из датащита:

Block length = 512byte
Card Density = 4096 * 512 * 512 = 1Gbyte

Block length = 2048byte
Card Density = 4096 * 512 * 2048 = 4Gbyte
Angelborn
Цитата(QuickWitted @ Jul 18 2007, 11:46) *
Где то читал что не все карточки держат побайтовую адресацию...
Так у кого работает?

А про 512 по умолчанию это не для всех...


Значит, мне просто повезло. карточка на 64 М, в начале темы описана.
QuickWitted
Цитата
А чем тебя блок 512 байт не устраивает? Пробовал не посылать сет блок?


Вчера попробовал не посылать сет блок (CMD16) на ММСмикро 512Мб - вылетает с ошибкой чтения...
т.е. ругается на команду чтения... Последовательность CMD0 CMD1 CMD17
тут по моему что-то с инициализацией (т.к. кроме как на статус она не на что не отвечает).....

(Карта 32Мб без команды CMD16 по умолчанию имеет длину блока 512 и на
последовательность команд CMD0 CMD1 CMD17 отдаёт блок - Т.Е. РАБОТАЕТ)

НУ И ЕЩЁ РАЗ СПРОШУ:
У КОГО ЕСТЬ ДОКА НА КОМАНДЫ ММСмикро?

Последовательность команд для карт ММС 8-128Мб с ММСмикро 512Мб НЕ РАБОТАЕТ!!!
QuickWitted
Может кому понадобится...

На скору руку мной нацарапанная утилита для создания индексных
текстовых файлов для тестового чтения с флешки...
(т.е файл создаёт с цифрами 00000001: и до заданного размера файла)

Нажмите для просмотра прикрепленного файла

удобно тем, что по прочитанному можно проконтролировать положение
знакоместа и правильность чтения…


кто СИ знает гляньте:
http://www.nxp.com/acrobat_download/applic...s/AN10406_3.pdf

или тут прилепил Нажмите для просмотра прикрепленного файла

Рекомендации по работе с ММС по SPI
датировано 2007

Они их поменяли по сравнению с 2005 годом (AN10406_2.pdf)
oll
"Последовательность команд для карт ММС 8-128Мб с ММСмикро 512Мб НЕ РАБОТАЕТ!!!"

Случайно наткнулся на этот топик - редко захожу.
У меня работает одна и та же последовательность команд (CMD0 CMD1 CMD17) одинаково и для SD 32Mb и microSD 512mB GoodRam, пробовал и SunDisk 512Mb - тоже работает. Только SunDisk дольше по времени уходит в sleep. Работает с Mega48, аппаратный SPI не использовал (неудобно вышло по ногам), реализовано программно по алгоритму, который высылал для Angelborn, написанный на Algoritm Bilder. В начале все отрабатывал на ЛПТ порту.
Angelborn
Цитата(oll @ Jul 19 2007, 19:52) *
"Последовательность команд для карт ММС 8-128Мб с ММСмикро 512Мб НЕ РАБОТАЕТ!!!"

Случайно наткнулся на этот топик - редко захожу.
У меня работает одна и та же последовательность команд (CMD0 CMD1 CMD17) одинаково и для SD 32Mb и microSD 512mB GoodRam, пробовал и SunDisk 512Mb - тоже работает. Только SunDisk дольше по времени уходит в sleep. Работает с Mega48, аппаратный SPI не использовал (неудобно вышло по ногам), реализовано программно по алгоритму, который высылал для Angelborn, написанный на Algoritm Bilder. В начале все отрабатывал на ЛПТ порту.


За который кстати, спасибо! У меня уже есть своя прога на VB, читает блок 512 байт, а также CSD и CID. Ну и инициализация само собой.
QuickWitted
Цитата(oll @ Jul 19 2007, 21:52) *
"Последовательность команд для карт ММС 8-128Мб с ММСмикро 512Мб НЕ РАБОТАЕТ!!!"
Случайно наткнулся на этот топик - редко захожу.
У меня работает одна и та же последовательность команд (CMD0 CMD1 CMD17) одинаково и для SD 32Mb и microSD 512mB GoodRam, пробовал и SunDisk 512Mb - тоже работает.


1) Тактовая на SPI какая ?
(какой кварц?)
(у меня на частоте под 3 Мгц (кварц 16,5888) потребовались задержки, а в твоей версии их нет...)
(в оригинальной версии их тоже не было, но там частота на SPI была 0,75 Мгц (кварц 4,000) )

1) Выше приводили инициализацию на SD:
[SALOME]
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.[/SALOME]

а у тебя она немного другая... (точнее как у MMC)
"SD" в твоём топике это не опечатка?

Сам вопросы задаю...
сам отвечаю sad.gif

Цитата
Max_Shaman
Спецификация гласит что так называемый TOKEN "синхронизирующий бит начала передачи", может появляться в любой момент тактов ожидания ответа, то-есть он может быть не кратен 8-ми циклам.
Решение проблемы: надо отлавливаить не код "FE" , а всего-лишь первый нулевой бит, и по нему уже синхронизироваться, он может появляется в любое время а не так как вы его ожидаете.
Я в интернете на зарубежных форумнаходил исходники с подобным неправильным способом работы с карточкой и так-же жалобы на неспособность работы некоторых карточек от некоторых производителей.
Поэтому пришлось написать полность свои функции. С обработкой токенов-ответов на разные там ошибки карты. Карточки с которыми я работал вот такие: APACER 512Mb, Kingston 1G, Transced 2G и пару каких-то неизвестных ( 5 вольтовых )производителей. И никаких проблем.
Написал функции обработки информационных структур (CCD, SCD - по моему их так зовут), для определения размерности карты и максимального рабочего пакета, без обработки этих структур в которых присутствует информация о максимальных размерах: входном пакете записи и пакете чтения.
Так же перед работой карточки надо установить командами размерность пакета, это как за правило.
Еще, можно пересекать границы адресов, но только не адресов которые кратны максимально заявленного размера блока передачи текущей карты.

Я думаю Вам надо переписать код, для того чтобы синхронизировать работу вашего SPI в микроконтролере Вы должны написать чисто програмный отлавливатель первого нулевого бита. Тогда у Вас не будут проблемы с несовместимостью Вашего устройства с карточками.

```````````````````````````````````````
Тогда получается если 0 бит будет в середине(апаратный SPI) допустим 4й бит, то все данные за ним нужно подвинуть на 4 влево? Тогда и вправду нада програмный SPI ...
```````````````````````````````````````
Однозначно.
Почитай мануал с самсунга, поймешь что я не шучу.
Там есть так называемый на графиках обмена, период ожидания ( Ncr ) - и может принимать значение от 1 до 8, но обычное заявленное значение равно 8. В других мануалах максимальное значение и того больше.
И самое главное, обязательно: если будешь применять команды записи или чтения, то предварительно примени команду SET_BLOCKLEN (она же CMD16), с параметром удобного для тебя размером блока, но не больше заявленого в CSD.WRITE_BLK_LEN. И при чтении не пересекай адреса через границы кратные размерности CSD.WRITE_BLK_LEN или CSD.READ_BL_LEN.
```````````````````````````````````````
чего тут непонятного? NCR может быть равным от 1 до 8 байт а не бит как вы вероятно думаете
oll
1) Тактовая на SPI какая ?
(какой кварц?)

*Mega48 с внутренним генератором на 8мГц, питание 3.6В, никаких задержек не делал.

1) Выше приводили инициализацию на SD:
[SALOME]
1.Переход на SPI протокол (инициализация):
- после подачи питания: Fclk<400KHz; синхронизация и сдвиг бита по переднему
нарастающему фронту, пассивный уровень CLK -0;
- не подавая CS=0, оправить по SPI 10 пустых байт;

*у меня 74+8 CLK (CS,SI в "1") как в http://elm-chan.org/docs/mmc/mmc_e.html

- подать команду CMD0 (сброс) и получить отклик 0х01. Bit_7=0 означает, что карта
откликнулась, Bit_0=1 - находится в спячке. Режим SPI сохранится до выключения питания.

*тут в начале я делал команду CMD0 один раз и ждал пока в ответе Bit_0 станет "0", но при отработке на ЛПТ оказалось "надежнее", но наверное не правильнее, подавать команду снова и снова пока не получим правильный отклик.

2.Активизация карты в SPI режиме:
- подать CMD8 с аргументом пит. напряжения и емкости карты. Если в отклике эта команда
допустима (Bit_2=0), то карта ver2.00 и выше и она по напряжению совместима. Далее ее
следует вывести из спячки командой CMD41 и проверить емкость CMD58.
-если отклик R1 на CMD8 неверен, то применить ACMD41. Если карта не выходит из спячки,
то это не SD_карта.

*эти команды не использовал

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

*в указанном выше документе CMD1 применима и к SD и к MMC

а у тебя она немного другая... (точнее как у MMC)
"SD" в твоём топике это не опечатка?

*MMC у меня нет ни одной
QuickWitted
Теперь вопрос, а что с хардварным SPI на асме делать?
На софтовом - понятно, а с хардой?

Пока работаю с софтовым, но все таки...

Проблема вкратце: Ответ от карты может начинаться не с начала байта... где первый ноль там начало...
(подробно - читай выше)
SALOME
Цитата(QuickWitted @ Jul 23 2007, 10:44) *
Теперь вопрос, а что с хардварным SPI на асме делать?
На софтовом - понятно, а с хардой?

Не понятно, что подразумевается под хардварным и софтовым SPI? В чем тут разница?
Кстати, специально купили карту MMCmicro. Все работает так же как и с обычной ММС
QuickWitted
Цитата(SALOME @ Jul 23 2007, 13:49) *
Не понятно, что подразумевается под хардварным и софтовым SPI? В чем тут разница?


Софтовый алгоритм написан командами выдать в ногу порта/считать с ноги порта бит...
Хардварный (читай аппаратный) - выдвинул байт по адресу во внутренней памяти и он сам передаётся
с прерыванием по окончанию

Софтовый может работать на MK без аппаратного SPI

Цитата
Кстати, специально купили карту MMCmicro. Все работает так же как и с обычной ММС


Одно НО не для всех карт !!!

Повторно привожу цитату:
Цитата
Max_Shaman
Спецификация гласит что так называемый TOKEN "синхронизирующий бит начала передачи", может появляться в любой момент тактов ожидания ответа, то-есть он может быть не кратен 8-ми циклам.
Решение проблемы: надо отлавливаить не код "FE" , а всего-лишь первый нулевой бит, и по нему уже синхронизироваться, он может появляется в любое время а не так как вы его ожидаете.
Я в интернете на зарубежных форумах находил исходники с подобным неправильным способом работы с карточкой и также жалобы на неспособность работы некоторых карточек от некоторых производителей.


И повторно задаю вопрос: Как к этому прикрутить хардварный SPI?
(И простым языком: как пояснить МК что начало передачи сдвинулось и лежит в середине байта,
а хвост байта ещё не принят?)
SALOME
Цитата(QuickWitted @ Jul 23 2007, 16:29) *
как пояснить МК что начало передачи сдвинулось и лежит в середине байта,
а хвост байта ещё не принят?)

Если используется "on chip SPI" то все объяснения происходят при инциализации порта SPI. Вот пример для ADuC845:
MOV SPICON,#00110010b ;Initialise SPICON
; |||!||++-SPR0,1-частота тактовых SCLK=core/8
; |||!|+---CPHA=0 фаза: вначале бит DATA, потом в середине бит SCLK
; |||!+----CPOL=0,полярность тактов SCLK - неактивный уровень - ноль
; |||+-----SPIM=1 master mode select
; ||+------SPE=1 Enable SPI serial port
; |+-------WCOL=0 ERROR write
; +--------SPI Inerrupt flag
комментарий надо сдвинуть вправо до решетки #...
QuickWitted
Цитата(SALOME @ Jul 24 2007, 08:00) *
Если используется "on chip SPI" то все объяснения происходят при инциализации порта SPI.

Вы меня не поняли...

Карта даёт ответ В СЕРЕДИНЕ БАЙТА, и где первый бит отличный от ЕДИНИЦЫ, там и начало байта.
Вопрос КАК ЭТО ОБЬЯСНИТЬ МК?
Т.е. фактически надо произвести дополнительное тактирование и принять хвост байта...
далее опять принимать по целому байту...

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

Кто уже решал и решил эту задачу?
SALOME
Цитата(QuickWitted @ Jul 24 2007, 11:39) *
Карта даёт ответ В СЕРЕДИНЕ БАЙТА, и где первый бит отличный от ЕДИНИЦЫ, там и начало байта.
Вопрос КАК ЭТО ОБЬЯСНИТЬ МК?

С чего вы это взяли? Любое устройство, работающее в SPI выдает информацию (т.е. биты DATA) только при получении тактовых импульсов SCLK ( один бит DATA на один такт SCLK) и никак она не может "начать давать ответ" в середине байта. А то, про что вы говорите "где первый бит отличный от ЕДИНИЦЫ, там и начало байта", похоже на UART. Посмотрите все процессы по 2-х канальному осцилу, а иначе не будет Вам щастья smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.