Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2019-май-26 06:44

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу Пред.  1, 2 Все
Автор Сообщение
 Заголовок сообщения: Re: Рабочий USB Masstorage host
СообщениеДобавлено: 2018-мар-15 09:34 
Не в сети

Зарегистрирован: 2017-мар-02 08:48
Сообщения: 18
Попытка переделать stm-овскую библиотеку под 1986ве91т (пока только чтение usb host mass storage full speed).
Три флешки из 4-х читаются нормально. Скорость около 5 Мбит/с.
Четвертая флешка залипает через несколько секунд после начала чтения. Пока не могу отловить, где.

Посмотрите, потестируйте, отпишитесь по результатам. Может, кто укажет ошибки.


Вложения:
Usb_host_forum.zip [4.37 МБ]
Скачиваний: 120
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рабочий USB Masstorage host
СообщениеДобавлено: 2018-дек-25 16:56 
Не в сети

Зарегистрирован: 2017-дек-13 07:58
Сообщения: 4
Lin писал(а):
Попытка переделать stm-овскую библиотеку под 1986ве91т (пока только чтение usb host mass storage full speed).
Три флешки из 4-х читаются нормально. Скорость около 5 Мбит/с.
Четвертая флешка залипает через несколько секунд после начала чтения. Пока не могу отловить, где.

Посмотрите, потестируйте, отпишитесь по результатам. Может, кто укажет ошибки.


Спасибо за адаптацию, отличная работа. Я сейчас занят с этой реализацией, есть проблемы, например, микроконтроллер зависает на автомате USB при считывании какого-то конкретного файла. Т.е. первый, или определенный небольшой текстовый файл считывается отлично, а потом, при каких-то непонятных случаях, ядро крутится в USBH_MSC_HandleBOTXfer в файле usbh_msc_bot.c.
Сейчас смотрю, что в
Код:
switch (USBH_MSC_BOTXferParam.BOTState)
    {
    case USBH_MSC_SEND_CBW:
....
    }

значение .BOTState = 0x80. При том, что это enum и в проекте явных присвоений чисел нет, похоже, что это утечка памяти, возможно, при записи данных в pRxTxBuff. Там массив, вполне мог быть выход за границы.

Также хочется адаптировать библиотеку на более свежую стмку, там есть, как мне показалось, важные изменения по автомату USB.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рабочий USB Masstorage host
СообщениеДобавлено: 2019-мар-22 09:30 
Не в сети

Зарегистрирован: 2017-дек-13 07:58
Сообщения: 4
Lin писал(а):
Попытка переделать stm-овскую библиотеку под 1986ве91т

Я обнаружил особенность, связанную с таймером. Короче, при выполнении задержки на 1 мкс реальное время где-то
1.5 мкс, и при задержке на, например, 100 мкс время будет 150.
Я реализовал таймер сразу с установкой в ARR нужного значения задержки, delay() стал считать точнее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рабочий USB Masstorage host
СообщениеДобавлено: 2019-мар-22 09:54 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1271
Откуда: Тула
yaxn писал(а):
Lin писал(а):
Попытка переделать stm-овскую библиотеку под 1986ве91т

Я обнаружил особенность, связанную с таймером. Короче, при выполнении задержки на 1 мкс реальное время где-то
1.5 мкс, и при задержке на, например, 100 мкс время будет 150.
Я реализовал таймер сразу с установкой в ARR нужного значения задержки, delay() стал считать точнее.

А опишите алгоритм или покажите код.
У меня была проблема с тем, что при обновлении одного из регистров (к сожалению, я не помню CCRxx или ARR) фактическое обновление происходило только после достижения предельной границы счёта (опять же не уверен, но считал вниз вроде бы), при этом битики, разрешающие мгновенное обновление соответствующих регистров, были выставлены.
Проявлялось это как раз тем, что в прерывание я попадал не по второй уставке, а по первой (делал таймер для таймаутов).
В моём случае решение получалось и без того не очень красивым, поэтому глубоко исследовать вопрос я не стал. Возможно это баг чипа.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рабочий USB Masstorage host
СообщениеДобавлено: 2019-мар-22 10:24 
Не в сети

Зарегистрирован: 2017-дек-13 07:58
Сообщения: 4
prostoRoman писал(а):
А опишите алгоритм или покажите код.


Я не стал использовать прерывание для TIMER2, не вижу в нем смысла, поллинг хорошо сюда подходит.
Открыть
Код:
#define ONEHZ (144000000 / 1000000)

/**
* @brief Настройка TIMER2 для реализации функции задержки в микросекундах
*/
void initUsTimer(void)
{
   MDR_RST_CLK->PER_CLOCK |= RST_CLK_PER_CLOCK_PCLK_EN_TIMER2;
   
   // Для 144 МГц
   MDR_RST_CLK->TIM_CLOCK |=
       (RST_CLK_TIM_CLOCK_TIM_BRG_HCLK_DIV_2 << RST_CLK_TIM_CLOCK_TIM2_BRG_Pos)
      |(1 << RST_CLK_TIM_CLOCK_TIM2_CLK_EN_Pos);
   
   MDR_TIMER2->PSG = 0;
   MDR_TIMER2->ARR = 0;
   MDR_TIMER2->CNTRL = 0x01;
}

void delayUs(uint32_t microseconds)
{
   MDR_TIMER2->CNT = 0;
   // Установка счетчика, тики таймера за 1 мкс умножить на требуемую задержку
   MDR_TIMER2->ARR = (ONEHZ / 2) * microseconds - 1;
   
   while(!(MDR_TIMER2->STATUS & TIMER_STATUS_CNT_ARR_EVENT));
   MDR_TIMER2->STATUS &= ~TIMER_STATUS_CNT_ARR_EVENT;
}

void delayMs(uint32_t milliseconds)
{
   unsigned int cnt;
   for(cnt = 0; cnt < milliseconds; cnt++)
   {
      delayUs(1000);
   }
}
Закрыть

Инициализация таймера разовая, тикает все время. Пробовал для микросекунд инициализировать таймер в функции задержки, всегда было какое-то длинное время больше 10 мкс, видимо, из-за инициализации таймера.
Мне еще требовалось в коде задержки в районе 1-2 мкс, поэтому пришлось разбираться с вопросом о точности.
Тестировал в функции что-то типа
Код:
while(1)
{
   MDR_PORTC->RXTX ~= MDR_PORTC->RXTX;
  delayUs(10);
}

, на ножке смотрел осциллографом.
Без задержки, период составляет порядка 300 нс.

Я пробовал использовать SysTick, но забил, так как в 1986ВЕ1Т есть с ним проблемы, и разбираться с ними не хотелось.

По тестам, для микросекундных задержек есть константная ошибка около 600-700 нс, меня она устраивает.
Привожу значения с осциллографа для различных микросекундных задержек:
1 мкс - 1.6-1.7 мкс (дребезжит фронт в реальном коде, может быть сказываются прерывания с периферии)
2 мкс - 2.6-2.7 мкс
5 мкс - 5.6-5.7 мкс
10 мкс - 10.7
100 мкс - 100 мкс (ошибка не видна на осциллографе).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рабочий USB Masstorage host
СообщениеДобавлено: 2019-мар-22 10:48 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1271
Откуда: Тула
700 нс это 100 тиков на 144МГц, это с одной стороны и много, а с другой стороны и не очень при наличии 6-7 тактов задержки чтения флеш, ветвлений, вызова ф-ции и поллинга, отсутствия кеширования адресов регистров таймера.

В другом проекте, где нужно было померить частоту и скважность высокочастотного (500 кГц) сигнала, пришлось оптимизировать сишный код так, чтобы ассемблер был более изящным.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу Пред.  1, 2 Все

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB