Миландр

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

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




Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Ethernet на 1986ВЕ3Т
СообщениеДобавлено: 2018-май-25 13:02 
В сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1176
Откуда: Тула
Vasiliy писал(а):
Возможно некорректно выразился, имел ввиду - после запуска на HSI, бит HSE_ON включать не нужно. Поскольку не нужен функционал самого генератора HSE, а только внешняя частота пропущенная сквозь него.

Практика показывает, что включение BYPASS и не включение HSE_ON ведёт к зависанию, при переключении тактирования на HSE.
При тактировании от HSI вроде бы манипуляции с HS_CONTROL не требуются.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ethernet на 1986ВЕ3Т
СообщениеДобавлено: 2018-июн-01 13:28 
Не в сети

Зарегистрирован: 2014-ноя-05 07:19
Сообщения: 7
//*******************Настройки 25 МГц*/*******************************

MDR_RST_CLK->HS_CONTROL = 0x01; /* вкл. HSE осцилятора 25 MHz*/
//MDR_RST_CLK->HS_CONTROL = 0x03; /* вкл. HSE генератора 25 MHz*/
while ((MDR_RST_CLK->CLOCK_STATUS & (1 << 2)) == 0x00); /* ждем пока HSE выйдет в рабочий режим */

MDR_RST_CLK->CPU_CLOCK = 0x00000003; //CPU_C1 frequency 12,5MHz

//MDR_RST_CLK->PLL_CONTROL = ((1 << 2) | (3 <<8)); //вкл. PLL | коэф. умножения = 4 частота ядра 50 МГц
MDR_RST_CLK->PLL_CONTROL = ((1 << 2) | (5 <<8)); //вкл. PLL | коэф. умножения = 6 частота ядра 75 МГц
while((MDR_RST_CLK->CLOCK_STATUS & 0x02) != 0x02); //ждем когда PLL выйдет в раб. режим

MDR_RST_CLK->CPU_CLOCK = (3 /*источник для CPU_C1 - HSE/2 */
| (1 << 2) /*источник для CPU_C2 - PLL*/
| (0 << 4) /*предделитель для CPU_C3 - переферия работает на 75 МГц*/
| (1 <<8));/*источник для HCLK*/

MDR_RST_CLK->ETH_CLOCK=(1<<24)|(1<<28)|(1<<27)|(0<<16); //PHY_CLK_SEL = HSE, ETH_CLK_EN=1, PHY_CLK_EN=1, ETH_CLK = 75 MHz

С такими настройками работает от кварца 25МГц. Работающая периферия: Таймер, ETHERNET, CAN, UART.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ethernet на 1986ВЕ3Т
СообщениеДобавлено: 2018-окт-24 08:32 
Не в сети

Зарегистрирован: 2018-янв-19 07:44
Сообщения: 42
prostoRoman писал(а):
Практика показывает, что включение BYPASS и не включение HSE_ON ведёт к зависанию, при переключении тактирования на HSE.

Я использовал стандартную библиотеку, а конкретно функции RST_CLK_HSEconfig (RST_CLK_HSE2config), и нарвался на баг или фичу (кому как) при переходе от демонстрационной платы к своей, на которой используется внешние генераторы 8 и 25 МГц. Если для демоплаты аргументом функции был RST_CLK_HSE_ON (RST_CLK_HSE2_ON), то для своей платы я задавал соответственно RST_CLK_HSE_ON | RST_CLK_HSE_Bypass (RST_CLK_HSE2_ON | RST_CLK_HSE2_Bypass). В результате на своей плате получил зависание в точке ожидания готовности HSE (HSE2).
Как оказалось, причина в реализации функций. На примере RST_CLK_HSEconfig:
Код:
/**
  * @brief  RST_CLK_HSEconfig - HSE (High Speed External) clock mode and source selection
  * @param  RST_CLK_HSE - mode selector
  *         @arg RST_CLK_HSE_OFF    -  switch off HSE clock generator
  *         @arg RST_CLK_HSE_ON     -  switch on HSE clock generator
  *         @arg RST_CLK_HSE_Bypass -  use external clock source
  * @retval None
  */
void RST_CLK_HSEconfig(uint32_t RST_CLK_HSE)
{
  /* Check the parameters */
  assert_param(IS_RST_CLK_HSE(RST_CLK_HSE));
  /* Reset HSEON and HSEBYP bits before configuring the HSE */
  MDR_RST_CLK->HS_CONTROL &= ~((uint32_t)(RST_CLK_HSE_ON | RST_CLK_HSE_Bypass));
  /* Configure HSE (RCC_HSE_OFF is already covered by the code section above) */
  switch (RST_CLK_HSE)
  {
    case RST_CLK_HSE_ON:
      /* Set HSEON bit */
      MDR_RST_CLK->HS_CONTROL |= RST_CLK_HSE_ON;
      break;

    case RST_CLK_HSE_Bypass:
      /* Set HSEBYP and HSEON bits */
      MDR_RST_CLK->HS_CONTROL |= RST_CLK_HSE_ON | RST_CLK_HSE_Bypass;
      break;

    default:
      break;
  }
}

Видно, что RST_CLK_HSE_ON и RST_CLK_HSE_Bypass используются в аргументе функции не как битовые флаги, а как взаимоисключающие значения.
Так что передача в качестве аргумента (RST_CLK_HSE_ON | RST_CLK_HSE_Bypass) приводит к полному RST_CLK_HSE_OFF и ожидание готовности приведёт к зависанию.
Пришлось для внешнего генератора оставить только RST_CLK_HSE_Bypass (RST_CLK_HSE2_Bypass), тогда стало работать (но внутри функции всё равно задаётся RST_CLK_HSE_ON | RST_CLK_HSE_Bypass).
Зачем надо было так путать непонятно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ethernet на 1986ВЕ3Т
СообщениеДобавлено: 2018-окт-24 08:49 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 175
Откуда: ПКК "Миландр"
Если пользуетесь функциями SPL, то используйте их правильно:
1 - В шапке у функции написано какие параметры можно подавать на вход.
Код:

  * @param  RST_CLK_HSE - mode selector
*         @arg RST_CLK_HSE_OFF    -  switch off HSE clock generator
*         @arg RST_CLK_HSE_ON     -  switch on HSE clock generator
*         @arg RST_CLK_HSE_Bypass -  use external clock source


2 - В макросе IS_RST_CLK_HSE(RST_CLK_HSE) видно какие значения являются валидными.

Код:
#define IS_RST_CLK_HSE(HSE)                  (((HSE) == RST_CLK_HSE_OFF) || \
                                              ((HSE) == RST_CLK_HSE_ON)  || \
                                              ((HSE) == RST_CLK_HSE_Bypass))


3 - Загляните в реализацию, там происходит именно то, что Вам было нужно

Код:
    case RST_CLK_HSE_Bypass:
      /* Set HSEBYP and HSEON bits */
      MDR_RST_CLK->HS_CONTROL |= RST_CLK_HSE_ON | RST_CLK_HSE_Bypass;
      break;

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ethernet на 1986ВЕ3Т
СообщениеДобавлено: 2018-окт-24 10:47 
Не в сети

Зарегистрирован: 2018-янв-19 07:44
Сообщения: 42
Vasiliy писал(а):
...

Ну да, конечно же я сам виноват, а как иначе? Если вы читали моё сообщение, то всё что вы написали я уже проделал. Я лишь написал это всё к тому, что вы путаете людей.
Если я не использую ваши функции, а пишу прямо в регистры, то я должен использовать RST_CLK_HSE_ON и RST_CLK_HSE_Bypass как флаги, которые могу объединить по "или".
В случае использования ваших функций, я почему-то должен применить другую интерпретацию и использовать RST_CLK_HSE_ON и RST_CLK_HSE_Bypass по отдельности.
За более 30 лет работы я нигде ни у кого такого не встречал, вы первые.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ethernet на 1986ВЕ3Т
СообщениеДобавлено: 2018-окт-24 11:21 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 175
Откуда: ПКК "Миландр"
Код:
  * @param  RST_CLK_HSE - mode selector
  *         @arg RST_CLK_HSE_OFF    -  switch off HSE clock generator
  *         @arg RST_CLK_HSE_ON     -  switch on HSE clock generator
  *         @arg RST_CLK_HSE_Bypass -  use external clock source

#define RST_CLK_HSE_OFF                      ((uint32_t)0x00000000)
#define RST_CLK_HSE_ON                       ((uint32_t)0x00000001)
#define RST_CLK_HSE_Bypass                 ((uint32_t)0x00000002)


Достаточно очевидно, что это не флаги.
Спорить не буду, не используйте SPL если с регистрами проще.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ethernet на 1986ВЕ3Т
СообщениеДобавлено: 2018-окт-24 11:35 
В сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1176
Откуда: Тула
Всё же работу напрямую с регистрами от передачи параметров в ф-цию библиотеки нужно различать. Совпадение есть совпадение.
Другое дело, что в СП (на всю серию) за много лет так и не появилось явного указания устанавливать бит HSE_ON в любом случае использования внешнего тактирования.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ethernet на 1986ВЕ3Т
СообщениеДобавлено: 2018-окт-24 12:06 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 175
Откуда: ПКК "Миландр"
prostoRoman писал(а):
Другое дело, что в СП (на всю серию) за много лет так и не появилось явного указания устанавливать бит HSE_ON в любом случае использования внешнего тактирования.


Действительно. Спасибо за напоминание, завел тикеты писателям.

_________________
Отдел технической поддержки support@milandr.ru


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

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


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

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


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

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