Полная версия этой страницы:
запись по SPI
Kruftin
Mar 14 2013, 10:05
Подскажите возможно ли реализовать запись и чтение с помощью интерфейса SPI на microSD карту без реализации на ней файловой системы FAT32. Т.е. как с контроллера просто использовать microSD карту для хранения данных. Если обязательно нужно организовывать файловую систему, то подскажите поподробнее как это сделать, заранее благодарен за полезные ссылки. Сейчас разбираюсь с модулем FatFS
aaarrr
Mar 14 2013, 10:11
Файловую систему создавать не обязательно, можно работать просто как с "памятью".
Kruftin
Mar 14 2013, 10:59
Не подскажите как, поподробнее?
aaarrr
Mar 14 2013, 12:21
Пример можно подсмотреть в том же FatFS. Вам просто нужно взять самый нижний уровень и использовать его по своему усмотрению.
Слесарь
Mar 14 2013, 12:32
А хорошо когда полноценная FS , данные можно с легкостью вводить/редактировать с ПК
polyname
Mar 14 2013, 16:31
Цитата
Не подскажите как, поподробнее?
CMD17/18/24/25:
http://elm-chan.org/docs/mmc/mmc_e.html
Kruftin
Mar 15 2013, 05:35
Тогда ещё вопрос: после того как записали блок в 512 байт в команде на запись какой будет следующий адрес блока(не 0x201 будет его значение)?
А по структуре регистров CSD, CID почитать в документации общей на SD карты?
http://www.piclist.ru/S-MMC-SD-Cards-RUS/S...-Cards-RUS.html
haker_fox
Mar 16 2013, 06:19
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.
aaarrr
Mar 16 2013, 07:00
Цитата(haker_fox @ Mar 16 2013, 10:19)

З.Ы. Я надеюсь, Вы в курсе, что есть карты, которые не поддерживают блоки по 512 байт.
Вот таких карт как раз нет: любая обязана поддерживать 512 байт.
Цитата(haker_fox @ Mar 16 2013, 10:19)

Там нужно побайтно задавать адреса. Сам плохо в этом разбираюсь, так как работал с SDHC.
Адресация - это несколько из другой оперы: в HC передается номер блока, в "обычных" - его адрес.
haker_fox
Mar 16 2013, 11:32
QUOTE (aaarrr @ Mar 16 2013, 16:00)

Вот таких карт как раз нет: любая обязана поддерживать 512 байт.
Здорово! Вот и мое незнание вылечили!
QUOTE (aaarrr @ Mar 16 2013, 16:00)

Адресация - это несколько из другой оперы: в HC передается номер блока, в "обычных" - его адрес.
Ага, теперь я понял, что неправильно понял спецификацию... Ну чтож, истина всплывает

З.Ы. Когда занимался написание драйвера для LPC24x8, прочесывал форум на момент различных тонких моментов. Отметил Вашу высокую активность в темах по SD-картам. Как я понял, Вы на них собаку съели?! Очень уж у Вас информативные, и познавательные сообщения и советы!
aaarrr
Mar 16 2013, 11:53
Цитата(haker_fox @ Mar 16 2013, 15:32)

З.Ы. Когда занимался написание драйвера для LPC24x8, прочесывал форум на момент различных тонких моментов. Отметил Вашу высокую активность в темах по SD-картам. Как я понял, Вы на них собаку съели?! Очень уж у Вас информативные, и познавательные сообщения и советы!
Собака - она сама по себе съедается, когда нужно, чтобы в устройстве работала
любая SD-карта
Kruftin
Mar 19 2013, 06:34
Тогда ещё такой вопрос при посылке пакета после data token следуют данные пакета, так вот их размер от 1 до 2048 байт. Т.е. при отключенном контроле CRC как карточка поймёт, что вот я послал пакет из 5 байт например и мне нужно прислать ответ? Конечно в документации написано, что в конце стоит стоп бит единица, ну т.е. если отключён контроль CRC, то нужно послать два нулевых байта и один бит единицу после этого?
aaarrr
Mar 19 2013, 07:25
Цитата(Kruftin @ Mar 19 2013, 10:34)

при посылке пакета после data token следуют данные пакета, так вот их размер от 1 до 2048 байт.
Лучше считать, что для данных этот размер всегда 512 байт. Карт, поддерживающих произвольные размеры блоков, практически не встречается.
Цитата(Kruftin @ Mar 19 2013, 10:34)

нужно послать два нулевых байта и один бит единицу после этого?
Только не бит, а байт 0xFF. В SPI режиме всегда передаются байты.
Kruftin
Mar 19 2013, 07:45
Ну SPI умеет делать посылки и по 4 бита, но тут то мне нужно получается послать два байта контроля и байт единиц и только после этого послать ещё запрос на считывание байта ответа так?
aaarrr
Mar 19 2013, 12:23
Цитата(Kruftin @ Mar 19 2013, 11:45)

Ну SPI умеет делать посылки и по 4 бита, но тут то мне нужно получается послать два байта контроля и байт единиц и только после этого послать ещё запрос на считывание байта ответа так?
Пардон, с SD-режимом спутал. Не нужен байт единиц, токен приходит сразу после CRC.
Kruftin
Mar 20 2013, 05:32
Дак тогда ошибки будут возможны, поскольку как microSD отличит CRC от данных(интересуют случаи когда контроль отключён и включён)?
aaarrr
Mar 20 2013, 06:21
А как она может "не отличить", если размер блока фиксирован?
Kruftin
Mar 20 2013, 06:25
А точно, что-то я про это забыл. Всё теперь понятно, буду пробовать что-то записать и считать пока в одноблочном режиме.
polyname
Mar 20 2013, 07:39
вот кусок кода определения типа и размера карты из содержимого 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 - посекторная.
Kruftin
Mar 22 2013, 09:13
А адрес блока для команд 17,18, 24 как формируется, если блок по 512 байт? Т.е. посылаю команду и указываю для первого блока адрес 1, а для второго 2 или 1, а затем 513?
polyname
Mar 22 2013, 12:37
для карт V1 (<4G) передается адрес байта - 0, 512, 1024, ... (т.е. номер сектора сдвигается на 9бит)
для V2 (>=4G) - 0,1,2,3...
Kruftin
Mar 23 2013, 10:04
Инициализация прошла, а вот запись что-то не проходит. Послал Data Token как для команды 24, на следующей посылке получил ответ нули (вопрос на какой посылке надо считать ответ token? ) и затем получаю всякие разные данные при отправке моих посылок всего 512 байт это нормально? после отправки СRC в ответе все FF. Карточка на 1Гб, карточка на 2Гб вообще отказалась сброситься.
polyname
Mar 23 2013, 12:32
Цитата
вопрос на какой посылке надо считать ответ token?
первый полученный байт с нулевым битом 7 - это R1:

после получения R1 перед передачей Data Packet нужно послать минимум 1 пустой байт 0xFF:

также неплохо посылать 0xFF после каждой команды.
Kruftin
Mar 24 2013, 07:09
Я делаю следующее:
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 25 2013, 07:02
Карточка на 2Гб почему-то совсем не откликается на CMD0 (
Всё работает

была ошибка в коде...
Kruftin
Apr 3 2013, 12:57
Вопрос в следующем: при записи по SPI я пишу несколько мегабайт и на пути могут встретиться бэд кластеры, то они будут проигнорированы(заменены контроллером внутри микроСД на рабочие) или просто запись в них не пройдёт и надо для всех данных включить CRC?
Kruftin
Apr 5 2013, 09:19
Ещё вопрос по многоблочному чтению:
после посылки команды CMD12 на завершение чтения приходит ответ 0х00, а затем на линии держится высокий уровень, т.е. нет ожидания в один байт и сигнала busy, но всё считалось и верно. Может кто сталкивался с этим?
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.