SD, SDHC
SD, SDHC
Доброго всем времени суток!
Столкнулся со следующй проблемой при работе с SD SDHC картами на ATMEGA8L. Доки на них вроде одни и те же, но с SDHC как оказалось всё не так просто как с его младшим собратом. SD удаётся инициализировать заставить мегу читать с неё и писать в неё данные, однако при подключении SDHC всё веселье заканчивается еще на CMD0 - команде reset карты. то есть попросту карта не отвечает, и другие карты (SDHC 4 Gb) так же. Если ктото имел дело с SD а в особенности SDHC картами отпишитесь если не затруднит - ярсскажу что я делал, может быть ошибочка найдется ,- по крайней мере надеюсь пойму где я застопорился
заранее спасибо
Столкнулся со следующй проблемой при работе с SD SDHC картами на ATMEGA8L. Доки на них вроде одни и те же, но с SDHC как оказалось всё не так просто как с его младшим собратом. SD удаётся инициализировать заставить мегу читать с неё и писать в неё данные, однако при подключении SDHC всё веселье заканчивается еще на CMD0 - команде reset карты. то есть попросту карта не отвечает, и другие карты (SDHC 4 Gb) так же. Если ктото имел дело с SD а в особенности SDHC картами отпишитесь если не затруднит - ярсскажу что я делал, может быть ошибочка найдется ,- по крайней мере надеюсь пойму где я застопорился
заранее спасибо
Re: SD, SDHC
какая последовательность комманд инициализации используется?
Re: SD, SDHC
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 . не говоря уже об остальном до чего код просто не доходит
Re: SD, SDHC
это начало инита для ММС...
для 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.
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.
для 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.
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
http://avrlab.com/node/156
тут есть по-русски инфа, как читать и как писать на карту.
тут есть по-русски инфа, как читать и как писать на карту.
теплый ламповый кот
Re: SD, SDHC
zvyagaaa писал(а):http://avrlab.com/node/156
тут есть по-русски инфа, как читать и как писать на карту.
спасибо , как раз вовремя)) Все проблемы описанные в статье у меня возникали, приходилось решать самостоятельно.. Эх, всё таки не нужно изменять принципу - прочитай ВСЁ что относится к данной тематике прежде чем начинать что то делать..) Сейчас всё работает, причём даже на 32 ГБ - флехе с 1024 байт сектроами. Всем спасибо. Советов никому не дам напоследок - все они находятся в ссылках приведенных в этой теме. Могу дать только 1 доп совет - на некоторых картах команды CMD 0-90 не проходят с первого раза - это не значит что что то неправильно, просто нужно послать их возможно до 10-ти раз прежде чем возвращать ошибку инициализации четиния и тд и тп. Встречается не часто, но я напоролся
Re: SD, SDHC
спасибо , как раз вовремя)) Все проблемы описанные в статье у меня возникали, приходилось решать самостоятельно.. Эх, всё таки не нужно изменять принципу - прочитай ВСЁ что относится к данной тематике прежде чем начинать что то делать..)
не сказал бы... то что вывел сам (пусть и с опозданием и с затратой сил) останется в голове, а то что вычитал, скопировал и применил, в следущем же проекте - заставить опять читать, вспоминать и тд...
p.s. IMHO разумеется...
Re: SD, SDHC
Всем добрый день.
Скажите, кто нибудь работал с micro-SD картами памяти, тонкие котоыре, 1.3мм? Карта обычная SD, 2Гб, не SDHC.
Интересует вопрос, можно ли на нее писать по одному байту или только блоками по 512 байт?
Согласно документации вроде можно установить размер блока меньший 512 байт, командой CMD16(SET_BLOCK_LEN). Устанавливаю, карта принимает это значение, не ругается. А когда командой CMD24 (WRITE_BLOCK) пытаюсь передать адрес начала записи, то ответ R1=96, т.е. address error + parameter error. В доке написано что эти ошибки выдаются когда адрес записи не выровнян с началом блока.
По одному байту нужно писать, что-бы не загружать ОЗУ в МК (использую мегу 64).
Заранее спасибо!
Скажите, кто нибудь работал с micro-SD картами памяти, тонкие котоыре, 1.3мм? Карта обычная SD, 2Гб, не SDHC.
Интересует вопрос, можно ли на нее писать по одному байту или только блоками по 512 байт?
Согласно документации вроде можно установить размер блока меньший 512 байт, командой CMD16(SET_BLOCK_LEN). Устанавливаю, карта принимает это значение, не ругается. А когда командой CMD24 (WRITE_BLOCK) пытаюсь передать адрес начала записи, то ответ R1=96, т.е. address error + parameter error. В доке написано что эти ошибки выдаются когда адрес записи не выровнян с началом блока.
По одному байту нужно писать, что-бы не загружать ОЗУ в МК (использую мегу 64).
Заранее спасибо!
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).
Заранее спасибо!
По 1 байту записывать можно. Но при этом рассчитывать размер кластера 512 байт, и записывать побайтно, а не указывая диапазон.
Не умеешь - не берись, но не взявшись не научишься...
Re: SD, SDHC
Что-то не совсем понял.
Вы говорите о SINGLE_BLOCK_WRITE? На данный момент я так и записываю, передаю адрес кластреа, точнее адрес первого байта в этом кластере т.к. это SDSC карта. А потом передаю карте 512 байт. Она их успешно записывает. Потом успешно читает.
У меня вопрос, можно ли, и если можно, то как, настроить карту на запись-чтение по одному байту? Скажем так, что-бы размер кластера был равне 1 байту, а не 512 как есть сейчас?
MULTIPLE_BLOCK_WRITE мне не подходит, т.к. ввиду нехватки рама. Да и сообщения которые нужно писать занимают до 200х байт.
Вы говорите о SINGLE_BLOCK_WRITE? На данный момент я так и записываю, передаю адрес кластреа, точнее адрес первого байта в этом кластере т.к. это SDSC карта. А потом передаю карте 512 байт. Она их успешно записывает. Потом успешно читает.
У меня вопрос, можно ли, и если можно, то как, настроить карту на запись-чтение по одному байту? Скажем так, что-бы размер кластера был равне 1 байту, а не 512 как есть сейчас?
MULTIPLE_BLOCK_WRITE мне не подходит, т.к. ввиду нехватки рама. Да и сообщения которые нужно писать занимают до 200х байт.
Re: SD, SDHC
CMD16(SET_BLOCK_LEN) - выдаете эту команду, и соответственно выбираете количество байт для записи/чтения.
WRITE_BLK_MISALIGN и READ_BLK_MISALIGN - эти биты проверьте в регистре CSD, они должны быть сброшены, если это не так - сделайте, чтобы было так.
Посмотрите, осталась ли проблема.
WRITE_BLK_MISALIGN и READ_BLK_MISALIGN - эти биты проверьте в регистре CSD, они должны быть сброшены, если это не так - сделайте, чтобы было так.
Посмотрите, осталась ли проблема.
Не умеешь - не берись, но не взявшись не научишься...
Re: SD, SDHC
CMD16 слал, она принимается, в вот misalign'ы я не проверял и не менял.
Возможно это поможет, надеюсь проблема в них.
Попробую сегодня вечером.
Спасибо!
Возможно это поможет, надеюсь проблема в них.
Попробую сегодня вечером.
Спасибо!
Re: SD, SDHC
Вот уже проблема.
использую подобную карту:
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 регистра напсано, что это бит только для чтения.
Наверное в этой карте так не получится....
использую подобную карту:
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 регистра напсано, что это бит только для чтения.
Наверное в этой карте так не получится....