|
|
  |
STM32F4 + FatFS + uSD, проблема со скоростью. |
|
|
|
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] - для короткого!!!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|