Allregia 9 9 ноября, 2012 Опубликовано 9 ноября, 2012 · Жалоба Может после форматирования SDFormatter'ом карточка считает, что все (или почти все) страницы стёрты, потому не затрачивает время на их очистку перед записью? Что будет, если карту заполнить до упора, потом стереть файлы (не форматировать) и проверить скорость? Вряд ли, ведь во всех случаях делается Quick Format, но я попробую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба Народ подкажите еще такую штуку: Посмотрел я что эти обе карточки о себе рассказываю в поле 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 69 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба Что за хрень можнт быть в 4-х битном режиме на 48мгц, если в 1-битной все ОК? А саму карту в high speed перевели через CMD6? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба А саму карту в high speed перевели через CMD6? Ooops... А у Вас есть описание CMD6? Какие у нее аргументы? Я не нашел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба А у Вас есть описание CMD6? Какие у нее аргументы? Я не нашел. Оно в Simplified Physical Layer Spec 2.0 описано. Не полностью, но разобраться можно. Если что, подскажу, когда-то делал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 22 ноября, 2012 Опубликовано 22 ноября, 2012 · Жалоба Нашел 3.0, и еще в примераз в IAR. Попробую завтра разобраться. Правда непонятно - почему оно и так на 1-м бите работало, без переключения в HS при помощи CMD6? (собственно, мне и нужно только чтение 1бит 50мгц, т.к. при 25мгц оно впритык, без запаса, а 4 бита там не получаются, порты заняты.) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 24 ноября, 2012 Опубликовано 24 ноября, 2012 · Жалоба 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 69 27 ноября, 2012 Опубликовано 27 ноября, 2012 · Жалоба Пока по простому, не анализируя может ли карта работать в 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 9 27 ноября, 2012 Опубликовано 27 ноября, 2012 · Жалоба Проверить можно следующим образом: 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 69 27 ноября, 2012 Опубликовано 27 ноября, 2012 · Жалоба Я вроде посылал 80FFFF01, не очень понял в описании на что вторая тетрада влияет, Ваш F - вроде как "no influence", мой 0 - default. Что лучше? Стандарт рекомендует no influence для тех функций, что не меняются. Вот я спрашивал еще, никто не ответил - нужны пулапы на сигналы SDIO ? Нужны и предписаны спецификацией (10-100кОм). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 28 ноября, 2012 Опубликовано 28 ноября, 2012 · Жалоба У меня стоят по 10к на всех линиях, кроме CLK (ему вроде не надо- он же всегда выход со стороны процессора). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 29 ноября, 2012 Опубликовано 29 ноября, 2012 · Жалоба А не может это быть тем случаем, описанным в эррате? Я как-то про него забыл, а вчера перечитывал эрррату и вспомнил. Правда, все это не обьясняет, почему на 1-м бите оно работает, а на 4-х нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 29 ноября, 2012 Опубликовано 29 ноября, 2012 · Жалоба Вот есть еще интересный вопрос - в 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 0 31 октября, 2013 Опубликовано 31 октября, 2013 (изменено) · Жалоба Здравствуйте товарищи форумчане. Чтобы не плодить веток, решил задать свой вопрос тут. По-маленьку ковыряю ченовскую библиотеку 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. зависать начинает в вышеуказанных местах всегда по разному, иногда сразу, а иногда несколько раз процедура успешно завершается, а после, при очередном вызове, виснет. Изменено 31 октября, 2013 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 31 октября, 2013 Опубликовано 31 октября, 2013 · Жалоба Была похожая проблема с использованием ST-шного примера и FreeRTOS. USBProcess() крутился в одном процессе, а работа с файлами велась из других. Периодически всё висло в состоянии USBH_MSC_BUSY. Проблема решается запихиванием всей работы с USB в один поток или использованием семафоров, блокирующих один из потоков. Других проблем с чтением/записью не нашли (тестировал чтение-запись по 10 мегабайт). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться