Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SD Card - програмная реализация интерфейса
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2, 3, 4, 5
KAlex
Цитата(gnomik_ @ Jan 9 2010, 08:01) *
на CMD8 отвечает 00 00 00 02 00 FF

С какими параметрами посылается команда?
Надо так: 48 00 00 01 AA 87
Карточка рабочая? Есть другая карта?
gnomik_
Цитата(KAlex @ Jan 9 2010, 19:15) *
С какими параметрами посылается команда?
Надо так: 48 00 00 01 AA 87
Карточка рабочая? Есть другая карта?


Карточек 3 штуки(одна-HC). Все на компе пишутся и читаются нормально.

Посылаю 255 клоков(сначала 100 клоков посылал)
Посылаю CMD0(40 00 00 00 00 95) ответ не проверяю
Посылаю 100 клоков
Посылаю CMD8 (48 00 00 01 AA 87)
жду 0 на CMD читаю ответ 00 00 00 02 00 FF
Посылаю 100 клоков
Посылаю CMD55 (77 00 00 00 00 65)
жду 0 на CMD читаю ответ 2С 00 00 00 00 7F
Посылаю 100 клоков
Посылаю ACMD41 (69 40 FF 80 00 17)
жду 0 на CMD читаю ответ 3F 81 FE 00 03 FF
Посылаю 100 клоков........

Пишу по фронту, читаю по спаду, все делаю медленно(частота невелика).

Может состояние линий во время пустых клоков у меня не правильное? Какое должно быть? Может с командами чего путаю?...

Спасибо.
demiurg_spb
Цитата(KAlex @ Jan 5 2010, 11:55) *
А я и не претендовал на истину в последней инстанции. biggrin.gif
Это для моей конкретной задачи. RAMа много, ROMа мало. Вот и выкручиваюсь как могу.
А как, простите, табличные данные оказываются в RAM? Они же из ROM копируются...
Так получается, что Вы и RAM и ROM занимаете. Или я что-то не понимаю?
aaarrr
Цитата(demiurg_spb @ Jan 10 2010, 14:26) *
Или я что-то не понимаю?

Таки да: таблица генерируется, а не копируется.
demiurg_spb
Цитата(aaarrr @ Jan 10 2010, 14:30) *
Таки да: таблица генерируется, а не копируется.
Точно! А я не разглядел с первого раза. Оригинальный ход.
sonycman
Цитата(demiurg_spb @ Jan 10 2010, 17:25) *
Точно! А я не разглядел с первого раза. Оригинальный ход.

Хм, весьма стандартный ход.
Неужели никогда не приходилось генерировать таблицы с предпросчитанными данными для исключения реалтаймовых вычислений?
KAlex
Без кода программы сказать что либо сложно.
Здесь выкладывал исходники для начальной инициализации.
Версия рабочая 100%.
gnomik_
Цитата(KAlex @ Jan 11 2010, 17:24) *
Без кода программы сказать что либо сложно.
Здесь выкладывал исходники для начальной инициализации.
Версия рабочая 100%.


Спасибо за ссылку. rolleyes.gif

Пишу все на асме. Весь код кидать сюда наверное смысла нет.
Пересмотрю все что написал и напаял.

Чего-то надо ворошить. Сама не заработает.

Результат отпишу.... Спасибо. rolleyes.gif
head_sk
Вопрос тем кто реализовывал fatfs от чана на SD-карточках с помощью AT91SAM7 в режиме SPI.
Какую максимальную скорость записи в файл удалось получить?
Спасибо.
ples
Доброе время суток..

Пытаюсь запустить известную всем FatFS на 1986ВЕ91Т (ядро Cortex-M3). Карта microSD 2 Gb подключена через SPI. Карта инициализируется, определяется ее тип и т.д., f_mount(..) выполняется успешно. Можно читать файлы и каталоги. Выполняется даже создание файла. НО! При попытке записи, закрытия файла или синхронизации - ошибка FR_DISK_ERR. Причина - в функции xmit_datablock - на переданный для записи блок данных карта отвечает 0xFF.
Если файл создать на компьютере, записать в него какие-либо данные, то через f_write() запись пройдет, но только в пределах размера файла, вызов f_sync() или f_close() приведет к той же ошибке... FatFS настроена без ограничений кроме LFN. Попробовал несколько разных microSD карт - на всех одинаковое поведение. Где могут быть грабли? Помогите разобраться.
Altemir
Поднят FatFs на LPC2214. Частота SPI - 7.3728МГц, использую microSD Toshiba 2ГБ (FAT16). Всё работает. Провожу слудующий тест на запись:
1. открыл файл
2. f_lseek,
3. f_write
4. f_sync
5. вернуться к п.2
Записываю блок за блоком по 24 байта файл размером в 1МБайт. При таком тесте получаю скорость записи около 1400-2000Байт/с. Понимаю, что записываю блоками менее 512Байт, понимаю ограничение организации файловой системы и самой флэш-памяти. Хотелось бы узнать у уважаемых форумчан результаты аналогичного теста с малыми блоками.
sonycman
А с какой скоростью у Вас будет идти запись полновесными блоками?
К примеру, по 4 - 8 килобайт?

Обязательно ли выполнять f_sync для каждых 24 байт?
Altemir
sonycman
У меня логгер на работе, блоки больше 1040Байт не пробовал. Создам полоценный тест с разными размерами блоков в пн-вт. На 1040Байтах скорость была порядка 28-36КБайт/с. Есть утилита под винды, тестирует любой диск на запись методом: открыть файл, записать, закрыть (в описании сказано, по крайней мере). Она на данной флэхе выдавала похожие результаты:
Код
Block= 64 B.  Speed=2.112 kB/s.
Block=128 B.  Speed=4.222 kB/s.
Block=256 B.  Speed=8.447 kB/s.
Block=512 B.  Speed=16.833 kB/s.
Block=  1 kB. Speed=33.778 kB/s.
Block=  2 kB. Speed=67.332 kB/s.
Block=  4 kB. Speed=134.629 kB/s.
Block=  8 kB. Speed=268.257 kB/s.
Block= 16 kB. Speed=546.677 kB/s.


Цитата
Обязательно ли выполнять f_sync для каждых 24 байт?

Важно не потерять данные (сохранить как можно большее кол-во записей логгера) при отключении питания, а так же важна надёжность записи. Есть, конечно, варианты, проводить периодически по таймеру f_sync, но опасаюсь. Проблема в том, что поток данных непредсказуем, т.е. неизвестна частота появления событий для логгирования. Есть ещё варианты?
demiurg_spb
Цитата(sonycman @ Jan 11 2010, 04:40) *
Хм, весьма стандартный ход.
Неужели никогда не приходилось генерировать таблицы с предпросчитанными данными для исключения реалтаймовых вычислений?
Да таблицы были (тот же CRC и таблицы НСХ датчиков), но они не были в ROM а не в RAM.
Freeuser
У меня вопрос по записи данных на карту. Вроде все делаю как в даташите, шлю стартовый бит, команду записи, затем данные, crc16, end-bit, и жду по DAT_0 crc-статус. Но он почему то не приходит! По DAT_0 ловлю стартовый бит(0), который перед crc status должен быть, но ничего нет! Данные на карту записываются. Но если потом послать карте команду чтения, или еще записи, то ничего не происходит.

У меня вопрос по записи данных на карту. Вроде все делаю как в даташите, шлю стартовый бит, команду записи, затем данные, crc16, end-bit, и жду по DAT_0 crc-статус. Но он почему то не приходит! По DAT_0 ловлю стартовый бит(0), который перед crc status должен быть, но ничего нет! Данные на карту записываются. Но если потом послать карте команду чтения, или еще записи, то ничего не происходит.
KAlex
Просто ждешь, или все таки клоком дергаешь?
Freeuser
Клоком, конечно подергиваю. И ловлю стартовый бит, который перед crc-стутусом должен быть. Но его нету, на DAT0 висит единица..
KAlex
Без кода трудно что либо сказать.
Freeuser
Все, я разобрался наконец...столько времени ушло, а проблема была как всегда мелкая. Я по недосмотру конфигурировал ногу как выход, и при чтении не настраивал ее входом. Спасибо что откликнулись!
gnomik_
Цитата(gnomik_ @ Jan 11 2010, 18:27) *
...Пересмотрю все что написал и напаял.

Чего-то надо ворошить. Сама не заработает.

Результат отпишу....


Разобрался. rolleyes.gif
С питанием сложности были и
шлейфы длинноваты.

SD Standard пишется читается стабильно.
SDHC Менее стабильна в работе почему-то,
хотя и пишется и читается.
Может кто советом поможет почему так?
Может у кого похоже было?

Спасибо.
aaarrr
Рискну предположить, что виноваты все те же шлейфы. А SDHC ведет себя хуже по причине наличия более высокоскоростных драйверов.
gnomik_
Цитата(aaarrr @ Mar 3 2010, 18:23) *
Рискну предположить, что виноваты все те же шлейфы. А SDHC ведет себя хуже по причине наличия более высокоскоростных драйверов.


Спасибо.

Пробую бороться и с тем и с тем rolleyes.gif
Paramon
Извините, но может кому понадобится....

Не ругайте!
aaarrr
Цитата(Paramon @ Mar 9 2010, 11:39) *
Не ругайте!

При всем желании не получится, ибо Unexpected end of archive.
Freeuser
Вылезла проблема неожиданно с SD-картами. До недавнего времени использовались карты Transcend, Apacer. А тут начали поставлять карты Silicon power. И работают они, мягко говоря странно. В компе читаются, пишутся, а на девайсе не проходят инициализацию, не устанавливается бит power-up в OCR. Может быть кто-то сталкивался с такими проблемами?
Код на всякий случай:
CODE

sendCmd(CMD0,0,R1);

ocr_rca=0;

do {

sendCmd(CMD55,0,R1);
resp=sendCmd(ACMD41,ocr_rca,R1);
ocr_rca =resp|(1 << 30);
}while((resp&0x80000000)==0)
KAlex
Силикон - тормозная карта.
Вот мой код. Есть отличия в наличии задержек и CMD8. Силикон работает.
Код
  unsigned short code=5000;
  unsigned int ocr_rca;

  send_comstr( CMD_0, 0, 6);      // R1
  ocr_rca = HC = 0;
  send_comstr( CMD_8, 0x1AA, 17);      // R1
  if (comstr->com == 8) HC = 1;

  do {
    WDT_Reset();
    wait_ms(1);
    send_comstr(CMD_55, 0, 6);    // R1
    wait_ms(1);
    send_comstr(ACMD_41, ocr_rca, 6);
    ocr_rca = (comstr->arg3)|(comstr->arg2<<8)|(comstr->arg1<<16)|(comstr->arg0<<24);
    ocr_rca |= (1 << 30);
    if (code) code--;
    else return 0;
  }  while (!(comstr->arg0 & 0x80));
Freeuser
Хм...добавил задержки, увеличил кол-во циклов ожидания до 5000, а потом и до 10 000, но не завелась sad.gif
KAlex
Тогда проблема не в программе.
Смотри фронты сигналов.

У меня на DAT0-3 кроме подтяжек еще стоят проходные резисторы по 1к.
Freeuser
Так ведь команда и ответ идут по CMD-line. Или Там тоже помимо подтяжек проходные резисторы? С остальными картами работает на ура, засада прям...
KAlex
По CMD только подтяжка 51к.
А как реализован интерфейс с картой? Встроенный?
У меня полностью софтверный, сам пинами дергаю. В этой ветке выкладывал исходник.
Freeuser
У меня тоже софтверно сделано, это я просил Вас в ветке для начинающих выложить исходники). Сейчас сижу играюсь с задержками...Если ничего не выйдет, придется отказаться от использования силикона, хотя на складе партия лежит.
zheka
Господа, не осилю всей темы.
Скажите есть у кого-нибудь проект реализации FAT16 на SD карте для AT91SAM7 для KEIL?
ВОспользовавшись поиском я нашел много чего, но либо без реализации FAT, либо под другой камень, либо под другую среду программирования.
skripach
Цитата
реализации FAT16 на SD

Цитата
Только песня совсем не о том...


Полно может только не Keil
Paramedic
Народ , а кому-нибудь попадались карты, у которых SPI интерфейс не реализован или реализован криво? Есть девайс, работает с большинством карт по SPI, появилась партия карт miniSD no_name, в ридере на ПК проблем нету, в устройствах которые работают по SPI - не видится, даже не проходит процедура стандартной инициализации.
MrYuran
Цитата(Paramedic @ Oct 28 2010, 12:16) *
Народ , а кому-нибудь попадались карты, у которых SPI интерфейс не реализован или реализован криво? Есть девайс, работает с большинством карт по SPI, появилась партия карт miniSD no_name, в ридере на ПК проблем нету, в устройствах которые работают по SPI - не видится, даже не проходит процедура стандартной инициализации.

Может, это SDHC?
Цитата
Карты SDHC не совместимы с карт-ридерами и прочими устройствами, изначально рассчитанными только на SD-карты. А вот устройства, способные работать с SDHC-картами, поддерживают также и SD-карты. Ключевым нововведением для SDHC-карт, позволившим им превзойти объем в 4Гб, стало введение посекторной адресации (аналогично жёстким дискам), в то время как обычные SD-карты имеют побайтную адресацию (как оперативная память) и, соответственно, при 32-х разрядном адресе могут иметь объем не более 4Гб.
VslavX
Цитата(KAlex @ Jan 3 2010, 13:45) *
В свое время тоже намучился с CRC.
Выбирая между табличным и вычислителным методами пришел к компромиссу.
Как мне кажется оптимальным будет вычисление таблицы в ОЗУ и дальнейшая работа с ней.

Недавно ковырялся с полями Галуа характеристики 2^m - полиномиальная арифметика, набрел на оптимальный алгоритм редукции на малочлен, подумалось почему бы не применить его и для CRC. В программной реализации для SD/MMC получилось две симпатичные функции, никаких циклов и таблиц:
CODE

//________________________________________________________________
//
// Обновляет контрольную сумму CRC-7 - x^7 + x^3 + 1
// Быстрый нетабличный вариант потетрадного вычисления
//
HAL_INLINE_FORCED
DWORD
io_mmc_crc7(
DWORD data,
DWORD crc)
{
DWORD tmp;

tmp = (crc ^ (data >> 1)) >> 3;
crc = (crc << 4) | tmp;
crc = crc ^ (tmp << 3);

tmp = ((crc >> 3) ^ data) & 0x0F;
crc = (crc << 4) | tmp;
crc = crc ^ (tmp << 3);
crc &= 0x7F;

return crc;
}

//________________________________________________________________
//
// Обновляет контрольную сумму CRC-16 - x^16 + x^12 + x^5 + 1
// Быстрый нетабличный вариант потетрадного вычисления
//
HAL_INLINE_FORCED
DWORD
io_mmc_crc16(
DWORD data,
DWORD crc)
{
DWORD tmp;

tmp = ((crc ^ (data << 8)) >> 12);
crc = (crc << 4) | tmp;
crc = crc ^ (tmp << 5);
crc = crc ^ (tmp << 12);

tmp = ((crc >> 12) ^ data) & 0x0F;
crc = (crc << 4) | tmp;
crc = crc ^ (tmp << 5);
crc = crc ^ (tmp << 12);

return crc & 0xFFFF;
}

Все проверено на практике - работает smile.gif
Paramedic
Цитата(MrYuran @ Oct 28 2010, 12:32) *
Может, это SDHC?

Нет, не SDHC. Да и в 2-х из 3-х девайсов SDHC поддерживается.
Нашёл такое "Some MicroSD cards do not support SPI mode. " http://en.wikipedia.org/wiki/Secure_Digital
Paramedic
Цитата(Paramedic @ Oct 28 2010, 13:16) *
Нашёл такое "Some MicroSD cards do not support SPI mode. " http://en.wikipedia.org/wiki/Secure_Digital


Похоже вообще беспредел на счёт SPI в SD:
"So far I have only found the cards supplied by Adata do not support SPI and so they will not work if that is the method you are using. "
http://www.microchip.com/forums/m349724-print.aspx
"The SPI support is an option and may be dropped by some manufacturers. "
http://forums.freescale.com/t5/68K-ColdFir...Card/td-p/54401
"So many manufacturers have removed the serial mode completely."
http://e2e.ti.com/support/microcontrollers...66/t/49553.aspx
Altemir
Вот поэтому перед тем, как закупать в наши девайсы в большом кол-ве microSD, мы потратились на 10-ок различных, оценили глючность/быстродействие/совместимость, где надо немного подрихтовали код и только потом делали закупку. На хорошем счету - Toshiba, Transcend. Kingston - ещё та девица, у кого хочет, у тех и покупает память, маркируя под себя. В итоге - от партии к партии может значительно отличаться скорость и наличие "камушков".
Paramedic
Цитата(Altemir @ Oct 30 2010, 17:36) *
Вот поэтому перед тем, как закупать в наши девайсы в большом кол-ве microSD, мы потратились на 10-ок различных, оценили глючность/быстродействие/совместимость, где надо немного подрихтовали код и только потом делали закупку. На хорошем счету - Toshiba, Transcend. Kingston - ещё та девица, у кого хочет, у тех и покупает память, маркируя под себя. В итоге - от партии к партии может значительно отличаться скорость и наличие "камушков".


Мой опыт показывает что даже надписям на карте нельзя верить - что хотят то и пишут китайцы. А среди этого десятка были карты, которые вообще отказались работать по SPI?
Altemir
Цитата(Paramedic @ Oct 31 2010, 10:52) *
Мой опыт показывает что даже надписям на карте нельзя верить - что хотят то и пишут китайцы. А среди этого десятка были карты, которые вообще отказались работать по SPI?

Нет, не было. А мы не надписям на карте верили. Считывали CID, CSD, проверяли по ним. Перед закупкой осведомлялись о наличии той же партиии у поставщика. Поставщик надёжный. Для отрекомендованных выше производителей никаких разбросов в пределах партии нет.
kostyan
Народ, аццы, подскажите плиз в этой теме, чтобы новую не заводить!

Я так понимаю в этой ветке в основном народ пользует SD карту в SPI режиме, в котором потребление карты не такое большое...
Пользую AT91SAM3U4. Пользую тамошний "High Speed Multimedia Card Interface", который о шести ногах: "CLK, CMD, DAT0, DAT1, DAT2, DAT3". Обратно пользую атмеловский пример работы с карточкой sdmmc_mci.c/sdmmc_mci.h, который идет в поставке с иаром. Вопрос в потреблении. После инициализации и чтении либо записи данных девайс начинает жрать на 20-30 мА больше, что собственно неприемлимо. Если "выключить" карточку командой Cmd12, то повышеное потребление прекращается. Но при этом для дальнейшей работы с карточкой необходимо заново её инициализировать. Выключение + инициализация в сумме занимают приличное время (по ощущениям на глаз). Есть какойто другой, быстрый способ снизить потребление SD карты кроме как командой Cmd12?
prussta
Хочу поделиться своими результатами при работе с модулем TE-STM32F103 (красная). Мне нужно было запустить microSD через SDIO. Использую Keil v.4, файлы из библиотеки ST. При инициализации карты получила SD_INVALID_VOLTRANGE. Замерила U - оказалось на карту идет 1,8В! Это все транзистор Q3 оказался! Посадила PB0 на "0" - на карту пошло 3,3В.Это то что нужно). Потом пыталась прикрутить FATFS - но тут что-то не получилось...видела ошибку FR_NO_FILESYSTEM. Не без помощи добрых людей(Спасибо огромное Ивану Кузнецову!) в итоге Fatfs был укращен ))). Если кому нужно, могу поделиться проектом. http://narod.ru/disk/39273363001/microSD_FatFS.rar.html
Alhen
QUOTE (prussta @ Feb 1 2012, 13:22) *
Хочу поделиться своими результатами при работе с модулем TE-STM32F103 (красная). Мне нужно было запустить microSD через SDIO.

Спасибо за пример, для меня очень кстати. Мне тоже нужен microSD через SDIO для STM32F103VCT6. Осваивать SD карту, я начал по тому же принципу по которому "ищут не там где потерял, а там где светлее", т.е. через SPI, уж очень много по этой теме информации. А вот с SDIO маловато. rolleyes.gif
В моем приложении требуется по возможности избегать прерываний (по крайней мере не трогать Systick), в вашем проекте disk_timerproc задушен, а SDIO обробатывается по прерыванию, интересно, можно ли SDIO сделать полингом?
А кто-нибудь пробывал делать стейт-машины для SD карт?
sonycman
Цитата(kostyan @ Nov 1 2010, 16:34) *
Есть какойто другой, быстрый способ снизить потребление SD карты кроме как командой Cmd12?

CMD12, если мне не изменяет память, это STOP_TRANSMISSION. После нее не надо делать никакую инициализацию.
prussta
Привет, всем! Кто-нибудь делал поддержку длинного имени файлов у fatfs? У меня не получается.Ставлю _USE_LFN =1 , добавляю функции ff_convert() и ff_wtoupper(). А имена так и остались короткими? Что делаю не так ?
skripach
Память выделить под длинное имя и показать fatfs где эта память.
sherr
stm32 - это хорошо, сам недавно вязал F4Discovery c SD по SPI, и огрызок FAT16 прикручивал (читает только из корня, только короткие
имена и непрерывные цепочки кластеров, зато свое и для моей задачи хватило) rolleyes.gif
А вот нет ли у кого рабочего примера LPC2478 + MCI (достаточно чтения - записи блока)
IgorKossak
Цитата(prussta @ Jun 25 2012, 16:52) *
Привет, всем! Кто-нибудь делал поддержку длинного имени файлов у fatfs? У меня не получается.Ставлю _USE_LFN =1 , добавляю функции ff_convert() и ff_wtoupper(). А имена так и остались короткими? Что делаю не так ?

Доргая prussta.
Поскольку у Вас ещё нет личного ящика, напишу здесь.
Не нужно дублировать сообщения в разных темах форума.
Во избежание недоразумений в будущем настоятельно рекомендую прочитать правила.
Искренне Ваш,
Модератор
Lotor
Цитата(sherr @ Jun 25 2012, 22:23) *
А вот нет ли у кого рабочего примера LPC2478 + MCI (достаточно чтения - записи блока)

Драйвер можно найти, например, и в примерах Кейла и у того же Чана и в книжке Тревора Мартина. Еще в сети есть ресурс Мартина Томаса. Гугл в помощь. =)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.