реклама на сайте
подробности

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> STM32F4 + FatFS + uSD, проблема со скоростью.
Allregia
сообщение Nov 9 2012, 08:40
Сообщение #31


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(RabidRabbit @ Nov 9 2012, 10:02) *
Может после форматирования SDFormatter'ом карточка считает, что все (или почти все) страницы стёрты, потому не затрачивает время на их очистку перед записью? Что будет, если карту заполнить до упора, потом стереть файлы (не форматировать) и проверить скорость?

Вряд ли, ведь во всех случаях делается Quick Format, но я попробую.
Go to the top of the page
 
+Quote Post
Allregia
сообщение Nov 21 2012, 20:54
Сообщение #32


Профессионал
*****

Группа: Свой
Сообщений: 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 ом стоит (согласование для длинных проводов?)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 21 2012, 21:20
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Allregia @ Nov 22 2012, 00:54) *
Что за хрень можнт быть в 4-х битном режиме на 48мгц, если в 1-битной все ОК?

А саму карту в high speed перевели через CMD6?
Go to the top of the page
 
+Quote Post
Allregia
сообщение Nov 21 2012, 22:45
Сообщение #34


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(aaarrr @ Nov 21 2012, 23:20) *
А саму карту в high speed перевели через CMD6?


Ooops...

А у Вас есть описание CMD6? Какие у нее аргументы? Я не нашел.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 21 2012, 23:31
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Allregia @ Nov 22 2012, 02:45) *
А у Вас есть описание CMD6? Какие у нее аргументы? Я не нашел.

Оно в Simplified Physical Layer Spec 2.0 описано. Не полностью, но разобраться можно. Если что, подскажу, когда-то делал.
Go to the top of the page
 
+Quote Post
Allregia
сообщение Nov 22 2012, 19:20
Сообщение #36


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Нашел 3.0, и еще в примераз в IAR.
Попробую завтра разобраться.

Правда непонятно - почему оно и так на 1-м бите работало, без переключения в HS при помощи CMD6?
(собственно, мне и нужно только чтение 1бит 50мгц, т.к. при 25мгц оно впритык, без запаса, а 4 бита там не получаются, порты заняты.)
Go to the top of the page
 
+Quote Post
Allregia
сообщение Nov 24 2012, 17:07
Сообщение #37


Профессионал
*****

Группа: Свой
Сообщений: 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); и все работало. Потом запустил без брейкпойнта или не под дебаггером - и все висло. Вставил задержку - заработало.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 27 2012, 20:53
Сообщение #38


Гуру
******

Группа: Свой
Сообщений: 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, трассировка)?
Go to the top of the page
 
+Quote Post
Allregia
сообщение Nov 27 2012, 21:25
Сообщение #39


Профессионал
*****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 27 2012, 21:35
Сообщение #40


Гуру
******

Группа: Свой
Сообщений: 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кОм).
Go to the top of the page
 
+Quote Post
Allregia
сообщение Nov 28 2012, 08:31
Сообщение #41


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



У меня стоят по 10к на всех линиях, кроме CLK (ему вроде не надо- он же всегда выход со стороны процессора).
Go to the top of the page
 
+Quote Post
Allregia
сообщение Nov 29 2012, 06:16
Сообщение #42


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



А не может это быть тем случаем, описанным в эррате? Я как-то про него забыл, а вчера перечитывал эрррату и вспомнил.

Правда, все это не обьясняет, почему на 1-м бите оно работает, а на 4-х нет.
Go to the top of the page
 
+Quote Post
Allregia
сообщение Nov 29 2012, 15:03
Сообщение #43


Профессионал
*****

Группа: Свой
Сообщений: 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’.
Go to the top of the page
 
+Quote Post
Stepanov.I.L
сообщение Oct 31 2013, 03:14
Сообщение #44





Группа: Новичок
Сообщений: 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] - для короткого!!!
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Oct 31 2013, 16:14
Сообщение #45


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Была похожая проблема с использованием ST-шного примера и FreeRTOS.
USBProcess() крутился в одном процессе, а работа с файлами велась из других. Периодически всё висло в состоянии USBH_MSC_BUSY.

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

Других проблем с чтением/записью не нашли (тестировал чтение-запись по 10 мегабайт).


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 20:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01516 секунд с 7
ELECTRONIX ©2004-2016