Allregia
Sep 3 2012, 13:03
Нужна помощь клуба.
Процессор 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, 13:12
Цитата(Allregia @ Sep 3 2012, 16:03)

И попутно другой вопрос - я первый раз с FatFs работаю, функия f_write начинается и ждет пока не закончиться запись блока. Т.е оно блокирует на время записи всю программу и не очень понятно зачем тогда DMA?
Это можно как-то обойти без OS ?
Обойти можно скорей всего - должен быть флаг завершения/прерывание по окончании обмена по DMA.
То есть запустить ДМА, и продолжить выполнять программу, иногда проверяя завершился ли обмен.
Allregia
Sep 3 2012, 13:31
Цитата(_Артём_ @ Sep 3 2012, 15:12)

Обойти можно скорей всего - должен быть флаг завершения/прерывание по окончании обмена по DMA.
То есть запустить ДМА, и продолжить выполнять программу, иногда проверяя завершился ли обмен.
Это понятно, вопрос насколько FatFs к этому расположена - не хотелось бы ее всю перелопачивать.
На счет скорости тут на форуме много тем вердикт которых - надо буферизировать и писать большими кусками сразу. И это общее правило при работе с SD картами. Надеюсь Вы предусмотрели внешнюю память для этих целей (SDRAM например).
На счет блокирующей записи - именно из-за неё мне пришлось спешно прикручивать ртос в своё время. Конечно можно выкрутиться и без неё, но имхо самое простое решение. В итоге наш девайс (lpc2478, но не суть) пишет видео со скоростью 5 МБайт/с. Ваш наверняка может показать аналогичные результаты.
Allregia
Sep 3 2012, 14:15
Цитата(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?
Самое лучшее - найти на электрониксе тему, где это подробно обсуждается более осведомленными людьми. Там примерно говорится, что SD карта вещь в себе, с собственным контроллером, который может по спецификации давать задержки до 250 мс независимо от класса. Чем меньше объем карты, тем меньше вероятность задержек - вот у Вас скорость и выше при 1ГБ карте. Зная задержку можете рассчитать приемлемый буфер для записи. Я пишу по 6 МБайт в фат32, камень указывал - lpc2478. Помимо записи на карту идет поток на tcp, рисуется чб gui на oled, опрашивается емкостная клавиатура, всякие датчики температуры, акселерометр и т.п. - т.е. секрет успеха в большом буфере под запись.
Allregia
Sep 3 2012, 20:23
Цитата(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-мегагерцовом проце!
Потому я и думаю - что-то тут не так.
Не так, так не так. Я попытался Вас направить в нужном направлении - случайные задержки
до 250 мс по спецификации, буфер по записи для улучшения скорости. Настаивать не буду. =)
PS:
Одна из тем про время записи
Цитата(Allregia @ Sep 4 2012, 00:23)

Потому я и думаю - что-то тут не так.
Определенно. Убедитесь, что оптимизация не забыта, попробуйте просто читать-писать группы секторов без FS... Трясти надо, короче говоря.
Allregia
Sep 4 2012, 04:48
Цитата(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:
Одна из тем про время записи
Спасибо, почитаю.
Тема, на которую я дал Вам ссылку должна ответить на все вопросы - особенно посты aaarrr и _3m. Еще раз - не надо пытаться подстроиться под работу контроллера с NAND в конкретной карточки, достаточно знать, что запись может занимать до 250 мс и рассчитать, какой должна быть минимальная порция данных для требуемой скорости.
Allregia
Sep 4 2012, 07:38
Цитата(Lotor @ Sep 4 2012, 08:38)

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

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

Если речь заходит о критичности скорости записи на карточку, то подразумевается же, что нужна непрерывность.
Allregia
Sep 4 2012, 10:44
Цитата(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МБ/сек !!!!!
скорее всего оно форматирует с выравниваением (так чтоб блоки логические не пересекали границы физических страниц в флэшке)
http://forum.ixbt.com/topic.cgi?id=27:9465А скорости чтения этого же фалйа не скажете сколько получается? особенно интересно было бы рандомное блоками по 32к например.
Allregia
Sep 4 2012, 15:26
Цитата(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 сек ает болшую погрешность (и в это время входило открытие и закрытие файла). Завтра, если время будет, попробую что Вы просите.
А частоту клока карты в 48мгц не пробовали ставить?
Allregia
Sep 4 2012, 17:03
Цитата(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" пока не разобрался. Но думаю, что "булылочное горлышко" пока не в этой частоте.
Allregia
Sep 5 2012, 10:19
Еще интересный факт:
при переводе SDIO в 1-битный режим (а точнее - блокировании перевода в 4-х битный), время записи 12МБ блоками по 4К на 4ГБ флешке увеличилось не в 4 раза а всего в полтора, с 10с до 14с, а на 1ГБ флешке почти не изменилось - было 37с стало 39с.
Факты есть, а системы нет.
Вам нужно проверить работу интерфейса, начиная с самого нижнего уровня, то есть:
1. Запустили чтение N мегабайт с карты в "пустоту" без FS.
2. Оценили время передачи блока
3. Оценили время нахождения карты в BUSY
4. На основании пунктов 2 и 3 сделали выводы о качестве работы ПО
5. Повторяем процедуру при различных длинах последовательности секторов
То же самое для записи.
Когда будут получены убедительные цифры на нижнем уровне, можно будет переходить к "тюнингу" FS.
Allregia
Sep 5 2012, 19:25
Да, конечно.
Я просто рассказываю интересные моменты, с которыми столкнулся.
Allregia
Nov 6 2012, 18:40
Возникла проблема - пока писал на малой скорости все было ОК, потом перешел к скорости побольше, и выяснилось следующее:
- говорили не раз, что по стандарты SD может давать задержку до 250мс.
- исходя из этого был с хоршим запасом выбран буфер - запись у меня 200КБ/с, буфер примерно на 620мс.
- пишу блоками по 4КБ.
- uSD 1Gb, отформатирована в самом устройстве, вижу задержки 50-100мс, проблем нет.
- uSD Kingston 4Gb, отформатирована в самом устройстве, каждые ~20 секунд возникат задержка в 900-950мс, и естествено моего буфера не хватает.
Что теперь делать, не знаю.
Allregia
Nov 7 2012, 15:42
Посмотрел более внимательно флешка входит в паузу 430мс, потом после записи 7-8 блоков по 4К опять входит в такую-же паузу.
Allregia
Nov 8 2012, 09:17
Отформатировал карточку в компе при помощи SDFormatter - и все секундные паузы пропали!
Остались изредка 60-180мс, что укладывается в стандарт и в мой буфер с тройным запасом.
Возросла также скорость записи на 1Гб карточке вдвое, и на 4Гб карточке - на ~30%
Можно сделать следующие выводы:
1) Форматирование обычным способом в компе дает крайне негативные результаты.
2) Форматирование в устройстве при помощи FatFS f_mkfs() дает результаты гораздо лучше. Но все же в FatFs форматирование делается как для SD так и для SDHC не на 100% корректно.
3) Форматирование в компе специальной утилитой делается корректно и дает отличный результат.
Надеюсь кому-то поможет, а если кто додумается как исправить FatFs чтобы она тоже корректно форматировала, будет просто отлично.
Цитата(Allregia @ Nov 8 2012, 13:17)

2) Форматирование в устройстве при помощи FatFS f_mkfs() дает результаты гораздо лучше. Но все же в FatFs форматирование делается как для SD так и для SDHC не на 100% корректно.
А что именно не устраивает в f_mkfs()?
Цитата(Lotor @ Nov 8 2012, 13:06)

А что именно не устраивает в f_mkfs()?
Видимо, надо сравнивать результаты работы SDFormatter vs f_mkfs()
Allregia
Nov 8 2012, 15:01
Цитата(Lotor @ Nov 8 2012, 12:06)

А что именно не устраивает в f_mkfs()?
Проблема описана в #22, #23.
Решение проблемы - в #24
Цитата(Allregia @ Nov 8 2012, 19:01)

Проблема описана в #22, #23.
Решение проблемы - в #24
Я просто f_mkfs() использую и таких проблем пока не наблюдал. SDFormatter какой размер кластера выставляет?
Allregia
Nov 9 2012, 07:47
Цитата(Lotor @ Nov 9 2012, 08:47)

Я просто f_mkfs() использую и таких проблем пока не наблюдал.
Если бы у меня был буфер в 2 раза больше, или я писал бы в 2 раза медленее, я бы наверное этого тоже не заметил.
Заметил потому что пауза ~1s, а буфер у меня только на 0.6s (чего при моей скорости записи согласно стандарту на карточку должно хватать с 3-е краным запасом!)
Цитата
SDFormatter какой размер кластера выставляет?
Тот же самый - 32К на 4гб карточке. Но разница между просто РС, f_mksf и SDFormatter - поразительная!
RabidRabbit
Nov 9 2012, 08:02
Может после форматирования SDFormatter'ом карточка считает, что все (или почти все) страницы стёрты, потому не затрачивает время на их очистку перед записью? Что будет, если карту заполнить до упора, потом стереть файлы (не форматировать) и проверить скорость?
Allregia
Nov 9 2012, 08:40
Цитата(RabidRabbit @ Nov 9 2012, 10:02)

Может после форматирования SDFormatter'ом карточка считает, что все (или почти все) страницы стёрты, потому не затрачивает время на их очистку перед записью? Что будет, если карту заполнить до упора, потом стереть файлы (не форматировать) и проверить скорость?
Вряд ли, ведь во всех случаях делается Quick Format, но я попробую.
Allregia
Nov 21 2012, 20:54
Народ подкажите еще такую штуку:
Посмотрел я что эти обе карточки о себе рассказываю в поле 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 ом стоит (согласование для длинных проводов?)
aaarrr
Nov 21 2012, 21:20
Цитата(Allregia @ Nov 22 2012, 00:54)

Что за хрень можнт быть в 4-х битном режиме на 48мгц, если в 1-битной все ОК?
А саму карту в high speed перевели через CMD6?
Allregia
Nov 21 2012, 22:45
Цитата(aaarrr @ Nov 21 2012, 23:20)

А саму карту в high speed перевели через CMD6?
Ooops...
А у Вас есть описание CMD6? Какие у нее аргументы? Я не нашел.
aaarrr
Nov 21 2012, 23:31
Цитата(Allregia @ Nov 22 2012, 02:45)

А у Вас есть описание CMD6? Какие у нее аргументы? Я не нашел.
Оно в Simplified Physical Layer Spec 2.0 описано. Не полностью, но разобраться можно. Если что, подскажу, когда-то делал.
Allregia
Nov 22 2012, 19:20
Нашел 3.0, и еще в примераз в IAR.
Попробую завтра разобраться.
Правда непонятно - почему оно и так на 1-м бите работало, без переключения в HS при помощи CMD6?
(собственно, мне и нужно только чтение 1бит 50мгц, т.к. при 25мгц оно впритык, без запаса, а 4 бита там не получаются, порты заняты.)
Allregia
Nov 24 2012, 17:07
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); и все работало. Потом запустил без брейкпойнта или не под дебаггером - и все висло. Вставил задержку - заработало.
aaarrr
Nov 27 2012, 20:53
Цитата(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, трассировка)?
Allregia
Nov 27 2012, 21:25
Цитата(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.
aaarrr
Nov 27 2012, 21:35
Цитата(Allregia @ Nov 28 2012, 01:25)

Я вроде посылал 80FFFF01, не очень понял в описании на что вторая тетрада влияет, Ваш F - вроде как "no influence", мой 0 - default.
Что лучше?
Стандарт рекомендует no influence для тех функций, что не меняются.
Цитата(Allregia @ Nov 28 2012, 01:25)

Вот я спрашивал еще, никто не ответил - нужны пулапы на сигналы SDIO ?
Нужны и предписаны спецификацией (10-100кОм).
Allregia
Nov 28 2012, 08:31
У меня стоят по 10к на всех линиях, кроме CLK (ему вроде не надо- он же всегда выход со стороны процессора).
Allregia
Nov 29 2012, 06:16
А не может это быть тем случаем, описанным в эррате? Я как-то про него забыл, а вчера перечитывал эрррату и вспомнил.
Правда, все это не обьясняет, почему на 1-м бите оно работает, а на 4-х нет.
Allregia
Nov 29 2012, 15:03
Вот есть еще интересный вопрос - в 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’.
Stepanov.I.L
Oct 31 2013, 03:14
Здравствуйте товарищи форумчане. Чтобы не плодить веток, решил задать свой вопрос тут. По-маленьку ковыряю ченовскую библиотеку 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. зависать начинает в вышеуказанных местах всегда по разному, иногда сразу, а иногда несколько раз процедура успешно завершается, а после, при очередном вызове, виснет.
esaulenka
Oct 31 2013, 16:14
Была похожая проблема с использованием ST-шного примера и FreeRTOS.
USBProcess() крутился в одном процессе, а работа с файлами велась из других. Периодически всё висло в состоянии USBH_MSC_BUSY.
Проблема решается запихиванием всей работы с USB в один поток или использованием семафоров, блокирующих один из потоков.
Других проблем с чтением/записью не нашли (тестировал чтение-запись по 10 мегабайт).
mantech
Oct 31 2013, 19:26
Цитата(esaulenka @ Oct 31 2013, 19:14)

USBProcess() крутился в одном процессе
Я ртосины не использую по принципиальным причинам

, но расколупывание либы от ст привело к мысли о том, что USBProcess() постоянно "крутить" нет смысла, мало того, из-за этого еще и иногда зависает, поэтому решил разбить ее на 2 части - то, что отвечает за первоначальную инициализацию, и остальное за дисконнект. Как только диск замонтировался - первую часть отключаю, как флешку выняли - вторую соотв. Зависания и ошибки исчезли.
Stepanov.I.L
Nov 6 2013, 04:00
Всем спасибо, все свободны. Проблему решил, причину нашел. Как всегда, кривые ручонки и великий и ужасный STACK.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.