|
запись по SPI, microSD |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 26)
|
Mar 14 2013, 16:31
|
Частый гость
 
Группа: Участник
Сообщений: 147
Регистрация: 18-05-12
Пользователь №: 71 915

|
Цитата Не подскажите как, поподробнее? CMD17/18/24/25: http://elm-chan.org/docs/mmc/mmc_e.html
|
|
|
|
|
Mar 16 2013, 06:19
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (Kruftin @ Mar 15 2013, 14:35)  Тогда ещё вопрос: после того как записали блок в 512 байт в команде на запись какой будет следующий адрес блока(не 0x201 будет его значение)? А по структуре регистров CSD, CID почитать в документации общей на SD карты? http://www.piclist.ru/S-MMC-SD-Cards-RUS/S...-Cards-RUS.htmlЕсли карта пишет блоками (по 512 байт), то следующий блок Вы можете писать по любому адресу. А как иначе? Если файл фрагментирован, к примеру. Для того, чтобы писать несколько блоков подряд, есть другая команда. Как и на чтение. Другими словами, Вы можете писать и читать либо по одному блоку по любому адресу, либо несколькими блоками подряд. Но команды нужно использовать соответствующие. Про них, ровно как и про регистры, следует читать только в официальной документации на официальном сайте. З.Ы. Я надеюсь, Вы в курсе, что есть карты, которые не поддерживают блоки по 512 байт. Там нужно побайтно задавать адреса. Сам плохо в этом разбираюсь, так как работал с SDHC.
--------------------
Выбор.
|
|
|
|
|
Mar 16 2013, 07:00
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(haker_fox @ Mar 16 2013, 10:19)  З.Ы. Я надеюсь, Вы в курсе, что есть карты, которые не поддерживают блоки по 512 байт. Вот таких карт как раз нет: любая обязана поддерживать 512 байт. Цитата(haker_fox @ Mar 16 2013, 10:19)  Там нужно побайтно задавать адреса. Сам плохо в этом разбираюсь, так как работал с SDHC. Адресация - это несколько из другой оперы: в HC передается номер блока, в "обычных" - его адрес.
|
|
|
|
|
Mar 16 2013, 11:32
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (aaarrr @ Mar 16 2013, 16:00)  Вот таких карт как раз нет: любая обязана поддерживать 512 байт. Здорово! Вот и мое незнание вылечили! QUOTE (aaarrr @ Mar 16 2013, 16:00)  Адресация - это несколько из другой оперы: в HC передается номер блока, в "обычных" - его адрес. Ага, теперь я понял, что неправильно понял спецификацию... Ну чтож, истина всплывает  З.Ы. Когда занимался написание драйвера для LPC24x8, прочесывал форум на момент различных тонких моментов. Отметил Вашу высокую активность в темах по SD-картам. Как я понял, Вы на них собаку съели?! Очень уж у Вас информативные, и познавательные сообщения и советы!
--------------------
Выбор.
|
|
|
|
|
Mar 19 2013, 07:25
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Kruftin @ Mar 19 2013, 10:34)  при посылке пакета после data token следуют данные пакета, так вот их размер от 1 до 2048 байт. Лучше считать, что для данных этот размер всегда 512 байт. Карт, поддерживающих произвольные размеры блоков, практически не встречается. Цитата(Kruftin @ Mar 19 2013, 10:34)  нужно послать два нулевых байта и один бит единицу после этого? Только не бит, а байт 0xFF. В SPI режиме всегда передаются байты.
|
|
|
|
|
Mar 20 2013, 07:39
|
Частый гость
 
Группа: Участник
Сообщений: 147
Регистрация: 18-05-12
Пользователь №: 71 915

|
вот кусок кода определения типа и размера карты из содержимого CSD (в 16-байтовом массиве sd.csd): Код struct { U8 ver; //CSD version: CSD_V1, CSD_V2 U8 csd[16]; //last CSD state (CMD9) U32 sectors; //number of sectors } sd; enum {CSD_V1=0, CSD_V2=1}; void sd_update_csd(void) { sd.sectors = 0; if (sd_ok()) { sd.ver = sd.csd[0] >> 6; if (sd.ver == CSD_V1) { U32 size = 1UL << (sd.csd[5] & 0xF); size *= 1UL << (((sd.csd[9] & 0x3) << 1) + (sd.csd[10] >> 7) + 2); size *= (U32)((((U16)(sd.csd[6] & 3)) << 10) + ((U16)sd.csd[7] << 2) + ((U16)(sd.csd[8] & 0xC0) >> 6) + 1); sd.sectors = size >> 9; } else if (sd.ver == CSD_V2) { sd.sectors = ((((U32)(sd.csd[7] & 0x3F)) << 16) + (((U32)sd.csd[8]) << 8) + (U32)sd.csd[9]) << 10; } } } Для CSD_V1 используется побайтовая адресация (адрес сектора нужно сдвигать влево на 9 бит при чтении/записи), для CSD_V2 - посекторная.
Сообщение отредактировал polyname - Mar 20 2013, 07:45
|
|
|
|
|
Mar 23 2013, 12:32
|
Частый гость
 
Группа: Участник
Сообщений: 147
Регистрация: 18-05-12
Пользователь №: 71 915

|
Цитата вопрос на какой посылке надо считать ответ token? первый полученный байт с нулевым битом 7 - это R1:  после получения R1 перед передачей Data Packet нужно послать минимум 1 пустой байт 0xFF:  также неплохо посылать 0xFF после каждой команды.
Сообщение отредактировал polyname - Mar 23 2013, 12:35
|
|
|
|
|
Mar 24 2013, 07:09
|

Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365

|
Я делаю следующее: 1)Послал команду CMD24( в качестве ответа получил нули см пункты 2-3) 2)Послал 0xFF 2 раза 3)Послал token 0xFE 5)Затем передаю данные пакета циклом по 32 бита за посылку for(i=0;i<128;i++) Первые 20 байт - это принятые данные после посылок(посылаю всегда 0xABCDEF12 ), остальное то, что принято после посылки token(т.е. во время посылки нули) и каждой посылки данных + CRC(и вопрос ещё как я понял по умолчанию СRC отключён?) Ещё раз всё поправил ка надо и в итоге после посылки token 0xFE на 5-ом принятом байте(в это время посылаются данные на запись) вижу значение 0x09, которое говорит об ошибки token - out of range.
Сообщение отредактировал Kruftin - Mar 24 2013, 09:56
Прикрепленные файлы
token.txt ( 3.6 килобайт )
Кол-во скачиваний: 24
|
|
|
|
|
Mar 25 2013, 07:02
|

Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365

|
Карточка на 2Гб почему-то совсем не откликается на CMD0 ( Всё работает  была ошибка в коде...
Сообщение отредактировал Kruftin - Mar 25 2013, 11:40
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|