SD, SDHC

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
HeLiO
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Пн дек 27, 2010 14:37:38

SD, SDHC

Сообщение HeLiO »

Доброго всем времени суток!

Столкнулся со следующй проблемой при работе с SD SDHC картами на ATMEGA8L. Доки на них вроде одни и те же, но с SDHC как оказалось всё не так просто как с его младшим собратом. SD удаётся инициализировать заставить мегу читать с неё и писать в неё данные, однако при подключении SDHC всё веселье заканчивается еще на CMD0 - команде reset карты. то есть попросту карта не отвечает, и другие карты (SDHC 4 Gb) так же. Если ктото имел дело с SD а в особенности SDHC картами отпишитесь если не затруднит - ярсскажу что я делал, может быть ошибочка найдется ,- по крайней мере надеюсь пойму где я застопорился
заранее спасибо
Fighter
Встал на лапы
Сообщения: 94
Зарегистрирован: Ср авг 01, 2007 13:32:33

Re: SD, SDHC

Сообщение Fighter »

какая последовательность комманд инициализации используется?
HeLiO
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Пн дек 27, 2010 14:37:38

Re: SD, SDHC

Сообщение HeLiO »

Fighter писал(а):какая последовательность комманд инициализации используется?

как я уже говорил я пробовал сделать так же как и с SD:

uint8_t mmc_init(void) //SDHC
{
int i;
int bl_size=512;

// setup I/O ports

//SPI_PORT &= ~((1 << MMC_SCK) | (1 << MMC_MOSI)); // low bits
//SPI_PORT |= (1 << MMC_MISO); // high bits



MMC_CS_PORT |= (1 << MMC_CS); // Initial level is high

// MMC_CS_PORT &= ~(1 << MMC_CS); // Initial level is LOW



for(i=0;i<10;i++) // send 80 clocks while card power stabilizes
spi_byte(0xff);
i=100;
while ((spi_byte(0xff) != 0x01) && (--i))
{
//send CMD0 for RESET
mmc_send_command(0,0,0);

}
if (i==0)
{
mmc_clock_and_release(); //послать 80 клоков и выключить CS линию
return 1;
}
/* else
{

}*/

// send CMD8


//
// send CMD1 until we get a 0 back, indicating card is done initializing
//
i = 0xffff; // max timeout

while ((spi_byte(0xff) != 0) && (--i)) // wait for it
{
mmc_send_command(1,0,0); // send CMD1 - activate card init
}

//set block size for 512
/* mmc_clock_and_release(); // clean up

mmc_send_command(16,(bl_size>>16) & 0xFFFF, ((bl_size) & 0x0000FFFF) & 0xFFFF);
if (mmc_get() != 0x00)
return 3; */

mmc_clock_and_release(); // clean up

if (i == 0) // if we timed out above
return 2; // return failure code

return 0;
}


возвращает код 1 - то есть карта не принимает команду reset . не говоря уже об остальном до чего код просто не доходит
Fighter
Встал на лапы
Сообщения: 94
Зарегистрирован: Ср авг 01, 2007 13:32:33

Re: SD, SDHC

Сообщение Fighter »

это начало инита для ММС...
для SD надо cmd0 затем ACMD41 ну и тд.
гляньте библиотеку от elm-chan(находится гуглем на раз (fatFS)
там и mmc и sd реализованы.


вот кусок из даташита на sdhc.
To initialize the Toshiba SD card, follow the following procedure is recommended example.
1) Supply Voltage for initialization.
Host System can apply the Operating Voltage from initialization to the card.
Apply more than 74 cycles of Dummy-clock to the SD card.
2) Select operation mode (SD mode or SPI mode)
In case of SPI mode operation, host should drive 1 pin (CD/DAT3) of SD Card I/F to “Low” level. Then, issue CMD0.
In case of SD mode operation, host should drive or detect 1 pin of SD Card I/F (Pull up register of 1 pin is pull
up to “High” normally).
Card maintain selected operation mode except re-issue of CMD0 or power on below is SD mode initialization procedure.
3) Send the ACMD41 with Arg = 0 and identify the operating voltage range of the Card.
4) Apply the indicated operating voltage to the card.
Reissue ACMD41 with apply voltage storing and repeat ACMD41 until the busy bit is cleared.
(Bit 31 Busy = 1) If response time out occurred, host can recognize not SD Card.
5) Issue the CMD2 and get the Card ID (CID).
Issue the CMD3 and get the RCA. (RCA value is randomly changed by access, not equal zero)
6) Issue the CMD7 and move to the transfer state.
If necessary, Host may issue the ACMD42 and disabled the pull up resistor for Card detect.
7) Issue the ACMD13 and poll the Card status as SD Memory Card. Check SD_CARD_TYPE value. If significant 8 bits
are “all zero”, that means SD Card. If it is not, stop initialization.
8) Issue CMD7 and move to standby state.
Issue CMD9 and get CSD.
Issue CMD10 and get CID.
9) Back to the Transfer state with CMD7.
Issue ACMD6 and choose the appropriate bus-width.
Аватара пользователя
zvyagaaa
Встал на лапы
Сообщения: 111
Зарегистрирован: Пт янв 01, 2010 07:49:31
Откуда: Барнаул-Новокузнецк
Контактная информация:

Re: SD, SDHC

Сообщение zvyagaaa »

http://avrlab.com/node/156
тут есть по-русски инфа, как читать и как писать на карту.
теплый ламповый кот
HeLiO
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Пн дек 27, 2010 14:37:38

Re: SD, SDHC

Сообщение HeLiO »

zvyagaaa писал(а):http://avrlab.com/node/156
тут есть по-русски инфа, как читать и как писать на карту.

спасибо , как раз вовремя)) Все проблемы описанные в статье у меня возникали, приходилось решать самостоятельно.. Эх, всё таки не нужно изменять принципу - прочитай ВСЁ что относится к данной тематике прежде чем начинать что то делать..) Сейчас всё работает, причём даже на 32 ГБ - флехе с 1024 байт сектроами. Всем спасибо. Советов никому не дам напоследок - все они находятся в ссылках приведенных в этой теме. Могу дать только 1 доп совет - на некоторых картах команды CMD 0-90 не проходят с первого раза - это не значит что что то неправильно, просто нужно послать их возможно до 10-ти раз прежде чем возвращать ошибку инициализации четиния и тд и тп. Встречается не часто, но я напоролся
Fighter
Встал на лапы
Сообщения: 94
Зарегистрирован: Ср авг 01, 2007 13:32:33

Re: SD, SDHC

Сообщение Fighter »

спасибо , как раз вовремя)) Все проблемы описанные в статье у меня возникали, приходилось решать самостоятельно.. Эх, всё таки не нужно изменять принципу - прочитай ВСЁ что относится к данной тематике прежде чем начинать что то делать..)


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


p.s. IMHO разумеется...
Аватара пользователя
zebrox
Встал на лапы
Сообщения: 117
Зарегистрирован: Вс апр 12, 2009 22:40:37

Re: SD, SDHC

Сообщение zebrox »

Всем добрый день.

Скажите, кто нибудь работал с micro-SD картами памяти, тонкие котоыре, 1.3мм? Карта обычная SD, 2Гб, не SDHC.
Интересует вопрос, можно ли на нее писать по одному байту или только блоками по 512 байт?

Согласно документации вроде можно установить размер блока меньший 512 байт, командой CMD16(SET_BLOCK_LEN). Устанавливаю, карта принимает это значение, не ругается. А когда командой CMD24 (WRITE_BLOCK) пытаюсь передать адрес начала записи, то ответ R1=96, т.е. address error + parameter error. В доке написано что эти ошибки выдаются когда адрес записи не выровнян с началом блока.

По одному байту нужно писать, что-бы не загружать ОЗУ в МК (использую мегу 64).

Заранее спасибо!
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Re: SD, SDHC

Сообщение Arlleex »

zebrox писал(а):Всем добрый день.

Скажите, кто нибудь работал с micro-SD картами памяти, тонкие котоыре, 1.3мм? Карта обычная SD, 2Гб, не SDHC.
Интересует вопрос, можно ли на нее писать по одному байту или только блоками по 512 байт?

Согласно документации вроде можно установить размер блока меньший 512 байт, командой CMD16(SET_BLOCK_LEN). Устанавливаю, карта принимает это значение, не ругается. А когда командой CMD24 (WRITE_BLOCK) пытаюсь передать адрес начала записи, то ответ R1=96, т.е. address error + parameter error. В доке написано что эти ошибки выдаются когда адрес записи не выровнян с началом блока.

По одному байту нужно писать, что-бы не загружать ОЗУ в МК (использую мегу 64).

Заранее спасибо!

По 1 байту записывать можно. Но при этом рассчитывать размер кластера 512 байт, и записывать побайтно, а не указывая диапазон.
Не умеешь - не берись, но не взявшись не научишься...
Аватара пользователя
zebrox
Встал на лапы
Сообщения: 117
Зарегистрирован: Вс апр 12, 2009 22:40:37

Re: SD, SDHC

Сообщение zebrox »

Что-то не совсем понял.

Вы говорите о SINGLE_BLOCK_WRITE? На данный момент я так и записываю, передаю адрес кластреа, точнее адрес первого байта в этом кластере т.к. это SDSC карта. А потом передаю карте 512 байт. Она их успешно записывает. Потом успешно читает.

У меня вопрос, можно ли, и если можно, то как, настроить карту на запись-чтение по одному байту? Скажем так, что-бы размер кластера был равне 1 байту, а не 512 как есть сейчас?


MULTIPLE_BLOCK_WRITE мне не подходит, т.к. ввиду нехватки рама. Да и сообщения которые нужно писать занимают до 200х байт.
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Re: SD, SDHC

Сообщение Arlleex »

CMD16(SET_BLOCK_LEN) - выдаете эту команду, и соответственно выбираете количество байт для записи/чтения.
WRITE_BLK_MISALIGN и READ_BLK_MISALIGN - эти биты проверьте в регистре CSD, они должны быть сброшены, если это не так - сделайте, чтобы было так.
Посмотрите, осталась ли проблема.
Не умеешь - не берись, но не взявшись не научишься...
Аватара пользователя
zebrox
Встал на лапы
Сообщения: 117
Зарегистрирован: Вс апр 12, 2009 22:40:37

Re: SD, SDHC

Сообщение zebrox »

CMD16 слал, она принимается, в вот misalign'ы я не проверял и не менял.
Возможно это поможет, надеюсь проблема в них.

Попробую сегодня вечером.
Спасибо!
Аватара пользователя
zebrox
Встал на лапы
Сообщения: 117
Зарегистрирован: Вс апр 12, 2009 22:40:37

Re: SD, SDHC

Сообщение zebrox »

Вот уже проблема.
использую подобную карту:
http://html.alldatasheet.com/html-pdf/329960/TRANSCEND/TS2GUSD-P3/5934/12/TS2GUSD-P3.html

В этом даташите на стр. 12 написано:
WRITE_BLK_MISALIGN
Defines if the data block to be written by one command can be spread over more than one physical block of the
memory device. The size of the memory block is defined in WRITE_BL_LEN.
WRITE_BLK_MISALIGN=0 signals that crossing physical block boundaries is invalid.
WRITE_BLK_MISALIGN=1 signals that crossing physical block boundaries is allowed.
ок.

Но на странице 9. в описании CSD регистра напсано, что это бит только для чтения.
Наверное в этой карте так не получится.... :(
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»