Перейти к содержанию
    

Может после форматирования SDFormatter'ом карточка считает, что все (или почти все) страницы стёрты, потому не затрачивает время на их очистку перед записью? Что будет, если карту заполнить до упора, потом стереть файлы (не форматировать) и проверить скорость?

Вряд ли, ведь во всех случаях делается Quick Format, но я попробую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Народ подкажите еще такую штуку:

Посмотрел я что эти обе карточки о себе рассказываю в поле 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 ом стоит (согласование для длинных проводов?)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что за хрень можнт быть в 4-х битном режиме на 48мгц, если в 1-битной все ОК?

А саму карту в high speed перевели через CMD6?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А саму карту в high speed перевели через CMD6?

 

Ooops...

 

А у Вас есть описание CMD6? Какие у нее аргументы? Я не нашел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А у Вас есть описание CMD6? Какие у нее аргументы? Я не нашел.

Оно в Simplified Physical Layer Spec 2.0 описано. Не полностью, но разобраться можно. Если что, подскажу, когда-то делал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашел 3.0, и еще в примераз в IAR.

Попробую завтра разобраться.

 

Правда непонятно - почему оно и так на 1-м бите работало, без переключения в HS при помощи CMD6?

(собственно, мне и нужно только чтение 1бит 50мгц, т.к. при 25мгц оно впритык, без запаса, а 4 бита там не получаются, порты заняты.)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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); и все работало. Потом запустил без брейкпойнта или не под дебаггером - и все висло. Вставил задержку - заработало.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пока по простому, не анализируя может ли карта работать в 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, трассировка)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверить можно следующим образом: 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я вроде посылал 80FFFF01, не очень понял в описании на что вторая тетрада влияет, Ваш F - вроде как "no influence", мой 0 - default.

Что лучше?

Стандарт рекомендует no influence для тех функций, что не меняются.

 

Вот я спрашивал еще, никто не ответил - нужны пулапы на сигналы SDIO ?

Нужны и предписаны спецификацией (10-100кОм).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня стоят по 10к на всех линиях, кроме CLK (ему вроде не надо- он же всегда выход со стороны процессора).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Правда, все это не обьясняет, почему на 1-м бите оно работает, а на 4-х нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот есть еще интересный вопрос - в 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’.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте товарищи форумчане. Чтобы не плодить веток, решил задать свой вопрос тут. По-маленьку ковыряю ченовскую библиотеку 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
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Была похожая проблема с использованием ST-шного примера и FreeRTOS.

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...