|
|
  |
STM32F4 + FatFS + uSD, проблема со скоростью. |
|
|
|
Sep 3 2012, 13:03
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Нужна помощь клуба. Процессор STM32F407VG, 168МГц. Использую SDIO 4 бита на 24Мгц. DMA. Запись/чтение через SD_ReadMultiBlocks/SD_WriteMultiBlocks. На всех сигналах SDIO пуллапы 10к. проверочный код: Код SDInitResult=SD_Init(); if(SDInitResult==SD_OK) LEDOn(LED1); else LEDOn(LED2);
if(SDInitResult==SD_OK){ if ( f_mount( 1, &MSD_fatfs ) != FR_OK ){ LEDOn(LED2); // fatfs initialisation fails }else{ res = f_open(&myfile, "1:test_sd.dat", FA_CREATE_ALWAYS | FA_WRITE);
for(i=0; i<3000;i++){ res=f_write(&myfile, buffer,4096, &bw); }
f_close(&myfile); f_mount(1, NULL); if(res==0) LEDOn(LED2); else LEDOn(LED1); } } Итого, записывается 3тыс блоков по 4096 байт, засекаю секундомером. На флешке PQI 1Gb (FAT) - 36 секунд, получается 340кБайт/сек или 2.7мбит/с На Кингстон 4Gb (FAT32) - 60с, т.е. 200 кБайт/сек, или 1.6мбит/с. Дополнение - при изменении блока с 4к на 16к, на 4гб фат32 флешке те-эе 60 сек., а на 1гб фат16 уменшилось до 12 сек, т.е. 1МБайт/с или 8 МБит/с. У кого какие результаты получались? Я честно говоря, ожидал скорости побольше (хотя для конкретной задачи мне ее хватит. И попутно другой вопрос - я первый раз с FatFs работаю, функия f_write начинается и ждет пока не закончиться запись блока. Т.е оно блокирует на время записи всю программу и не очень понятно зачем тогда DMA? Это можно как-то обойти без OS ?
|
|
|
|
|
Sep 3 2012, 14:15
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(Lotor @ Sep 3 2012, 16:01)  На счет скорости тут на форуме много тем вердикт которых - надо буферизировать и писать большими кусками сразу Насколько "большими" ? Цитата . Надеюсь Вы предусмотрели внешнюю память для этих целей (SDRAM например). Нет, внешней памяти там нет, но буфер до 64к могу выделить. Мне вот еще что непонятно: 1) Почему 1гб флешка почти вдвое быстрее чем 4гб - потому что ФАТ 16 а не ФАТ32? 2) Я писал блокми по 4К, это как раз размер кластера для 4гб флешки. Когда я попробовал писать блоками по 16К - скорость на 1гб флешке увеличилась почти втрое! Достигнув примерно 1МБайт/сек. И это понятно, потому что у нее кластер 16к. А вот для 4гб флешки скорость не изменилась, и это тоже понятно - потому что блок кратен и больше кластера. Но получается, что 1гб флешка с фат16 уже не вдвое а примерно в 5 раз быстрее чем 5гб флешка с фат32! И этого я совершенно не могу понять - обьем передаваемых по DMA данных одинаков, и уж намного больше чем обьем данных таблиц фат. Неужели 32-х разрядный 168МГц процессор не просто во много раз медленее работает с фат32 чем с фат16, а настолько, что это становиться более значимым чем обьем передаваемых данных?! Цитата На счет блокирующей записи - именно из-за неё мне пришлось спешно прикручивать ртос в своё время. Конечно можно выкрутится и без неё, но имхо самое простое решение. В итоге мой девайс пишет видео со скоростью 5 МБайт/с. Нихренассе! У меня максимум 1МБайт/с пока получается, на 1гб флешке с ФАТ16, при блоке равном кластеру (16К). При том, что проц сейчас вообще больше ничего не делает (кроме SysTick прерывания, но там почти ничего нет кроме пары счетчиков и пары флагов). На каком проце у Вас это было ? Может есть еще какой-то "fine tuning" в конфиге FatFs?
|
|
|
|
|
Sep 3 2012, 17:37
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Самое лучшее - найти на электрониксе тему, где это подробно обсуждается более осведомленными людьми. Там примерно говорится, что SD карта вещь в себе, с собственным контроллером, который может по спецификации давать задержки до 250 мс независимо от класса. Чем меньше объем карты, тем меньше вероятность задержек - вот у Вас скорость и выше при 1ГБ карте. Зная задержку можете рассчитать приемлемый буфер для записи. Я пишу по 6 МБайт в фат32, камень указывал - lpc2478. Помимо записи на карту идет поток на tcp, рисуется чб gui на oled, опрашивается емкостная клавиатура, всякие датчики температуры, акселерометр и т.п. - т.е. секрет успеха в большом буфере под запись.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Sep 3 2012, 20:23
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(Lotor @ Sep 3 2012, 19:37)  Самое лучшее - найти на электрониксе тему, где это подробно обсуждается более осведомленными людьми. Пока не нашел. Цитата Там примерно говорится, что SD карта вещь в себе, с собственным контроллером, который может по спецификации давать задержки до 250 мс независимо от класса Это не очень обьясняет, почему на одной карте запись 12МБ идет 12 секунд, а на другой - 60. Цитата . Чем меньше объем карты, тем меньше вероятность задержек - вот у Вас скорость и выше при 1ГБ карте. Зная задержку можете рассчитать приемлемый буфер для записи. Я пишу по 6 МБайт в фат32, камень указывал - lpc2478. Помимо записи на карту идет поток на tcp, рисуется чб gui на oled, опрашивается емкостная клавиатура, всякие датчики температуры, акселерометр и т.п. - т.е. секрет успеха в большом буфере под запись. У Чена есть бенчмарки: http://elm-chan.org/fsw/ff/img/rwtest2.pngТам проц типа Вашего, с 72мгц тактовой, дает при 16К блоках 5.5 МБайт/сек. А тут: http://elm-chan.org/fsw/ff/img/rwtest.png АТМега на 9мгц на 256мб карточке дает при 2К блоках скорость в 300 мбайт/сек, прием я так понимаю это с SPI на 9мгц, а не с SDIO на 25мгц, это выше чем у меня дает 4гб карточка на 168-мегагерцовом проце! Потому я и думаю - что-то тут не так.
|
|
|
|
|
Sep 3 2012, 20:29
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Не так, так не так. Я попытался Вас направить в нужном направлении - случайные задержки до 250 мс по спецификации, буфер по записи для улучшения скорости. Настаивать не буду. =) PS: Одна из тем про время записи
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Sep 4 2012, 04:48
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(Lotor @ Sep 3 2012, 22:29)  Не так, так не так. Я попытался Вас направить в нужном направлении - случайные задержки до 250 мс по спецификации, буфер по записи для улучшения скорости. Настаивать не буду. =) Чем мне конкретно СЕЙЧАС, когда я не пишу реальных данных, а просто переписываю буфер в карточку, поможет его увеличение? Да в и вобще - больший буфер поможет иметь большую постоянную мгновенную. Скорость, но каким образом он может повлиять на среднюю?! Если карточка делает задержу в 0.25с, то потом она должна быстро заглотить данные (накопленные в реальном устройстве за время этой паузы). А средняя скорость даже для класс 2 заявлена 2MB/s. НА 4гб Кингстоне кажется написано класс 4 (доберусь до работы проверю), т..е заявлено уже 4МБ/с, а получается 0.2! Тут: http://elm-chan.org/docs/mmc/mmc_e.html Чен пишет что карточки PQI показали гораздо более высокую скорость чем Панасоник и Тошиба. Про Кингстон - ни слова. Цитата PS: Одна из тем про время записи Спасибо, почитаю.
|
|
|
|
|
Sep 4 2012, 07:38
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(Lotor @ Sep 4 2012, 08:38)  Тема, на которую я дал Вам ссылку должна ответить на все вопросы - особенно посты aaarrr и _3m. Еще раз - не надо пытаться подстроиться под работу контроллера с NAND в конкретной карточки, достаточно знать, что запись может занимать до 250 мс и рассчитать, какой должна быть минимальная порция данных для требуемой скорости. Я прочитал ту тему, и aaarrr там говорит тоже самое, что я только что пытался Вам сказать - задержки и размер буфера НЕ влияют на среднюю скорость записи. Наличие и размер буфера - это только вопрос непрерывности данных в реалтайме (из-за этих задержек), но на среднюю скорость записи это не влияет. P.S. Проверил чтение, с той 4гб флешки что пишется 12МБ за 60с - читаются они за 2 сек, т.е. 6МБ/сек. Значит с железом самого SDIO пробем нет.
|
|
|
|
|
Sep 4 2012, 08:40
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(Allregia @ Sep 4 2012, 11:38)  Наличие и размер буфера - это только вопрос непрерывности данных в реалтайме (из-за этих задержек), но на среднюю скорость записи это не влияет. Абсолютно согласен.  Если речь заходит о критичности скорости записи на карточку, то подразумевается же, что нужна непрерывность.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Sep 4 2012, 10:44
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(Lotor @ Sep 4 2012, 10:40)  Абсолютно согласен.  Если речь заходит о критичности скорости записи на карточку, то подразумевается же, что нужна непрерывность. Так я-то о СРЕДНЕЙ скорости и говорю сейчас. Вопрос непрерывности данных пока не стоит, в конкретном проекте мне хватит и половины нынешней минимальной скорости (100КБайт/с достаточно), и имеющегося буфера хватит на полсекунды, что больше любой паузы флешки. Так что вопрос почему средняя так мала - это не к конкретному проекту а "вообще". Хочется разобраться, на будующее. Добавление:Думаю, это будет многим интересно. Напомню: - 1гб флешка в фат16, кластер 16к при записи 12 мбайт блоками 4к - время 36с (340кЬ/с), блками 16к - 12с (1МБ/с) - 4гб флешка в фат32, кластер 4к при записи 12 мбайт блоками 4к, 16к, 64к - время 60с (200кЬ/с). Форматирование ффлешки 4гб на РС ничего не изменило. А теперь внимание, призовая игра  После форматирования этой флешки через FatFS командой f_mkfs(0,0,0) произшли две вещи: 1) кластер с 4к стал 32к. 2) время записи 12МБ файла изменилось, и стало: блоками 4к - 12с (1МБ/с) блоками 32К - 6с (2МБ). Т.е. как и для первой флешки. когда блок=кластер скорость сильно увеличивается, но даже при 4к блоке при кластере 32к, скорость после форматирования увеличилась в 5 раз, с 0.2 до 1МБ/сек !!!!!
|
|
|
|
|
Sep 4 2012, 14:36
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 3-12-04
Пользователь №: 1 307

|
скорее всего оно форматирует с выравниваением (так чтоб блоки логические не пересекали границы физических страниц в флэшке) http://forum.ixbt.com/topic.cgi?id=27:9465А скорости чтения этого же фалйа не скажете сколько получается? особенно интересно было бы рандомное блоками по 32к например.
Сообщение отредактировал Serg_D - Sep 4 2012, 14:47
|
|
|
|
|
Sep 4 2012, 15:26
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(Serg_D @ Sep 4 2012, 16:36)  скорее всего оно форматирует с выравниваением (так чтоб блоки логические не пересекали границы физических страниц в флэшке) http://forum.ixbt.com/topic.cgi?id=27:9465Это я в курсе. И Чен про это писал, что РС форматирует флешки неправильно. Но вот для 1гб флешки - разницы никакой уже небыло, форматировал я ее на РС или в устройстве. Результат одинаковый. (С 4гб флешкой кроме скорости, еще и размер кластера при этом разный - РС на 4к делала, а по дефолту - 32к). еще интересно. что для 1гб флешки по мере приближения размера блока к размеру кластера, скорость растет кардинально, а для 4гб - кардинальный рост прекращается уже при блоке = 1/4 кластера, а при 1/2 кластера уже снижается медленее: Код Размер блока Скорость записи Скорость записи 1гб флешки, ФАТ16, 1гб флешки, ФАТ32, кластер 16К, MByte/s кластер 32К, MByte/s 512 0.077 0.25 1K 0.1 0.42 2K 0.2 0.82 4K 0.33 1.23 16K (1.03) 2.05 32K 1.03 (2.8) Скобками выделен размер блока равный размеру кластера Цитата А скорости чтения этого же файла не скажете сколько получается? особенно интересно было бы рандомное блоками по 32к например. Нет, не пробовал, только линейное, получил около 2 сек на 12байт файл, но засекал наручными часами, что в районе 2 сек ает болшую погрешность (и в это время входило открытие и закрытие файла). Завтра, если время будет, попробую что Вы просите.
|
|
|
|
|
Sep 4 2012, 16:29
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 3-12-04
Пользователь №: 1 307

|
А частоту клока карты в 48мгц не пробовали ставить?
|
|
|
|
|
Sep 4 2012, 17:03
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(Serg_D @ Sep 4 2012, 18:29)  А частоту клока карты в 48мгц не пробовали ставить? Как? Fsdio = SDIOCLK/(DIV+2); ТАк что минимум 24 получается. В описании написано: * The SD Card frequency (SDIO_CK) is computed as follows: * * +---------------------------------------------+ * | SDIO_CK = SDIOCLK / (SDIO_INIT_CLK_DIV + 2) | * +---------------------------------------------+ * * In transfer mode and according to the SD Card standard, * make sure that the SDIO_CK frequency don't exceed 25MHz * and 50MHz in High-speed mode switch. * To be able to use a frequency higher than 24MHz, you should * use the SDIO peripheral in bypass mode. Refer to the * corresponding reference manual for more details. Я с этим "bypass mode" пока не разобрался. Но думаю, что "булылочное горлышко" пока не в этой частоте.
|
|
|
|
|
Nov 6 2012, 18:40
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Возникла проблема - пока писал на малой скорости все было ОК, потом перешел к скорости побольше, и выяснилось следующее: - говорили не раз, что по стандарты SD может давать задержку до 250мс. - исходя из этого был с хоршим запасом выбран буфер - запись у меня 200КБ/с, буфер примерно на 620мс. - пишу блоками по 4КБ. - uSD 1Gb, отформатирована в самом устройстве, вижу задержки 50-100мс, проблем нет. - uSD Kingston 4Gb, отформатирована в самом устройстве, каждые ~20 секунд возникат задержка в 900-950мс, и естествено моего буфера не хватает. Что теперь делать, не знаю.
|
|
|
|
|
Nov 8 2012, 10:06
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(Allregia @ Nov 8 2012, 13:17)  2) Форматирование в устройстве при помощи FatFS f_mkfs() дает результаты гораздо лучше. Но все же в FatFs форматирование делается как для SD так и для SDHC не на 100% корректно. А что именно не устраивает в f_mkfs()?
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Nov 9 2012, 06:47
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(Allregia @ Nov 8 2012, 19:01)  Проблема описана в #22, #23. Решение проблемы - в #24 Я просто f_mkfs() использую и таких проблем пока не наблюдал. SDFormatter какой размер кластера выставляет?
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Nov 9 2012, 07:47
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(Lotor @ Nov 9 2012, 08:47)  Я просто f_mkfs() использую и таких проблем пока не наблюдал. Если бы у меня был буфер в 2 раза больше, или я писал бы в 2 раза медленее, я бы наверное этого тоже не заметил. Заметил потому что пауза ~1s, а буфер у меня только на 0.6s (чего при моей скорости записи согласно стандарту на карточку должно хватать с 3-е краным запасом!) Цитата SDFormatter какой размер кластера выставляет? Тот же самый - 32К на 4гб карточке. Но разница между просто РС, f_mksf и SDFormatter - поразительная!
|
|
|
|
|
Nov 21 2012, 20:54
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Народ подкажите еще такую штуку: Посмотрел я что эти обе карточки о себе рассказываю в поле MaxBusClk, а говорят они обе - 0x32, что переводе на русский - 50мгц, (хотя та что на 1гб - она "безклассовая", не SDHC и в общем-то не обязана была на 50мгц работать). И подумал не попробовать ли байпас делителя клока и сделать шинку не 24 а 48мгц? Заодно поигрался с шириной шины (меня по некоторым причинам 4-х битная не везде устраивает).
В результате вот что: - во первых, как и следовало ожидать, на скорость записи это мало влияет, зато на чтение - изрядно. - в 1-битной режиме на обоих карточках на 48мгц работает устойчиво. - в 4-х битном режиме 4-х гиговая SDHC Class 4 карточка на 48мгц работает неустойчиво, иногда сбоит, но фат не слетает даже при попытке записи (точнее писать оно и не пытается, вылетает по ошибке раньше). - 1-гиговая SD в 4-х битной режиме на 48мгц не работает вообще, постоянно сбоит, при попытке записи - запарывает ФАТ. Причем так, что f_mkfs ее "не берет", только SDFormatter на компе.
Что за хрень можнт быть в 4-х битном режиме на 48мгц, если в 1-битной все ОК?
P.S. шину вообще надо в плюс подтягивать? А то в одних схемах стоят резисторы, в других нет, в некотоых еще последовательно по 100 ом стоит (согласование для длинных проводов?)
|
|
|
|
|
Nov 24 2012, 17:07
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
aaarrr, видимо нужна Ваша помощь. Я попробовал так: Код SDIO_CmdInitStructure.SDIO_Argument = 0x80FFFF01; // magic word meas HS mode SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_HS_SWITCH; SDIO_SendCommand(&SDIO_CmdInitStructure); delay_ms(10); errorstatus = CmdResp1Error(SD_CMD_HS_SWITCH); Пока по простому, не анализируя может ли карта работать в HighSpeed (не разобрался еще, как это проверять). Результат - в 1-битном режиме 1-гиговая карточка перестала глючить, с 4-х гиговой - ничего не изменилось. Запись-чтение работают, скорость записи изменилась незначительно (и это понятно), скорость чтения возросла сильно, почти вдвое на 4-16К блоках. В 4-х битном режиме - по прежнему ничего не работает, ни запись и чтение не проходят. И вот еще что интересно - обратите внимание на delay_ms(10) после отсылки команды. вначале его небыло, я ставит в дебаггере брейкпойнт на errorstatus = CmdResp1Error(SD_CMD_HS_SWITCH); и все работало. Потом запустил без брейкпойнта или не под дебаггером - и все висло. Вставил задержку - заработало.
|
|
|
|
|
Nov 27 2012, 20:53
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Allregia @ Nov 24 2012, 21:07)  Пока по простому, не анализируя может ли карта работать в HighSpeed (не разобрался еще, как это проверять). Проверить можно следующим образом: 1. Посылаем CMD6 с аргументом 0x00000001 (Mode 0, Function: High-Speed) 2. Принимаем 512 бит данных, в них смотрим бит 400 == 1, биты 379:376 == 1 - функция поддерживается, разрешено переключение 3. Посылаем CMD6 с аргументом 0x80fffff1 (Mode 1, Function: High-Speed) 4. Принимаем 512 бит данных, проверяем биты 379:376 == 1 - успешно переключились 5. Ждем минимум 8 тактов, затем переключаем частоту Важный момент: некоторые карты требуют паузы после CMD6, даже если осуществляется только проверка, а не переключение. А "железо" тянет 50MHz (настройки IO, трассировка)?
|
|
|
|
|
Nov 27 2012, 21:25
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(aaarrr @ Nov 27 2012, 22:53)  Проверить можно следующим образом: 1. Посылаем CMD6 с аргументом 0x00000001 (Mode 0, Function: High-Speed) 2. Принимаем 512 бит данных, в них смотрим бит 400 == 1, биты 379:376 == 1 - функция поддерживается, разрешено переключение Спасибо. Я так и понял из мануало, Вы подтвердили. Цитата 3. Посылаем CMD6 с аргументом 0x80fffff1 Я вроде посылал 80FFFF01, не очень понял в описании на что вторая тетрада влияет, Ваш F - вроде как "no influence", мой 0 - default. Что лучше? Цитата (Mode 1, Function: High-Speed) 4. Принимаем 512 бит данных, проверяем биты 379:376 == 1 - успешно переключились 5. Ждем минимум 8 тактов, затем переключаем частоту Важный момент: некоторые карты требуют паузы после CMD6, даже если осуществляется только проверка, а не переключение. Поэтому мне delay и пришлось всунуть. Цитата А "железо" тянет 50MHz (настройки IO, трассировка)? I/O настроены, компенсация включена. Трассировка - от контактов SD-разьема до ножек проца меньше сантиметра. Да и на 1-м бите оно ведь работает! Вот я спрашивал еще, никто не ответил - нужны пулапы на сигналы SDIO ? Я в разных схемах видел с пулпами и без них, а и с последовательными резисторами ом по 100.
|
|
|
|
|
Nov 27 2012, 21:35
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Allregia @ Nov 28 2012, 01:25)  Я вроде посылал 80FFFF01, не очень понял в описании на что вторая тетрада влияет, Ваш F - вроде как "no influence", мой 0 - default. Что лучше? Стандарт рекомендует no influence для тех функций, что не меняются. Цитата(Allregia @ Nov 28 2012, 01:25)  Вот я спрашивал еще, никто не ответил - нужны пулапы на сигналы SDIO ? Нужны и предписаны спецификацией (10-100кОм).
|
|
|
|
|
Nov 29 2012, 15:03
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Вот есть еще интересный вопрос - в F4 используется общий PLL для тактовой для SDIO и USB, которая должна быть 48Мгц. Для USB FS это понятно, но если я исползую USB HS с внешним PHY - там тоже USB надо тактировать от строго 48мгц? Вопрос родился из-за написанного в поеследней эррате: Цитата 2.9.3 SDIO clock divider BYPASS mode may not work properly
Description In high speed communication mode, when SDIO_CK is equal to 48 MHz (PLL48_output = 48 MHz), the BYPASS bit is equal to ‘1’ and the NEGEDGE bit is equal to ‘0’ (respectively bit 10 and bit 13 in the SDIO_CLKCR register), the hold timing at the I/O pin is not inline with the SD/MMC 2.0 specifications.
Workaround When not using USB nor RNG, PLL48_output (SDIOCLK) frequency can be raised up to 75 MHz, allowing to reach 37.5 MHz on SDIO_CK in high speed mode. The BYPASS bit, the CLKDIV bit and the NEGEDGE bit are equal to ‘0’.
|
|
|
|
|
Oct 31 2013, 03:14
|
Группа: Новичок
Сообщений: 4
Регистрация: 27-09-13
Пользователь №: 78 511

|
Здравствуйте товарищи форумчане. Чтобы не плодить веток, решил задать свой вопрос тут. По-маленьку ковыряю ченовскую библиотеку fatfs + usb + stm32f103. Появилась необходимость в проекте записать достаточно большой объем данных, около 128кб. При попытке решения проблемы "в лоб", столкнулся с проблемой зависания проги. Виснет в библиотечной функции вот тут: ______________________________________ Код if(HCD_IsDeviceConnected(&USB_OTG_Core)) { do { status = USBH_MSC_Write10(&USB_OTG_Core,(BYTE*)buff,sector,512 * count); USBH_MSC_HandleBOTXfer(&USB_OTG_Core, &USB_Host); if(!HCD_IsDeviceConnected(&USB_OTG_Core)) { return RES_ERROR; } } while(status == USBH_MSC_BUSY ); } __________________ или еще вот тут: __________________ Код if(HCD_IsDeviceConnected(&USB_OTG_Core)) { do { status = USBH_MSC_Read10(&USB_OTG_Core, buff,sector,512 * count); USBH_MSC_HandleBOTXfer(&USB_OTG_Core ,&USB_Host); if(!HCD_IsDeviceConnected(&USB_OTG_Core)) { return RES_ERROR; } } while(status == USBH_MSC_BUSY ); } __________________________________________________________________ причину, к сожалению понять не могу. Код процедуры записи привел ниже: __________________________________________________________________ Код f_mount(0, &fatfs); f_opendir(&dir, "0:/"); f_open(&file, "FILE1.TXT", FA_OPEN_EXISTING | FA_WRITE | FA_READ); f_lseek(&file, file.fsize); for (uint8_t i=0; i<255; i++) { f_write(&file, arr, 512, &WritenBytes); f_sync(&file); cntr ++; } f_close(&file); f_mount(0, NULL); ________________________________ P.S. проверку статусов операции делал, все ок, ни одной ошибки. сейчас представил самый простой на мой взгляд вариант реализации. P.P.S. зависать начинает в вышеуказанных местах всегда по разному, иногда сразу, а иногда несколько раз процедура успешно завершается, а после, при очередном вызове, виснет.
Сообщение отредактировал IgorKossak - Oct 31 2013, 19:24
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Oct 31 2013, 19:26
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(esaulenka @ Oct 31 2013, 19:14)  USBProcess() крутился в одном процессе Я ртосины не использую по принципиальным причинам  , но расколупывание либы от ст привело к мысли о том, что USBProcess() постоянно "крутить" нет смысла, мало того, из-за этого еще и иногда зависает, поэтому решил разбить ее на 2 части - то, что отвечает за первоначальную инициализацию, и остальное за дисконнект. Как только диск замонтировался - первую часть отключаю, как флешку выняли - вторую соотв. Зависания и ошибки исчезли.
|
|
|
|
|
Nov 6 2013, 04:00
|
Группа: Новичок
Сообщений: 4
Регистрация: 27-09-13
Пользователь №: 78 511

|
Всем спасибо, все свободны. Проблему решил, причину нашел. Как всегда, кривые ручонки и великий и ужасный STACK.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|