Jump to content

    
Sign in to follow this  
rain1975

SD Card - програмная реализация интерфейса

Recommended Posts

У меня тоже софтверно сделано, это я просил Вас в ветке для начинающих выложить исходники). Сейчас сижу играюсь с задержками...Если ничего не выйдет, придется отказаться от использования силикона, хотя на складе партия лежит.

Share this post


Link to post
Share on other sites

Господа, не осилю всей темы.

Скажите есть у кого-нибудь проект реализации FAT16 на SD карте для AT91SAM7 для KEIL?

ВОспользовавшись поиском я нашел много чего, но либо без реализации FAT, либо под другой камень, либо под другую среду программирования.

Share this post


Link to post
Share on other sites

Народ , а кому-нибудь попадались карты, у которых SPI интерфейс не реализован или реализован криво? Есть девайс, работает с большинством карт по SPI, появилась партия карт miniSD no_name, в ридере на ПК проблем нету, в устройствах которые работают по SPI - не видится, даже не проходит процедура стандартной инициализации.

Share this post


Link to post
Share on other sites
Народ , а кому-нибудь попадались карты, у которых SPI интерфейс не реализован или реализован криво? Есть девайс, работает с большинством карт по SPI, появилась партия карт miniSD no_name, в ридере на ПК проблем нету, в устройствах которые работают по SPI - не видится, даже не проходит процедура стандартной инициализации.

Может, это SDHC?

Карты SDHC не совместимы с карт-ридерами и прочими устройствами, изначально рассчитанными только на SD-карты. А вот устройства, способные работать с SDHC-картами, поддерживают также и SD-карты. Ключевым нововведением для SDHC-карт, позволившим им превзойти объем в 4Гб, стало введение посекторной адресации (аналогично жёстким дискам), в то время как обычные SD-карты имеют побайтную адресацию (как оперативная память) и, соответственно, при 32-х разрядном адресе могут иметь объем не более 4Гб.

Share this post


Link to post
Share on other sites
В свое время тоже намучился с CRC.

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

Как мне кажется оптимальным будет вычисление таблицы в ОЗУ и дальнейшая работа с ней.

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

//________________________________________________________________
//
// Обновляет контрольную сумму 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;
}

Все проверено на практике - работает :)

Share this post


Link to post
Share on other sites
Нашёл такое "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

Share this post


Link to post
Share on other sites

Вот поэтому перед тем, как закупать в наши девайсы в большом кол-ве microSD, мы потратились на 10-ок различных, оценили глючность/быстродействие/совместимость, где надо немного подрихтовали код и только потом делали закупку. На хорошем счету - Toshiba, Transcend. Kingston - ещё та девица, у кого хочет, у тех и покупает память, маркируя под себя. В итоге - от партии к партии может значительно отличаться скорость и наличие "камушков".

 

Share this post


Link to post
Share on other sites
Вот поэтому перед тем, как закупать в наши девайсы в большом кол-ве microSD, мы потратились на 10-ок различных, оценили глючность/быстродействие/совместимость, где надо немного подрихтовали код и только потом делали закупку. На хорошем счету - Toshiba, Transcend. Kingston - ещё та девица, у кого хочет, у тех и покупает память, маркируя под себя. В итоге - от партии к партии может значительно отличаться скорость и наличие "камушков".

 

Мой опыт показывает что даже надписям на карте нельзя верить - что хотят то и пишут китайцы. А среди этого десятка были карты, которые вообще отказались работать по SPI?

Share this post


Link to post
Share on other sites
Мой опыт показывает что даже надписям на карте нельзя верить - что хотят то и пишут китайцы. А среди этого десятка были карты, которые вообще отказались работать по SPI?

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

 

Share this post


Link to post
Share on other sites

Народ, аццы, подскажите плиз в этой теме, чтобы новую не заводить!

 

Я так понимаю в этой ветке в основном народ пользует 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?

Share this post


Link to post
Share on other sites

Хочу поделиться своими результатами при работе с модулем 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

Share this post


Link to post
Share on other sites
Хочу поделиться своими результатами при работе с модулем TE-STM32F103 (красная). Мне нужно было запустить microSD через SDIO.

Спасибо за пример, для меня очень кстати. Мне тоже нужен microSD через SDIO для STM32F103VCT6. Осваивать SD карту, я начал по тому же принципу по которому "ищут не там где потерял, а там где светлее", т.е. через SPI, уж очень много по этой теме информации. А вот с SDIO маловато. :rolleyes:

В моем приложении требуется по возможности избегать прерываний (по крайней мере не трогать Systick), в вашем проекте disk_timerproc задушен, а SDIO обробатывается по прерыванию, интересно, можно ли SDIO сделать полингом?

А кто-нибудь пробывал делать стейт-машины для SD карт?

Share this post


Link to post
Share on other sites
Есть какойто другой, быстрый способ снизить потребление SD карты кроме как командой Cmd12?

CMD12, если мне не изменяет память, это STOP_TRANSMISSION. После нее не надо делать никакую инициализацию.

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this