Перейти к содержанию
    

stm32f10x, FatFs + SDIO + SD card + USB

Здравствуйте! Имеется в наличии отладочная плата от терра электроники на stm32f103, пробую запустить SDIO + SD card + USB. Cкачал с сайта СТ либу usb mass storage device на stm32f10x, поправил под свою плату, запустил, но все работает не совсем так, как хотелось бы. Инициализация карты проходит. В системе появляется съемный диск, размер 0 байт, файловая система RAW, хотя я ее форматировал через FatFs в fat32, размер сектора = 512. При попытке открыть предлагает отформатировать, нажимаю да - появляется окошко, там указан размер карты 3,75гб, стало быть до карты проц достучаться может. Пробую форматировать - вылезает ошибка, не удается завершить форматирование. В чем может быть проблема?

 

Пробовал уменьшать частоту тактирования карты: увеличил делитель с 1 до 0хА - не помогает.

 

И еще вопрос, я скачал библиотеку FatFs и прикрутил к ней низкоуровневые функции stm32f10x - заработало, читает и пишет, создает файлы и форматирует. Теперь, чтобы при соединении через USB с компьютером я мог работать на нем с SD картой мне нужно сделать примерно так:

 

SD карта -> интерфейс обмена данными(SDIO в моем случае) -> драйвер файловой системы(FatFs в моем случае) -> драйвер USB mass storage device -> ПК

я правильно понимаю ситуацию?

Изменено пользователем spectral1989

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

проверьте питание на карте памяти -должно быть 3.3В.

драйвер USB MSD работает с картой напрямую, безо всяких файловых систем.

Еще у них там в проекте 2 штуки LUN, второй если не ошибаюсь -внешняя флешь память, которой нет на вашей плате. Вроде все заработало, когда вычистил все ссылки на эту память, сделал один LUN и подал питание на карточку (там транзистор по питанию не открывался)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С транзистором я разобрался еще когда FatFs ковырял. Ок, попробую почистить LUN. Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверил на всякий случай питание, все ок! 3,3В Сделал один LUN, почистил ссылки, теперь появляется только один съемный диск. Но он по прежнему не доступен для работы:(

 

вот кстати еще такая деталь: карта почему-то не инициализируется на значении SDIO_INIT_CLK_DIV = 0xB2, виснет на функции CmdResp3Error, а конкретно тут:

  while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)))
  {
    status = SDIO->STA;
  }

если увеличить делитель SDIO_INIT_CLK_DIV до 0xF2 - инициализация проходит. хотя в соседнем проекте с FatFs на значении по умолчанию не возникает никаких проблем. Файл с низкоуровневыми функциями(инициализация, чтение) один и тот же.

 

проект Keil

http://disk.tom.ru/h7r3l2k

 

карта 4гб

 

нашел спорный момент. почему-то в функции MAL_GetStatus в файле mass_mal.c каждый раз вызывалась инициализация карты. зачем? поправил ее так:

uint16_t MAL_GetStatus (uint8_t lun)
{
  uint32_t DeviceSizeMul = 0,NumberOfBlocks = 0;;

  if (lun == 0)
  {
    SD_GetCardInfo(&mSDCardInfo);
    DeviceSizeMul = (mSDCardInfo.SD_csd.DeviceSizeMul + 2);

    if(mSDCardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
    {
      Mass_Block_Count[0] = (mSDCardInfo.SD_csd.DeviceSize + 1) * 1024;
    }
    else
    {
      NumberOfBlocks  = ((1 << (mSDCardInfo.SD_csd.RdBlockLen)) / 512);
      Mass_Block_Count[0] = ((mSDCardInfo.SD_csd.DeviceSize + 1) * (1 << DeviceSizeMul) << (NumberOfBlocks/2));
    }
    Mass_Block_Size[0]  = 512;
     
    Mass_Memory_Size[0] = Mass_Block_Count[0] * Mass_Block_Size[0];
//  STM_EVAL_LEDOn(LED2);
    return MAL_OK;
  }
//  STM_EVAL_LEDOn(LED2);
  return MAL_FAIL;
}

но легче не стало

 

 

скачал WinHex. Он определяет, что файловая система Fat32, но стартовый сектор почему-то уехал на 1 сектор. Из-за чего это может быть? Скрин прилагается:

http://disk.tom.ru/fkzggq1

Изменено пользователем spectral1989

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот кстати еще такая деталь: карта почему-то не инициализируется на значении SDIO_INIT_CLK_DIV = 0xB2, виснет на функции CmdResp3Error, а конкретно тут:

  while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)))
  {
    status = SDIO->STA;
  }

если увеличить делитель SDIO_INIT_CLK_DIV до 0xF2 - инициализация проходит. хотя в соседнем проекте с FatFs на значении по умолчанию не возникает никаких проблем. Файл с низкоуровневыми функциями(инициализация, чтение) один и тот же.

А изза какого флага виснет?

 

Кстати вспомнил, я еще увеличивал SD_DATATIMEOUT до 0x007FFFFF (в файле stm32_eval_sdio_sd.c) правда это вроде проявилось только при мультиблоковой записи, но все равно. А какая ревизия платы? Зеленая, красная? снизу платы напаяны резисторы подтяжки SDIO?

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

флаг CMDREND - command responce recieved(CRC check passed) не появляется, FLAG_CTIMEOUT почему-то тоже. на момент, когда останавливаешь выполнение программы status = 0x800 - CMDACT command transfer in progress. причем такой нюанс, запускаешь в отладчике на автовыполнение - он виснет на этом условии, но если остановить и вручную прошагать условие - программа выполняется дальше, пока опять до этого места не дойдет.

 

Покупал недавно, плата красная, на обратной стороне три резистора под разъемом microSD, не знаю подтяжки это или нет.

 

мультиблоковую запись не трогал пока, POLLING mode стоит. без дма даже. а не могли бы вы выложить свой проект?

 

понаставил брэйкпоинтов в низкоуровневой функции чтения внутри условий проверки на ошибки и нашел еще косяк: флаг SD_RX_OVERRUN появляется, когда комп к карте обращается.

Изменено пользователем spectral1989

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

включил hardware flow control и заработало:) ПК думал около минуты перед тем, как определить флешку, видимо контроллер захлебывался от количества запросов. буду пробовать мультиблочную запись/чтение!

 

спасибо за помощь!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

включил hardware flow control и заработало :) ПК думал около минуты перед тем, как определить флешку, видимо контроллер захлебывался от количества запросов. буду пробовать мультиблочную запись/чтение!

 

спасибо за помощь!

если флешка чистая то открывается через 3-4сек. Вообще я проект правил по минимуму, стараясь не трогать то что не знаю. Проект у меня иаровский, для STM3210-EVAL, могу скинуть если еще актуально)

 

Мультиблок в массстораже? Расскажите потом какая скорость получилась. Я так и не придумал как сделать мультиблок в нем, слишком там сложно все закручено.

 

ЗЫ. Да незачто, Вы все сами сделали)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заметил такой глюк: беру архив около 100мб, копирую на SD карту, проверяю контрольные суммы - сходится. Копирую архив с карты на ПК, проверяю контрольные суммы - опять сходится. Делаю безопасное извлечение, вытаскиваю шнур USB, вставляю - карта определяется корректно(правильный размер, есть файл, который я создал с помощью FatFs), но этого архива нет. В чем проблема может быть?

 

Alexashka, пожалуйста скиньте все таки свой проект:)

 

з.ы. мультиблок с ходу не заработал, я его пока отложил

Изменено пользователем spectral1989

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заметил такой глюк: беру архив около 100мб, копирую на SD карту, проверяю контрольные суммы - сходится. Копирую архив с карты на ПК, проверяю контрольные суммы - опять сходится. Делаю безопасное извлечение, вытаскиваю шнур USB, вставляю - карта определяется корректно(правильный размер, есть файл, который я создал с помощью FatFs), но этого архива нет. В чем проблема может быть?

 

Alexashka, пожалуйста скиньте все таки свой проект:)

 

з.ы. мультиблок с ходу не заработал, я его пока отложил

Хм...интересный эффект, как будто данные о созданном файле были занесены в кэш но не прописались в ФАТ таблицу на диске. Попробуйте проделать тоже самое с картой вставив ее в какойнить картридер -может карта глючная. У меня есть карточка (недавно купленная) с которой я не могу удалить файлы, и не могу отформатировать ее. Т.е файлы удаляются, потом вытащишь-вставишь -а они тут как тут, все на месте :biggrin:

Я писал много раз уже, но мелкие файлы, пропадания не замечено. Надо будет попробовать записать большой. Карты у меня на 1,2,4,8 ГБ. Проблем не было никаких. Которая за 4 сек открывается это 4ГБ, класс 10, Трансценд вроде бы.

Сейчас ничего не могу скинуть, проект на работе, так что -до понедельника :)

Есть еще на 2Гб, помню она дольше открывается и пишется, раза в 2 точно если не в 3. Заметил еще такую вещь -если на карте есть мультимедийные файлы то открывание диска затягивается на очень длительное время...

 

ЗЫ. Кстати, а сколько у Вас пишется по времени 100МБ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть еще на 2Гб, помню она дольше открывается и пишется, раза в 2 точно если не в 3.

 

Попробуте форматнуть ее прямо в устройстве, командой f_mkfs - у меня это увеличило скорость записи почти на порядок!

Правда немного другой процессор.

Обсуждалось тут: http://electronix.ru/forum/index.php?showtopic=105763

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

купил несколько новых карт: 2, 4, 8гб разного класса. теперь все определяются быстро, но глюк, когда записываешь что-нибудь на флешку с ПК, вытаскиваешь-вставляешь - файлы пропадают остался. в чем может быть проблема?

Изменено пользователем spectral1989

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

собрал заново проект, все заработало. видимо накосячил где-то, когда второй ЛУН убирал. спасибо всем помогавшим и сочувствующим:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуте форматнуть ее прямо в устройстве, командой f_mkfs - у меня это увеличило скорость записи почти на порядок!

Правда немного другой процессор.

Обсуждалось тут: http://electronix.ru/forum/index.php?showtopic=105763

Похоже у Вас не работает как положено мультиблоковая запись. Если используете драйвер SDIO от ST, то гляньте там между записью блоков в команде CMD25 имеется задержка, у меня тоже скорость была очень низкая, пока я эту задержку не покоцал. Там зачемто сделано ожидание перед опросом состояния записи -возможно чтобы не прерывать процессы в контроллере карты. Вообщем я ее уменьшил в несколько раз и скорость записи теперь достаточно стабильна и пропорциональна только классу карты

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...