|
Проблема с SD картой, Подключение карт к 5В питанию. Кто плавал, посоветуйте. |
|
|
|
Jul 3 2007, 17:30
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 12-06-07
Пользователь №: 28 387

|
Вобщем эту тему можно было и не открывать, рядом есть такая же, но тут другой вопрос рассматривается. Думаю, модераторы форума меня поймут.
Суть проблемы в том, что карта 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, но суть дела не меняет). Там всё идёт. В реальной схеме проц виснет на инициализации.
Предположительно - ошибка в реальном железе, а именно в уровнях напряжений. Если кто знает - подскажите, где может быть подвох.
|
|
|
|
|
 |
Ответов
(1 - 99)
|
Jul 5 2007, 08:09
|
Частый гость
 
Группа: Свой
Сообщений: 170
Регистрация: 11-05-07
Пользователь №: 27 656

|
Цитата(Angelborn @ Jul 3 2007, 20:30)  Делители для DI, CS и CLK - сверху 2,4 кОм, снизу 4,7 кОм А почему бы не сделать выход с открытым коллектором и подтянуть резисторами к + 3V3.
|
|
|
|
|
Jul 5 2007, 08:33
|
Частый гость
 
Группа: Новичок
Сообщений: 84
Регистрация: 24-05-07
Пользователь №: 27 947

|
Цитата(Angelborn @ Jul 3 2007, 21:30)  Ноги 8 и 9 карты висят в воздухе. Так делать нельзя. Неиспользуемые линии данных нужно подтянуть к питанию, иначе могут быть проблемы. Цитата(Angelborn @ Jul 3 2007, 21:30)  Прошивка отлажена и проверена в Proteuse (там правда MMC, но суть дела не меняет). Там всё идёт. В реальной схеме проц виснет на инициализации. Меняет: инициализация SD и MMC отличается. На чем именно зацикливается инициализация?
|
|
|
|
|
Jul 5 2007, 09:28
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(Angelborn @ Jul 4 2007, 00:30)  В софте ошибок быть не может. Прошивка отлажена и проверена в Proteuse (там правда MMC, но суть дела не меняет). Там всё идёт. В реальной схеме проц виснет на инициализации. Ну во первых, напряжение питание и напряжение уровней остальных выводов SPI должны быть одинаковы и в пределах 2,0 - 3,6В. Не буду утверждать, но 5В это многовато, хотя бывает и толейрантно (про это в datasheet). Во вторых, ММС и SD (особенно больших объемов памяти) все таки отличаются по протоколам инициализации. Надо смотреть свежий datasheet.
Сообщение отредактировал SALOME - Jul 5 2007, 09:32
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
Jul 5 2007, 19:43
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 12-06-07
Пользователь №: 28 387

|
Цитата(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 (с си++ как-то не сложилось  ), чтобы инициализировать карту напрямую. Если не заработает, буду "терзать железо", а именно подтягивать выводы, уменьшать напряжение питания и т.д. А, да, кстати. К LPT буду подключать с помощью STK200 на 244-ом буфере, спаял его когда-то для программирования AVR. Сначала с помощью тех-же делителей с +5В, а если не поможет, то снижу напряжение питания до 3.3 В. Цитата(a3r3 @ Jul 5 2007, 11:33)  Меняет: инициализация SD и MMC отличается. На чем именно зацикливается инициализация? Насколько я знаю, инициализация SD и MMC в режиме SPI ничем не отличается. Если я не прав - поправьте меня, дайте ссылку на соотв. доку. Ещё выяснил, что модель карты MMC в Proteuse настолько добрая, что работает даже без инициализации карты  Отложил свой Proteus в сторону до лучших времён!
|
|
|
|
|
Jul 6 2007, 09:49
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(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. Увеличить скорость обмена
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
Jul 6 2007, 18:19
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 12-06-07
Пользователь №: 28 387

|
Цитата(SALOME @ Jul 6 2007, 12:49)  Инциализация FLASH_SD карты по протоколу SPI Вот я сегодня и проколупался зря. Карточка CMD_0 сьела и "заснула". CMD_1 слать смысла нет. Теперь вот пришёл с работы и почитал свою ветку. Оказывается различается протокол! Спасибо SALOME, за то, что пролили свет. SALOME, если вам не трудно, дайте ссылку на полный документ по инициализации именно SD-карты (т.е. тот, который легче всего освоить). Я тут поскачивал pdf-ок, но всё как-то не то.
|
|
|
|
|
Jul 7 2007, 07:23
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(Angelborn @ Jul 7 2007, 01:19)  SALOME, если вам не трудно, дайте ссылку на полный документ по инициализации именно SD-карты (т.е. тот, который легче всего освоить). Я тут поскачивал pdf-ок, но всё как-то не то. Для ММС можно больше практических примеров найти. Кстати причиной колупания может быть и не вполне исправная карта, извините за банальность. У меня такое было. Т.е. что-то принимает, а что-то нет. http://www.sdcard.org/http://www.sandisk.com/Oem/Manuals/
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
Jul 9 2007, 21:04
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 12-06-07
Пользователь №: 28 387

|
Спасибо ребята, всем, кто помог! У меня всё получилось, точнее в рамках той задачи, которую я пока перед собой ставил. Сначала подключил карту к LPT, написал прогу на VB и меня снова ожидали те же грабли: оказалось причина очень банальна. Я ждал после CMD0 ответа "0", а нужно было ждать "1". Но в VB гораздо легче отладить прогу, чем в 2051, в котором нет внутрисхемной отладки. Следующим шагом была написана прошивка для AT89C2051, читает блок 512 байт и посылает по UART. Рабочая. Уже гонялась. Пол-дела сделано! Осталось дописать блок, отвечающий за ЦАП (это будет либо 8bit R-2R, либо микросхема ЦАП). Там будет слаться команда CMD18 и бесконечное считывание данных. Всё висит в голове, а времени снова нету... И тогда чудище, под названием "Wav-плейер на AT89C2051" будет готово. Когда получится - выложу схему и исходники. P.S. Знаю, что сумашедший P.S. А карточка моя оказывается легко откликается на CMD0 и CMD1, видимо старого образца.
|
|
|
|
|
Jul 13 2007, 11:09
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
В своей конструкции я столкнулся с подобными проблемами - ОСНОВНАЯ из которых - ПОЧЕМУ не работает? В основу положил готовую версию программы на ассемблере под 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 , если её заремить оно читает, но возвращает все нули... В файле схема, исходник и дока... [attachment=12453:attachment]
Сообщение отредактировал QuickWitted - Jul 13 2007, 11:11
--------------------
|
|
|
|
|
Jul 13 2007, 11:30
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(QuickWitted @ Jul 13 2007, 18:09)  В своей конструкции я столкнулся с подобными проблемами - ОСНОВНАЯ из которых - ПОЧЕМУ не работает?  Проблема не нова. И не так уж проста эта FLASH карта. Я сейчас делаю на ADuC для MMC. Выкладываю кость, может она Вас развлечет. На вопросы отвечу...
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
Jul 13 2007, 11:48
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(SALOME @ Jul 13 2007, 16:30)  На вопросы отвечу... Я использовал готовый исходник... там ответ един 01 ; Отправляет CMD0.Принимает отклик R1.Возвращает код отклика R1. ; Исправная карта всегда откликнется. При этом FLASH_SD может находится в спячке поэтому вопрос откликаться чем? куда не смотрел 01 а у меня 3F? Что можно покрутить? что не так делаю? У меня за это отвечает подпрограмма SPIInit в файле S_SPI.asm
--------------------
|
|
|
|
|
Jul 13 2007, 12:12
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(QuickWitted @ Jul 13 2007, 18:48)  поэтому вопрос откликаться чем? куда не смотрел 01 а у меня 3F? Ну не обзательно в отклике R1 на команду CMD0 должно быть 01. Главное, чтобы бит7=0...Так, что у вас все нормально  . Этим вы перевели ее в режим обмена по SPI. Обратите внимание, что в CMD0 последний байт команды равен 0х95, а у всех других команд - 0xFF. Дальше карту надо инициировать (разбудить). Для этого посылаем команду CMD1. Вот здесь надо дождаться R1=0x00. Отклик R1 приходит не сразу, ну и далее смотрите мой исходник... Успехов. Я убежала....
Сообщение отредактировал SALOME - Jul 13 2007, 12:16
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
Jul 14 2007, 03:35
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(SALOME @ Jul 13 2007, 17:12)  Ну не обзательно в отклике 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 чтение не работает что я не так делаю? Если тебе не трудно укажи прямой линк к дадащитам...
--------------------
|
|
|
|
|
Jul 14 2007, 05:04
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(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 раз, пока не появится отклик. Даташит смотрите выше.
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
Jul 14 2007, 09:02
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(SALOME @ Jul 14 2007, 10:04)  Дальше карту надо инициировать (разбудить). Для этого посылаем команду CMD1. Вот здесь надо дождаться R1=0x00. Отклик R1 приходит не сразу, ну и далее смотрите мой исходник... Еще раз напоминаю, что команду CMD1 следует повторить не менее 100 раз, пока не появится отклик. Отловил пару глюков в исходном тексте, откопал плохую пайку сопротивления 47к CMD0 - начала правильно отвечать 01h (до этого глючило из-за сопротивления) Легче не стало CMD1 проходить не хочет (отправляю 256х128 раз ну и?) Стало интересно - как CRC считается? Цитата Даташит смотрите выше. там их много – какой именно? А лучше если не трудно закиньте сюда…
--------------------
|
|
|
|
|
Jul 14 2007, 14:23
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата При работе в SPI контрольная сумма не высчитается, а этот байт играет другую роль. Под FF переделал. При CMD0 – 95 в остальных FF Цитата Причины, почему не просыпается Ваша карта после CMD1. (Надеюсь, что осцилом вы смотрите на все происходящее у вас на линиях SPI?) Цифрового нет – а так смотрю... плюс использую для дебагинга RS-232 Цитата Неправильно настроен интерфейс SPI (не совпадает фаза, полярность, скорость) Он софтовый (не харда) В исходном примере он же В ТЕОРИИ работал… (если верить автору сайта) хотя по кол-во найденных мной ляпов я потихоньку начинаю сомневаться... Т.к. он использует вывод только в 1 месте, то в будущем (после запуска) перейду на харду... Цитата Не посылаете пустой байт перед отправкой команды посылается Цитата Не соблюдаете задержку Ncr при получении отклика R1 Вроде есть, но уточню: Сколько она должна быть? Где должна стоять? Цитата У Вас ММС карта живая, но неисправная карта и т.д. Это как - чуть-чуть беременна? В картридере работает... Сунул MMC-Mikro результат тот же…
--------------------
|
|
|
|
|
Jul 16 2007, 03:55
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(QuickWitted @ Jul 14 2007, 23:33)  С задержками разобрался... Далее вопрос как инициализировать карты MMCmicro ?
Как проверять может ли карта выдавать данные при чтении? В оригинале было при CMD17 = read block контролировали ответ 0xFE, а приходит 0xFC
при отключении проверок и случайной ошибке во вводе вешается карточка... Не знаю точно, но наверное Micro - это просто другой корпус. При чтении блока надо обязательно дождаться 0xFE - это маркер. После него пойдет собственно блок данных. По умолчанию он=512 байт. Действий по отключению проверок что-то не догоняю
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
Jul 16 2007, 04:58
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(SALOME @ Jul 16 2007, 08:55)  При чтении блока надо обязательно дождаться 0xFE - это маркер. Одно но ОН не приходит  вместо него 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 Цитата Действий по отключению проверок что-то не догоняю  Если отключить проверку (просто заремил 3 строки выше) на 0xFE (вместо него наблюдается 0хFC) - работает, но при ошибке ввода - (с клавы через терминал адрес задаю) вместо Error имеем повисание карточки (Т.е. не адекватное поведение) А в целом всё работает (С картой 32метра) Т.е. я считал тестовый 32 мегабайтный файл (содержащий 00000001:00000002...) записанный с картридера... Цитата Не знаю точно, но наверное Micro - это просто другой корпус. Да, но он с адаптером (под стандартный) и размером 512мб Подозреваю он имеет др. инициализацию... Вообще вы с какой карточкой работаете? Я раритет в 32 метра ели нашёл - микро везде... (просто в енете вычитал, что в зависимости от версии они могут иметь разную систему команд, а мне стартануть надо было – сейчас думаю про микро) И доков у меня нет Задержки где и сколько должны быть? если нетрудно дай ПРЯМОЙ урл к пдфке или кинь сюда... Вот дока на MMCplus но это другое... [attachment=12491:attachment]
--------------------
|
|
|
|
|
Jul 16 2007, 06:03
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(jasper @ Jul 16 2007, 10:19)  За спецификацию спасибо, но таймингов я там неувидел У меня огрызок есть, но в нём цифрового значения таймингов - нет... В своей проге я действовал по схеме - догадайся сам и выстави от фонаря... Но мне интересно минимальное их значение (умножу 1,25 и выставлю в проге) [attachment=12492:attachment]
--------------------
|
|
|
|
|
Jul 16 2007, 08:15
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(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 и перед началом тактирования при чтении/записи?
Сообщение отредактировал QuickWitted - Jul 16 2007, 08:35
--------------------
|
|
|
|
|
Jul 16 2007, 09:26
|

Народный чинитель
  
Группа: Участник
Сообщений: 415
Регистрация: 15-07-05
Пользователь №: 6 811

|
Цитата Открыть картинку не могу (ст.3-8)... у меня вместо картинки - пустота... Действительно.  Цитата но там по моему не всё... 1) какая задержка после 10 пустых байтов во время резета до перепада CS из 1 в 0 ? 2) какая после перепада CS из 1 в 0 и перед началом тактирования при чтении/записи? Там в параграфе 5.7 времена расписаны. ЗЫ: Вот еще дока.
|
|
|
|
|
Jul 17 2007, 05:46
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 12-06-07
Пользователь №: 28 387

|
Цитата(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, для начала лучше ознакомится с его схемами.
|
|
|
|
|
Jul 17 2007, 08:09
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(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
--------------------
|
|
|
|
|
Jul 17 2007, 21:02
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 12-06-07
Пользователь №: 28 387

|
Цитата(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. Там всё до ужаса просто. Удачи!
|
|
|
|
|
Jul 18 2007, 04:30
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(Angelborn @ Jul 18 2007, 02:02)  Где ты видел хоть какое-то упоминание о задержке? В этом алгоритме есть слово "delay"? Карта - очень шустрое устройство, у меня прекрасно без задержек работает на 1 МГц, больше пока нет времени попробовать, но точно придётся, я уже писал. Без задержек при 2х мегах она даже инициализироваться не хочет (это была основная причина почему у меня не работало...) Цитата Насчёт конструкции на AVR особо не напрягайся! Уже давно придумали очень неплохое решение на 32-ой меге, сам не повторял, но с исходником ознакомился. http://pol-sem.narod.ru/polymuson/polymuson.htmМне асемблер ближе... Цитата А последовательность команд описана SALOME в этой теме на 1 стр, не читал, правда? Придётся повторить: Повторяй, не повторяй а с картами более 128 метров всё равно не работает  правильней сказать при команде сет блок показывает кукиш и на резет отвечает 00h (Уточню: У МЕНЯ на карте 32метра только признак данных не по мануалу, а всё остальное РАБОТАЕТ.) Ладно повторю вопрос: КАК РАБОТАТЬ С ММСмикро ? или задержки у меня маленькие/большие или последовательность команд не та... ВОПРОС2: У кого есть датащит на микро? поделитесь плиз... ВОПРОС3: Если у вас с картами большого объема и/или MMCмикро удалось стартануть поясните последовательность команд... Цитата Вполне возможно, что подкачало твоё железо. Лично я собрал переходник между 5 и 3.3 В следующим способом: Схемы нет, но она и так до ужаса простецкая. Моя схема, прошивка и описание выше в архиве... ЗЫ. прошивка старая без задержек... посмотри что-ли... А то сам с собой разговариваю и некто меня не слышит
--------------------
|
|
|
|
|
Jul 18 2007, 05:42
|

Народный чинитель
  
Группа: Участник
Сообщений: 415
Регистрация: 15-07-05
Пользователь №: 6 811

|
Цитата ВОПРОС2: У кого есть датащит на микро? поделитесь плиз... Немного правда.
|
|
|
|
|
Jul 18 2007, 06:32
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(QuickWitted @ Jul 18 2007, 11:30)  (Уточню: У МЕНЯ на карте 32метра только признак данных не по мануалу, а всё остальное РАБОТАЕТ.) Ладно повторю вопрос: КАК РАБОТАТЬ С ММСмикро ? Ну а если все РАБОТАЕТ, то чего хотите от нас? Если у Вас не тот "признак", а данные правильные, то чем Вы так обеспокоены? Юзайте эту свою странную карту на здоровье..  и забудтьте про признаки. А лучше попробуйте другую карту. Рискну предположить, что ЭТА карта, во первых явно старая (давно уже таких в продаже нет) и кроме того вы ее основательно зачухали своими экспериментами
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
Jul 18 2007, 07:04
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(SALOME @ Jul 18 2007, 11:32)  Ну а если все РАБОТАЕТ, то чего хотите от нас? Если у Вас не тот "признак", а данные правильные, то чем Вы так обеспокоены? Юзайте эту свою странную карту на здоровье..  Ковыряя чужой исходник откопал: ; SD_START_TOKEN 0xFE ; SD_MULTI_START 0xFC Одно но, концы их растут из библиотеке и далее не совсем понятно... Цитата А лучше попробуйте другую карту. Пришли к тому от чего начали... КАК работать с MMCмикро? ДРУГИХ У НАС НЕ ПРОДАЮТ... (правда ещё можно плюсы поискать, но микро есть в наличии) Цитата Рискну предположить, что ЭТА карта, во первых явно старая (давно уже таких в продаже нет) и кроме того вы ее основательно зачухали своими экспериментами  Идёт в стандартной поставке с сот телефонами... так что новая... Цитата(jasper @ Jul 18 2007, 10:42)  Немного правда. За спецификацию низкоуровневого (эл. протакола) спасибо... Мне бы логический... типа как инициализировать и т.д. Нечто вроде нащупал: http://www.samsung.com/global/business/sem...note_200606.pdf
Сообщение отредактировал QuickWitted - Jul 18 2007, 06:50
--------------------
|
|
|
|
|
Jul 18 2007, 07:16
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 12-06-07
Пользователь №: 28 387

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

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(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... но все таки... (есно значение блока при попытке было минимальным и за границу блоков не цепляло)
Сообщение отредактировал QuickWitted - Jul 18 2007, 08:05
--------------------
|
|
|
|
|
Jul 18 2007, 08:18
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 12-06-07
Пользователь №: 28 387

|
Странное дело, конечно... Я CMD16 не посылал, тем самым оставив 512 байт блока. А в аргументе CMD17 или CMD18 у меня последние нули, т.е. например 00 04 10 00. Если поменять последние нули, то вылезет ошибка о границе блока.
|
|
|
|
|
Jul 18 2007, 08:46
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(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
--------------------
|
|
|
|
|
Jul 18 2007, 08:54
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 12-06-07
Пользователь №: 28 387

|
Цитата(QuickWitted @ Jul 18 2007, 11:46)  Где то читал что не все карточки держат побайтовую адресацию... Так у кого работает?
А про 512 по умолчанию это не для всех... Значит, мне просто повезло. карточка на 64 М, в начале темы описана.
|
|
|
|
|
Jul 19 2007, 03:59
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата А чем тебя блок 512 байт не устраивает? Пробовал не посылать сет блок? Вчера попробовал не посылать сет блок (CMD16) на ММСмикро 512Мб - вылетает с ошибкой чтения... т.е. ругается на команду чтения... Последовательность CMD0 CMD1 CMD17 тут по моему что-то с инициализацией (т.к. кроме как на статус она не на что не отвечает)..... (Карта 32Мб без команды CMD16 по умолчанию имеет длину блока 512 и на последовательность команд CMD0 CMD1 CMD17 отдаёт блок - Т.Е. РАБОТАЕТ) НУ И ЕЩЁ РАЗ СПРОШУ:У КОГО ЕСТЬ ДОКА НА КОМАНДЫ ММСмикро? Последовательность команд для карт ММС 8-128Мб с ММСмикро 512Мб НЕ РАБОТАЕТ!!!
--------------------
|
|
|
|
|
Jul 19 2007, 06:18
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Может кому понадобится... На скору руку мной нацарапанная утилита для создания индексных текстовых файлов для тестового чтения с флешки... (т.е файл создаёт с цифрами 00000001: и до заданного размера файла) [attachment=12581:attachment] удобно тем, что по прочитанному можно проконтролировать положение знакоместа и правильность чтения… кто СИ знает гляньте: http://www.nxp.com/acrobat_download/applic...s/AN10406_3.pdfили тут прилепил [attachment=12585:attachment] Рекомендации по работе с ММС по SPI датировано 2007 Они их поменяли по сравнению с 2005 годом (AN10406_2.pdf)
Сообщение отредактировал QuickWitted - Jul 19 2007, 06:31
--------------------
|
|
|
|
|
Jul 19 2007, 17:23
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 12-06-07
Пользователь №: 28 387

|
Цитата(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. Ну и инициализация само собой.
|
|
|
|
|
Jul 20 2007, 04:45
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(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" в твоём топике это не опечатка? Сам вопросы задаю... сам отвечаю Цитата 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 байт а не бит как вы вероятно думаете
--------------------
|
|
|
|
|
Jul 20 2007, 05:36
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 10-10-05
Пользователь №: 9 463

|
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 у меня нет ни одной
|
|
|
|
|
Jul 23 2007, 08:49
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(QuickWitted @ Jul 23 2007, 10:44)  Теперь вопрос, а что с хардварным SPI на асме делать? На софтовом - понятно, а с хардой? Не понятно, что подразумевается под хардварным и софтовым SPI? В чем тут разница? Кстати, специально купили карту MMCmicro. Все работает так же как и с обычной ММС
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
Jul 23 2007, 09:29
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(SALOME @ Jul 23 2007, 13:49)  Не понятно, что подразумевается под хардварным и софтовым SPI? В чем тут разница? Софтовый алгоритм написан командами выдать в ногу порта/считать с ноги порта бит... Хардварный (читай аппаратный) - выдвинул байт по адресу во внутренней памяти и он сам передаётся с прерыванием по окончанию Софтовый может работать на MK без аппаратного SPI Цитата Кстати, специально купили карту MMCmicro. Все работает так же как и с обычной ММС Одно НО не для всех карт !!! Повторно привожу цитату: Цитата Max_Shaman Спецификация гласит что так называемый TOKEN "синхронизирующий бит начала передачи", может появляться в любой момент тактов ожидания ответа, то-есть он может быть не кратен 8-ми циклам. Решение проблемы: надо отлавливаить не код "FE" , а всего-лишь первый нулевой бит, и по нему уже синхронизироваться, он может появляется в любое время а не так как вы его ожидаете. Я в интернете на зарубежных форумах находил исходники с подобным неправильным способом работы с карточкой и также жалобы на неспособность работы некоторых карточек от некоторых производителей. И повторно задаю вопрос: Как к этому прикрутить хардварный SPI? (И простым языком: как пояснить МК что начало передачи сдвинулось и лежит в середине байта, а хвост байта ещё не принят?)
--------------------
|
|
|
|
|
Jul 24 2007, 03:00
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(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 комментарий надо сдвинуть вправо до решетки #...
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
Jul 24 2007, 04:39
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(SALOME @ Jul 24 2007, 08:00)  Если используется "on chip SPI" то все объяснения происходят при инциализации порта SPI. Вы меня не поняли... Карта даёт ответ В СЕРЕДИНЕ БАЙТА, и где первый бит отличный от ЕДИНИЦЫ, там и начало байта. Вопрос КАК ЭТО ОБЬЯСНИТЬ МК? Т.е. фактически надо произвести дополнительное тактирование и принять хвост байта... далее опять принимать по целому байту... Если есть возможность скорректировать счётчик в хардварном SPI... или отключить SPI протактировать самому, потом включить обратно... Кто уже решал и решил эту задачу?
--------------------
|
|
|
|
|
Jul 24 2007, 09:16
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(QuickWitted @ Jul 24 2007, 11:39)  Карта даёт ответ В СЕРЕДИНЕ БАЙТА, и где первый бит отличный от ЕДИНИЦЫ, там и начало байта. Вопрос КАК ЭТО ОБЬЯСНИТЬ МК? С чего вы это взяли? Любое устройство, работающее в SPI выдает информацию (т.е. биты DATA) только при получении тактовых импульсов SCLK ( один бит DATA на один такт SCLK) и никак она не может "начать давать ответ" в середине байта. А то, про что вы говорите "где первый бит отличный от ЕДИНИЦЫ, там и начало байта", похоже на UART. Посмотрите все процессы по 2-х канальному осцилу, а иначе не будет Вам щастья
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
Jul 24 2007, 09:42
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(SALOME @ Jul 24 2007, 14:16)  С чего вы это взяли? Любое устройство, работающее в SPI выдает информацию (т.е. биты DATA) только при получении тактовых импульсов SCLK ( один бит DATA на один такт SCLK) и никак она не может "начать давать ответ" в середине байта. В любой доке на ММС или SD посмотрите описание Ncr А после прочтения станет ясно что: Ncr - измеряется не в байтах, а в CLOCK CYCLE - а это в переводе означает один такт CLK на шине SPI. Подробно тут: http://electronix.ru/forum/index.php?showt...633?entry243656Цитата а иначе не будет Вам щастья  При ответе счастье - это когда твой ответ с мануалом не расходится
--------------------
|
|
|
|
|
Jul 24 2007, 11:09
|

Частый гость
 
Группа: Свой
Сообщений: 146
Регистрация: 6-01-05
Из: Украина
Пользователь №: 1 831

|
Цитата(QuickWitted @ Jul 24 2007, 12:42)  В любой доке на ММС или SD посмотрите описание Ncr А после прочтения станет ясно что: Ncr - измеряется не в байтах, а в CLOCK CYCLE - а это в переводе означает один такт CLK на шине SPI. Полный бред, не вводите в заблуждение если сами не читали или не понимаете Спецификация на SD ... While the SD Memory Card channel is based on command and data bit streams which are initiated by a start bit and terminated by a stop bit, the SPI channel is byte oriented. Every command or data block is built of 8-bit bytes and is byte aligned to the CS signal (i.e. the length is a multiple of 8 clock cycles). ... Таблица Timing Values Ncr - Unit - 8 clock cycles ...
|
|
|
|
|
Jul 24 2007, 11:23
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(QuickWitted @ Jul 24 2007, 16:42)  В любой доке на ММС или SD посмотрите описание Ncr А после прочтения станет ясно что: Ncr - измеряется не в байтах, а в CLOCK CYCLE - а это в переводе означает один такт CLK на шине SPI. Прошла по ссылке. Там как раз и пинают за эту путаницу  . Все задержки, в т.ч. и Ncr измеряются именно в байтах. Обратите внимание на цифру 8 перед CLOCK CYCLE. Не может аппаратный SPI работать с циклами не кратными байту (т.е. 8 бит). Мне не попадалось... Итак для задержки нужно послать N-ое количество "пустых БАЙТ (0хFF)". Для Ncr это число от 0 до 8. Это означает, что если отклик после посылки 8-го пустого байта не пришел, то его уже не будет. Кстати "пустой" байт посылается не столько для задержки, а для того чтобы Мaster SPI (в Вашем случае это РС) послал тактовые импульсы Slave SPI (это FLASH карта) и с их помощью получил отклик. Если вы не пошлете пустой байт, то отклик не получите ни под каким видом, потому,что SPI - это СИНХРОННЫЙ интерфейс. И не хмурьте лоб на смайлике, лучше его наморщите :-)
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
Jul 24 2007, 11:36
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(bmf @ Jul 24 2007, 16:09)  Полный бред, не вводите в заблуждение если сами не читали или не понимаете Спецификация на SD Всех датащитов на флеши не читал, но с десяток изучил... Цитата While the SD Memory Card channel is based on command and data bit streams which are initiated by a start bit and terminated by a stop bit, the SPI channel is byte oriented. Every command or data block is built of 8-bit bytes and is byte aligned to the CS signal (i.e. the length is a multiple of 8 clock cycles). Ну и что? И чем это противоречит? Токен FE для ловли начала и предназначен... Цитата Таблица Timing Values Ncr - Unit - 8 clock cycles Написано же НЕ У ВСЕХ производителей он КРАТЕН 8... Из спецификации на SD С.т. 4-46 таблица 4-24 "Timing Values" NCR Min - 2 Clock cycles Max - 64 Clock cycles Страницу прикладываю...[attachment=12685:attachment] Цитата(SALOME @ Jul 24 2007, 16:23)  Прошла по ссылке. Там как раз и пинают за эту путаницу  . Все задержки, в т.ч. и Ncr измеряются именно в байтах. Обратите внимание на цифру 8 перед CLOCK CYCLE. Не может аппаратный SPI работать с циклами не кратными байту (т.е. 8 бит). Во во поэтому они гибрид и делали (ловили софтово, а принимали хардварно)
--------------------
|
|
|
|
|
Jul 24 2007, 11:59
|

Частый гость
 
Группа: Свой
Сообщений: 146
Регистрация: 6-01-05
Из: Украина
Пользователь №: 1 831

|
Цитата(QuickWitted @ Jul 24 2007, 14:36)  Всех датащитов на флеши не читал, но с десяток изучил... ... Страницу прикладываю.. Как говорят: смотришь в книгу а видишь фигу Вы точно чего то не дочитали у SD есть два режима - родной SD в котором действительно битовая синхронизация и SPI - в котором только байтовая. вы привели как раз как раз таблицу для родного SD режима (в котором и эффективно работать можно только с SD контроллером). А если таковые SD с битовой синхронизацией для SPI режима есть (в чем я сильно сомневаюсь) - то это не SD, т.к. они не будут отвечать спецификации И если у когото и вылезла она в середине байта, то это из за мягко сказать неумелости - карта не переведена в режим SD или сбои по фронтам линии clock. Только и всего.
|
|
|
|
|
Jul 24 2007, 16:23
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 12-06-07
Пользователь №: 28 387

|
Вот и у меня, ребята назрел снова вопрос. Не буду добивать вас какой-то ерундой, у меня всё конкретно. После инициализации карты шлём команду CMD18 и начинаем непрерывно считать байтики. Вот в порыве своей идеи я и забыл про CRC и мой DAC стал озвучивать и эту ахинею  . Т.е. картина после посылки CMD18 такая: Block 512 byte - CRC - CRC - Block 512 byte - CRC - CRC - Block 512 byte - CRC - CRC........ и т.д. Так оно и есть. Вопрос следующий: как отключить эти CRC, чтобы посылки имели вид: Block 512 byte - Block 512 byte - Block 512 byte.... Из буржуйского даташита вычитал, что есть такая команда, как CMD59, но вот её подробное описание не удосужились привести... Кто что знает?
|
|
|
|
|
Jul 24 2007, 18:12
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 12-06-07
Пользователь №: 28 387

|
Цитата(oll @ Jul 24 2007, 20:29)  Так как время между посылками в звуковой цап или шим при оцифровке звука 16кГц составляет 65мкС - Вы спокойно успеете прочитать два CRC. Правда, если Вы используете 51 кристалл надо все просчитать - может понадобится снизить частоту оцифровки до 8 кГц (125 мкС). Не всё так просто. Я на своём AT89C2051 решил вытянуть все 22 кГц! И это получилось. Почти  ) Звук проигрывается, но со щелчками. Я встал ослом на выход ЦАПа и узнал характер этих щелчков - это те самые 2 байта CRC. Так вот, для проигрывания 22 кГц, 8 бит мне пришлось поставить кварц 20 МГц (у 2051 на один такт уходит 12 циклов кварца, в итоге имеем реальную частоту 1,67 МГц, если бы это был AVR). И со всеми этими условиями программка работает впритык, т.е не всунешь туда ещё пару строк. Даже для этого мне пришлось ужать цикл воспроизведения 1 байта хитрым способом. ЦАП у меня 12 бит, поставил то, что было под рукой. Реально значат только старшие 8 бит, остальные 4 нули. У DAC7513 цикл состоит из 16 бит: x-x-0-0-bit12-bit11-.....-bit0. В рамках этой схемы всё получилось впритык, и эти 2 байта CRC всё портят. Сегодня попробую их просто не читать (16 clock на карточке и всё), но тогда появится ступенька в фонограмме. Но это лучше, чем щелчки. Отпишусь о результатах.
|
|
|
|
|
Jul 24 2007, 18:42
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 10-10-05
Пользователь №: 9 463

|
Цитата(Angelborn @ Jul 25 2007, 00:12)  Не всё так просто. Я на своём AT89C2051 решил вытянуть все 22 кГц! И это получилось. Почти  ) Звук проигрывается, но со щелчками. Я встал ослом на выход ЦАПа и узнал характер этих щелчков - это те самые 2 байта CRC. Так вот, для проигрывания 22 кГц, 8 бит мне пришлось поставить кварц 20 МГц (у 2051 на один такт уходит 12 циклов кварца, в итоге имеем реальную частоту 1,67 МГц, если бы это был AVR). И со всеми этими условиями программка работает впритык, т.е не всунешь туда ещё пару строк. Даже для этого мне пришлось ужать цикл воспроизведения 1 байта хитрым способом. ЦАП у меня 12 бит, поставил то, что было под рукой. Реально значат только старшие 8 бит, остальные 4 нули. У DAC7513 цикл состоит из 16 бит: x-x-0-0-bit12-bit11-.....-bit0. В рамках этой схемы всё получилось впритык, и эти 2 байта CRC всё портят. Сегодня попробую их просто не читать (16 clock на карточке и всё), но тогда появится ступенька в фонограмме. Но это лучше, чем щелчки. Отпишусь о результатах. Честно говоря я бы в Вашей задаче заменил AT89C2051 на Tiny2313 - по ногам совпадает плюсы: -питание 3В - малое потребление в слипе -внутренний генератор 8 мГц -не нужен внешний ЦАП - звук можно вывести на 8-ми битный шим (их там четыре) + 1резистор и конденсатор - звук получается хороший (проверено) - и лично для меня большой плюс - любимая среда разработки - Алгоритм билдер (до 2К компилирует не зарегистрированная версия) не сочтите за рекламу АВРов - 51 серию тоже регулярно пользую
|
|
|
|
|
Jul 24 2007, 18:58
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 12-06-07
Пользователь №: 28 387

|
Цитата(oll @ Jul 24 2007, 21:42)  Честно говоря я бы в Вашей задаче заменил AT89C2051 на Tiny2313 - по ногам совпадает плюсы: -питание 3В - малое потребление в слипе -внутренний генератор 8 мГц -не нужен внешний ЦАП - звук можно вывести на 8-ми битный шим (их там четыре) + 1резистор и конденсатор - звук получается хороший (проверено) - и лично для меня большой плюс - любимая среда разработки - Алгоритм билдер (до 2К компилирует не зарегистрированная версия) не сочтите за рекламу АВРов - 51 серию тоже регулярно пользую На тини это чудо техники сделать - раз плюнуть! Там быстродействие всё покроет и все дыры залатает. Весь смысл в том, чтобы сделать это на AT89C2051. Проект не коммерческий, строится исключительно на энтузиазме. Поймите меня правильно.
|
|
|
|
|
Jul 25 2007, 04:06
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(bmf @ Jul 24 2007, 16:59)  И если у когото и вылезла она в середине байта, то это из за мягко сказать неумелости - карта не переведена в режим SD или сбои по фронтам линии clock. Только и всего. А с этого места подробно если можно... Добавил 2 функции: A) Ловить 0ххххххх (первый ноль, потом принять 7 бит) Б) Ловить 11111110 (первый ноль) Случай из практики: 1) Карта 32 метра ответ FE (11111110b) не приходит - вместо него FС (11111100b) Т.к. у меня SPI софтовый то скорость можно СИЛЬНО уменьшить... (пробовал вплоть до 25 герц при тактировании) На мелких скоростях результат тот же А остальные тесты -> проходили по датащиту После изменения (ловли первого нуля) ответ FС переплыл в FE... 2) После переделки карта микро на 512 метров начала НОРМАЛЬНО отвечать на CMD0,CMD1,CMD16 До этого сыпала лобудой Правда на CMD17 ругается на неверный аргумент (этот адресс на карте 32 метра работал)
--------------------
|
|
|
|
|
Jul 28 2007, 09:36
|

Частый гость
 
Группа: Свой
Сообщений: 146
Регистрация: 6-01-05
Из: Украина
Пользователь №: 1 831

|
Цитата(QuickWitted @ Jul 25 2007, 07:06)  А с этого места подробно если можно... Все выше сказанное мной относится к SD (с MMC не работаю). А что там юзер или производитель накосячил, нет желания предугадывать. Работаю с большими SD от SanDisk, Transcend и Kingston и никогда такая проблема не возникает. Инициализирую сразу на частоте 25МГц, современные карты это позволяют.
|
|
|
|
|
Aug 9 2007, 13:00
|
Участник

Группа: Новичок
Сообщений: 25
Регистрация: 19-02-07
Пользователь №: 25 505

|
Работаю с EP9302. Пытаюсь активировать SD-card (micro-SD Kingston 1024Mb ) для работы по SPI. Использую SDIO Simplidied spec. v. 2.00. Там есть блок-схема для инициализации в SPI-mod. После CMD8, в случае illegal command(я получаю именно такой ответ R1=0x05) надо "Test IO flag". А что это за IO flag? Причем насчет формата CMD8 нашел только вот тут: http://elm-chan.org/docs/mmc/mmc_e.html Не подскажете, в какой доке посмотреть насчет CMD8?
Сообщение отредактировал Rudolph - Aug 9 2007, 13:58
|
|
|
|
|
Aug 13 2007, 01:40
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(Rudolph @ Aug 9 2007, 18:00)  Использую SDIO Simplidied spec. v. 2.00. Там есть блок-схема для инициализации в SPI-mod. Ничего не понятно.... Ссылку на датащит можно? А лучше сюда кидай...
--------------------
|
|
|
|
|
Aug 14 2007, 03:02
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(Rudolph @ Aug 9 2007, 18:00)  Использую SDIO Simplidied spec. v. 2.00. Там есть блок-схема для инициализации в SPI-mod. Ага - есть страница 4 рис 3,1 Где нарисована последовательность CMD0 - > CMD1 - > работаем с SPI (Вроде стандартно  ) Пробовал? (там варианты ещё есть на рис 3,1) ИМХО: то что на странице 7 рис 3,2 это для распознавания типа карточки... (см. результат на рис 3,3) Цитата После CMD8, в случае illegal command(я получаю именно такой ответ R1=0x05) надо "Test IO flag". А что это за IO flag? ИМХО: проверить ноги ввода вывода... (1 или 0) Цитата Причем насчет формата CMD8 нашел только вот тут: А тебе описание её зачем? (всё равно твоя карта её не держит) Цитата Не подскажете, в какой доке посмотреть насчет CMD8? Искать новые доки в старых нет.... Кстати на твою схему подключения глянуть можно? (если по полному варианту то как будешь переключать питание?) а если нет, то зачем это всё городить? У тебя ещё свежие доки есть?
--------------------
|
|
|
|
|
Aug 14 2007, 08:32
|
Участник

Группа: Новичок
Сообщений: 25
Регистрация: 19-02-07
Пользователь №: 25 505

|
Схема подключения в точности такая, как в прикрепленном файле. Только выкинута флешка АТ25ххх, и SFRM напрямую заведен на вывод 1 карточки. Так же нет WP1, WP2 и CP1, CP2. 8 и 9-й контакты, как на этой схеме - на +3.3 заведены через сопротивление. Цитата Где нарисована последовательность CMD0 - > CMD1 - > работаем с SPI Это-то работает. Получаю 0х00 в конце концов. Схема:
|
|
|
|
|
Aug 14 2007, 16:45
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(Rudolph @ Aug 14 2007, 13:32)  Схема подключения в точности такая, как в прикрепленном файле. Это вэб сервер/пингер/или переходник Lan-RS232 ? Цитата Это-то работает. Получаю 0х00 в конце концов. А в чём вопрос тогда? Цитата(Rudolph @ Aug 14 2007, 13:32)  Схема: Если сервер то тебе хардварный интерфейс делать надо... (иначе со скоростью впритык)
--------------------
|
|
|
|
|
Aug 14 2007, 18:21
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 12-06-07
Пользователь №: 28 387

|
Часто встречаю в нете проблему, собственно и у меня она была. Карточки SD, что мне попадались, не хотят отдавать блок данных, размером более 512 байт. Получается, что CMD16 для них не актуальна? Это у всех так?
|
|
|
|
|
Aug 15 2007, 09:03
|
Участник

Группа: Новичок
Сообщений: 25
Регистрация: 19-02-07
Пользователь №: 25 505

|
Цитата(QuickWitted @ Aug 14 2007, 20:45)  Это вэб сервер/пингер/или переходник Lan-RS232 ?
Если сервер то тебе хардварный интерфейс делать надо... Нет-нет. Просто схему подключения SD card оттуда срисовали и все.
|
|
|
|
|
Aug 15 2007, 17:26
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(Rudolph @ Aug 15 2007, 14:03)  Нет-нет. Просто схему подключения SD card оттуда срисовали и все. Схема неахти... (не экономно для мобильных устройств и есть возможность спалить флешу...) Ниже привожу свою... (по экономичности такая же, но с защитой лучше...) [attachment=13048:attachment] А твой агрегат что делает? (у меня на промежуточном этапе вышел бук ридер) Сейчас вроде уже освоился с флешами... У меня иногда проявляется следующий баг: При включении (1/10) карта инициализируется, но считывается с неё мусор... повторная инициализация проблему не решает... второй вариант как получить этот баг: вставляем карту после включения... инициализируем и в ответ мусор... Это что? (Инициализация после включения вручную ~ через 10 сек...) А как у вас?
Сообщение отредактировал QuickWitted - Aug 15 2007, 17:19
--------------------
|
|
|
|
|
Aug 16 2007, 09:23
|
Участник

Группа: Новичок
Сообщений: 25
Регистрация: 19-02-07
Пользователь №: 25 505

|
Я не схемотехник, работаю с тем, что нарисовано другими.  Но за схему - спасибо, покажу кому надо. У меня задача скидывать на SD card короткие сообщения, порядка десятков байт. Частота - раз в 10 секунд, не более. Но в общем случае - в случайное время. SD будет выниматься только в том случае, если она неисправна. То есть, как поставили при изготовлении девайса, так и стоит там всю жизнь. Вышеописанного бага у меня нет. Есть другой - если я просто подаю питание на девайс с вставленной SD - то ее не инициализировать никакими силами. Жмешь кнопку ресета EP9302 - все сразу нормально работает. Но это, наверное особенности схемотехники - ошибка где-то.
|
|
|
|
|
Aug 16 2007, 15:48
|
Участник

Группа: Новичок
Сообщений: 25
Регистрация: 19-02-07
Пользователь №: 25 505

|
Вот есть такой интересный баг:
Пишу блок 512 байт. Читаю его же, сравниваю. И всегда получаю отличие 448-го и 449-го байтов. Что за хрень? Пока ничего не нашел, почему бы это так.
|
|
|
|
|
Aug 18 2007, 07:57
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(Rudolph @ Aug 16 2007, 14:23)  Я не схемотехник, работаю с тем, что нарисовано другими.  Но за схему - спасибо, покажу кому надо. Ну тогда полный вариант: [attachment=13085:attachment] Более экономичный и быстродействующий
--------------------
|
|
|
|
|
Aug 21 2007, 04:08
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(Rudolph @ Aug 20 2007, 18:15)  Там очень подробно про CRC7 ( раздел Cyclic Redundancy Check ) и в конце про CRC16. Откопал в приведённой доке следующее: 59 (0x3B) CRC_ON_OFF Only Bit 0 R1 Argument sets CRC on (1) or off (0). Ты случаем не сталкивался с работой команды 59 (она отключает только проверку или и саму выдачу CRC?)
--------------------
|
|
|
|
|
Aug 21 2007, 06:39
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 12-06-07
Пользователь №: 28 387

|
Цитата(QuickWitted @ Aug 21 2007, 07:08)  Откопал в приведённой доке следующее: 59 (0x3B) CRC_ON_OFF Only Bit 0 R1 Argument sets CRC on (1) or off (0).
Ты случаем не сталкивался с работой команды 59 (она отключает только проверку или и саму выдачу CRC?) Я тоже хотел отключить это CRC, уж больно оно мне мешало, но как оказалось, оно по умолчанию и выключено, т.е. CMD59 включает проверку CRC. Только вот кому это надо? Лучше её не трогать.
|
|
|
|
|
Aug 21 2007, 09:37
|
Участник

Группа: Новичок
Сообщений: 25
Регистрация: 19-02-07
Пользователь №: 25 505

|
По умолчанию в режиме SPI проверка CRC отключена, то есть мы должны отправить правильный CRC7 только с первоq командой - CMD0 (там считать ничего не надо - все известно заранее). То есть, байты CRC7 и CRC16 надо отправлять и получать, но на содержимое забить. я 0xFF отправляю.
CMD59 может включить/отключить этот режим. Я на всякий случай подаю CMD59 - мало ли что там производителю SD card взбредет в голову.
Сообщение отредактировал Rudolph - Aug 21 2007, 09:40
|
|
|
|
|
Aug 21 2007, 11:46
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(Angelborn @ Aug 21 2007, 11:39)  Я тоже хотел отключить это CRC, уж больно оно мне мешало, но как оказалось, оно по умолчанию и выключено, т.е. CMD59 включает проверку CRC. Только вот кому это надо? Лучше её не трогать. Дело не в этом просто у меня иногда карточка мусором сыпет... Хочу в качестве проверки... (его включать не надо она его и так выдаёт при чтении) Откопал на китайском сайте исходник ОДНО НО то что карточка возвращает с этим CRC не совпадает  оригинал в файле [attachment=13133:attachment] ;************************************************** ;CRC16 ;************************************************** Mat_CRC16: lds R16_Tmp1, SPI_Blo1 ; Настроим счётчик mov R10_Racht, R16_Tmp1 ; Нам нужен блок длиной в SPI_Blo1 и SPI_Blo0 lds R16_Tmp1, SPI_Blo0 mov R09_Racht, R16_Tmp1 ; LDI R18, $FF ; Предустановка значения ; LDI R19, $FF clr R18 clr R19 ldi Xl, low(SpiMas) ; Укажем на память ldi Xh, high(SpiMas) rjmp CRC_LoopEnd ; Перейдём к исполнению CRC02: LD R16, X+ EOR R18, R16 LDI R17, $9 CRC03: DEC R17 BREQ CRC05 CLC ROR R19 ROR R18 CRC04: BRCC CRC03 LDI R16,1 EOR R18,R16 LDI R16,$A0 EOR R19,R16 RJMP CRC03 CRC05: ldi R16_Tmp1, 1 ; Уменьшим счётчик циклов на 1 sub R09_Racht,R16_Tmp1 sbc R10_Racht,R01_Tut0 CRC_LoopEnd: mov R16_Tmp1,R09_Racht or R16_Tmp1,R10_Racht brne CRC02 ; Если не всё получили - повторим STS SPI_CRCL, R18 ; Закатаем результат STS SPI_CRCH, R19 RET
--------------------
|
|
|
|
|
Aug 27 2007, 14:16
|
Участник

Группа: Новичок
Сообщений: 25
Регистрация: 19-02-07
Пользователь №: 25 505

|
Цитата(QuickWitted @ Aug 22 2007, 07:24)  В общих чертах у тебя последовательность команд какая? В данный момент такая: 0. Частота SPI < 400 kHz 1. 100 байтов 0xFF, что б уж точно хватило. 2. CMD0 до тех пор, пока не получу 0х01, с таймаутом конечно. 3. CMD55. - Если ответ на CMD55 == 0x01, то это SD и далее CMD41 до тех пор, пока не получу 0х00 - Если ответ на CMD55 == illegal command, то это MMC и далее CMD1 до тех пор, пока не получу 0x00 4. Выставляю частоту SPI на макс., т.е. 3.7 МГц Все, теперь работаю с карточкой. Конечно надо еще сделать анализ всех битов в ответах (R1, например) и т.д. Запись, чтение и стирание проходят нормально. Насчет FAT-ов я надеюсь на Windows CE. Там все это есть, так что, надеюсь, мне только придется написать аппаратно-зависимый драйвер SPI. Ох, забфл совсем, после пункта 4 идет: 5. CMD59 arg = 0 6. CMD16 arg = 512 7. CMD9 arg=0 - получить регистр CSD. Вот пока с регистром CID только непонятки какие-то. Не получить его, но, наверное, я что-то неправильно делаю - будем разбираться.
|
|
|
|
|
Aug 28 2007, 07:32
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(Rudolph @ Aug 27 2007, 19:16)  7. CMD9 arg=0 - получить регистр CSD. Вот пока с регистром CID только непонятки какие-то. Не получить его, но, наверное, я что-то неправильно делаю - будем разбираться. У меня ОДНА последовательность на CID и CSD... (разница только в команде) Вчера возился с алгоритмом расчёта объёма карты... Одно НО у меня получается 30 метров с хвостиком вместо 32х 32 mb 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 8C 26 01 2A 0F 59 01 E9 F6 D9 83 E3 92 40 40 D3 - CID 15 00 00 30 30 30 30 30 30 09 B3 00 9B 9A 28 E3 - CSD 09 - Read_Bl_Len 59 => 9 07 - Sector_Size 83 E3 => 10.000011 1.1100011 => 0000111 => 07 07 - старший байт C_Size 01 E9 F6 => 000000.01 11101001 11.110110 => 07 A7 => 07 A7 - младший байт C_Size => A7 03 - C_Size_mult D9 83 => 110110.01 1.0000011 => 011 => 03 > OK. mult = 2^(c_size_mult + 2) = 2^(3+2) =32 block_len = 2^read_bl_len = 2^9 =512 block_nr = (c_size + 1) * mult = 07A8h*32d =62720 Capacity = block_len * block_nr =62720*512 =32112640 = 30,625 mb
--------------------
|
|
|
|
|
Aug 28 2007, 11:50
|
Участник

Группа: Новичок
Сообщений: 25
Регистрация: 19-02-07
Пользователь №: 25 505

|
Дык реальный объем всегда меньше. Все правильно.
|
|
|
|
|
Aug 29 2007, 04:58
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(Rudolph @ Aug 28 2007, 16:50)  Дык реальный объем всегда меньше. Все правильно. Перефразирую: Надо что-бы на экране писалось 32, 64, и т.д. как подправить формулу пересчёта? (табличный метод не хочу)
--------------------
|
|
|
|
|
Aug 29 2007, 08:10
|
Участник

Группа: Новичок
Сообщений: 25
Регистрация: 19-02-07
Пользователь №: 25 505

|
ИМХО искать ближайшее из константных значений (32, 64, 128...) и его выводить.
|
|
|
|
|
Aug 31 2007, 04:44
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(Rudolph @ Aug 27 2007, 19:16)  В данный момент такая:
//// Сгрызли мыши ////
6. CMD16 arg = 512 7. CMD9 arg=0 - получить регистр CSD. почему не наоборот? (объём, скорость, и размер макс блока вычисляется в CMD9) и на мой взгляд логично поднимать частоту ПОСЛЕ CMD9 Кстати интересный вопрос - А как вычислить скорость по CMD9? (где лежит, знаю, а математику приведения/вычисления реальной- нет)
--------------------
|
|
|
|
|
Aug 31 2007, 05:36
|
Местный
  
Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006

|
Думаю полезная ссылка будет FAT хороший перевод. Вот и описание MBR, нашлось.
MBR.rar ( 41.04 килобайт )
Кол-во скачиваний: 306 Думаю будет полезным.
|
|
|
|
|
Aug 31 2007, 15:32
|
Участник

Группа: Новичок
Сообщений: 25
Регистрация: 19-02-07
Пользователь №: 25 505

|
Цитата(QuickWitted @ Aug 31 2007, 08:44)  почему не наоборот? (объём, скорость, и размер макс блока вычисляется в CMD9) и на мой взгляд логично поднимать частоту ПОСЛЕ CMD9 Да, конечно, правильнее проверить CSD сначала и подавать CMD16 только, если это надо.
|
|
|
|
|
Sep 4 2007, 10:51
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
В файловой системе основной единицей является кластер. Кластер состоит из секторов, а сектор имеет длину в N байт. Файл записанный на диск занимает какое-то ЦЕЛОЕ кол-во кластеров.
В фат все значения идут младшим вперёд
На диске в начале идёт сектор который называют "boot сектор", "reserved sector" или "0th sector," но главное лишь то, что это первый сектор на диске.
Смещение от начала диска в блоках на ??? это 4-х байтовое значение в нулевом секторе, начиная с позиции 1C6h.
1) Вычислить место нахождение ??? считав НУЛЕВОЙ блок и обработав 4 байта начиная со смещения 1C6h
загрузочная запись раздела начинается с = 00 00 00 20 ------------------------------------------------------------------------------------- Пример: 01С0 01,00,04,01,E0,D4,20,00,00,00,DF,F4,00,00,00,00 ^^1bayt -------------------------------------------------------------------------------------
2) Считать этот блок
3) Выделить 2 байта по смещению 0Bh Количество байтов в секторе = 07 00 ------------------------------------------------------------------------------------- Пример: 0 1 2 3 4 5 6 7 8 9 A B C D E F 0000 F8,FF,FF,FF,03,00,04,00,05,00,06,00,07,00,08,00 ^^1bayt -------------------------------------------------------------------------------------
4) Выделить 2 байта по смещению 0Eh Количество зарезервированных секторов = 00 08 ------------------------------------------------------------------------------------- Пример: 0 1 2 3 4 5 6 7 8 9 A B C D E F 0000 F8,FF,FF,FF,03,00,04,00,05,00,06,00,07,00,08,00 ^^1bayt -------------------------------------------------------------------------------------
5) Выделить 1 байт по смещению 10h Количество копий FAT = 02 ------------------------------------------------------------------------------------- Пример: 0 1 2 3 4 5 6 7 8 9 A B C D E F 0010 02,00,02,DF,F4,F8,F3,00,3F,00,FF,00,20,00,00,00 ^^1bayt -------------------------------------------------------------------------------------
6) Выделить 2 байта по смещению 11h Количество возможных записей в корневом каталоге = 02 00 ------------------------------------------------------------------------------------- Пример: 0 1 2 3 4 5 6 7 8 9 A B C D E F 0010 02,00,02,DF,F4,F8,F3,00,3F,00,FF,00,20,00,00,00 ^^1bayt -------------------------------------------------------------------------------------
7) Выделить 2 байта по смещению 16h Секторов на FAT = 00 F3 ------------------------------------------------------------------------------------- Пример: 0 1 2 3 4 5 6 7 8 9 A B C D E F 0010 02,00,02,DF,F4,F8,F3,00,3F,00,FF,00,20,00,00,00 ^^1bayt -------------------------------------------------------------------------------------
Записи FAT = загрузочная запись раздела + 0Eh (2 байта) = 20 + 08 = 28h
Записи каталога = записи FAT + (16h (2 байта) * 10h (1 байт)) = 28h + F3*2 = 20Eh
Область данных (кластер 0) = записи каталога + (11h (2 байта)*32/512) в загрузочной записи раздела = 20E + 200h*32/512 = 20E + 32d = 22E
А начало в 228
В байтах 04 50 00 h в блоках 02 28 h
Blok 0200 > Adres00000000
00A0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 00B0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 00C0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 00D0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 00E0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 00F0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 0100 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 0110 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 0120 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 0130 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 0140 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 0150 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 0160 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 0170 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 0180 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 0190 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 01A0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 01B0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 01C0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 01D0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 01E0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 01F0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 0200 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 0210 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 0220 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 0230 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 0240 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 0250 00,00,00,00,00,00,00,00,00,00,00,00,00,00,80,01 [#128] 0260 01,00,04,01,E0,D4,20,00,00,00,DF,F4,00,00,00,00 0270 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 0280 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 0290 00,00,00,00,00,00,00,00,00,00,00,00,00,00,55,AA U[#170]
> OK.
>>>>>>>>>>> > Blok 0200 > Adres00004000
00A0 EB,3C,90,4D,53,44,4F,53,35,2E,30,00,02,01,02,00 <[#144]MSDOS5.0 00B0 02,00,02,DF,F4,F8,F3,00,3F,00,FF,00,20,00,00,00 ? 00C0 00,00,00,00,00,00,29,4B,C8,5F,F0,4E,4F,20,4E,41 )K _ NO NA 00D0 4D,45,20,20,20,20,46,41,54,31,36,20,20,20,33,C9 ME FAT16 3 00E0 8E,D1,BC,F0,7B,8E,D9,B8,00,20,8E,C0,FC,BD,00,7C [#142] [#188] {[#142] [#142] [#189]| 00F0 38,4E,24,7D,24,8B,C1,99,E8,3C,01,72,1C,83,EB,3A 8N$}$[#139] [#153] <r[#131] : 0100 66,A1,1C,7C,26,66,3B,07,26,8A,57,FC,75,06,80,CA f[#161]|&f;&[#138]W u[#128] 0110 02,88,56,02,80,C3,10,73,EB,33,C9,8A,46,10,98,F7 [#136]V[#128] s 3 [#138]F[#152] 0120 66,16,03,46,1C,13,56,1E,03,46,0E,13,D1,8B,76,11 fFVF [#139]v 0130 60,89,46,FC,89,56,FE,B8,20,00,F7,E6,8B,5E,0B,03 `[#137]F [#137]V [#139]^ 0140 C3,48,F7,F3,01,46,FC,11,4E,FE,61,BF,00,00,E8,E6 H F N a[#191] 0150 00,72,39,26,38,2D,74,17,60,B1,0B,BE,A1,7D,F3,A6 r9&8-t`[#177][#190][#161]} [#166] 0160 61,74,32,4E,74,09,83,C7,20,3B,FB,72,E6,EB,DC,A0 at2Nt[#131] ; r [#160] 0170 FB,7D,B4,7D,8B,F0,AC,98,40,74,0C,48,74,13,B4,0E }[#180]}[#139] [#172][#152]@tHt[#180] 0180 BB,07,00,CD,10,EB,EF,A0,FD,7D,EB,E6,A0,FC,7D,EB [#187] [#160] } [#160] } 0190 E1,CD,16,CD,19,26,8B,55,1A,52,B0,01,BB,00,00,E8 &[#139]UR[#176][#187] 01A0 3B,00,72,E8,5B,8A,56,24,BE,0B,7C,8B,FC,C7,46,F0 ;r [[#138]V$[#190]|[#139] F 01B0 3D,7D,C7,46,F4,29,7D,8C,D9,89,4E,F2,89,4E,F6,C6 =} F )}[#140] [#137]N [#137]N 01C0 06,96,7D,CB,EA,03,00,00,20,0F,B6,C8,66,8B,46,F8 [#150]} [#182] f[#139]F 01D0 66,03,46,1C,66,8B,D0,66,C1,EA,10,EB,5E,0F,B6,C8 fFf[#139] f ^[#182] 01E0 4A,4A,8A,46,0D,32,E4,F7,E2,03,46,FC,13,56,FE,EB JJ[#138]F2 F V 01F0 4A,52,50,06,53,6A,01,6A,10,91,8B,46,18,96,92,33 JRPSjj[#145][#139]F[#150][#146]3 0200 D2,F7,F6,91,F7,F6,42,87,CA,F7,76,1A,8A,F2,8A,E8 [#145] B[#135] v[#138] [#138] 0210 C0,CC,02,0A,CC,B8,01,02,80,7E,02,0E,75,04,B4,42 [#128]~u[#180]B 0220 8B,F4,8A,56,24,CD,13,61,61,72,0B,40,75,01,42,03 [#139] [#138]V$ aar@uB 0230 5E,0B,49,75,06,F8,C3,41,BB,00,00,60,66,6A,00,EB ^Iu A[#187]`fj 0240 B0,4E,54,4C,44,52,20,20,20,20,20,20,0D,0A,52,65 [#176]NTLDR Re 0250 6D,6F,76,65,20,64,69,73,6B,73,20,6F,72,20,6F,74 move disks or ot 0260 68,65,72,20,6D,65,64,69,61,2E,FF,0D,0A,44,69,73 her media. Dis 0270 6B,20,65,72,72,6F,72,FF,0D,0A,50,72,65,73,73,20 k error Press 0280 61,6E,79,20,6B,65,79,20,74,6F,20,72,65,73,74,61 any key to resta 0290 72,74,0D,0A,00,00,00,00,00,00,00,AC,CB,D8,55,AA rt[#172] U[#170]
--------------------
|
|
|
|
|
Dec 24 2007, 10:04
|

Местный
  
Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317

|
Подскажите, в чем причина. Карточка (SD ver1 16MB) вполне корректно инициализируется. После этого даю комманду чтения (CMD17), получаю верный responce равный 0x00. Проверка CRC включена, так что комманда доходит совершенно верно (проверял). Но token вместо ожидаемого 0xFE стабильно равен 0x01. В общем, имею тако лог работы: Код send_cmd(CMD = 0, arg = 0x00000000) = 01 crc = 0x95 send_cmd(CMD = 59, arg = 0x00000001) = 01 crc = 0x83 send_cmd(CMD = 8, arg = 0x000001AA) = 05 crc = 0x87 send_cmd(CMD = 55, arg = 0x00000000) = 01 crc = 0x65 send_cmd(CMD = 41, arg = 0x00000000) = 01 crc = 0xE5 send_cmd(CMD = 55, arg = 0x00000000) = 01 crc = 0x65 send_cmd(CMD = 41, arg = 0x00000000) = 00 crc = 0xE5 send_cmd(CMD = 16, arg = 0x00000200) = 00 crc = 0x15 send_cmd(CMD = 17, arg = 0x0002E800) = 00 crc = 0xC1 token = 0xFF token = 0xFF token = 0xFF token = 0x01
|
|
|
|
|
Jan 8 2008, 09:41
|

Местный
  
Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596

|
Цитата(Aesthete Animus @ Dec 24 2007, 16:04)  Подскажите, в чем причина. Карточка (SD ver1 16MB) вполне корректно инициализируется. После этого даю комманду чтения (CMD17), получаю верный responce равный 0x00. Проверка CRC включена, так что комманда доходит совершенно верно (проверял). Но token вместо ожидаемого 0xFE стабильно равен 0x01. Во во я не один такой... Ответ начинается НЕ КРАТНО 8 бит!!! 0xFE = 11111110 Лови софтой первый ноль и переходи на Харду...
--------------------
|
|
|
|
|
Jan 8 2008, 23:09
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Aesthete Animus @ Dec 24 2007, 12:04)  Но token вместо ожидаемого 0xFE стабильно равен 0x01. Полагаю, что это не token. Это Responce. Причем совершенно нормальный - R1_IDLE_STATE и никаких ошибок. Признак получения ответа это бит #define R1_NOTVALID 0x80 равный 0 дальше разбор ошибок: #define R1_OK 0x00 #define R1_IDLE_STATE 0x01 #define R1_ERASE_RST 0x02 #define R1_ILLEGAL_CMD 0x04 #define R1_CRC_ERROR 0x08 #define R1_ERASE_ERROR 0x10 #define R1_ADD_ERROR 0x20 #define R1_PARAM_ERROR 0x40 #define R1_NOTVALID 0x80 И можете гнать 0xFF до полученя уже token Цитата(QuickWitted @ Jan 8 2008, 11:41)  Ответ начинается НЕ КРАТНО 8 бит!!! Разумеется нет. Ну последующий "совет" совершенно вредный.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|