|
Аппаратная поддержка протокола синхронизации времени STM32F407+LAN8720A. |
|
|
|
Oct 7 2016, 06:49
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159

|
Здравствуйте, товарищи!
Совсем запутался. Разъясните пожалуйста!
У Microchip поддержка PTP v2 заявлена только в многопортовых Ethernet Switch, например: KSZ8463...и других из этой серии, LA9313, LAN9355...и других, но не в микроконтроллерах, ни в PIC32MX, ни в PIC32MZ. У STM32F407 поддержка PTP v2 заявлена в самом микроконтроллере, к этому микроконтроллеру присоединена LAN8720A.
Не пойму, как связаны часы микроконтроллера (модуль RTC с точностью до секунд или даже до субсекнд в случае с STM32F407) и высокоточные часы в соответсвии с PTP с точностью до 20 наносекунд, в которых время хранится 32.32 (секунды.наносекунды).
У KSZ8463 даже есть выход 1PPS (один импульс в секунду), тактируемый через протокол PTP. Но аналогичый вывод есть и у STM32F407. Не пойму, для чего он должен использоваться? Вроде как устройства на основе MCU+KSZ8463 или на STM34F407 при использовании протокола PTP могут быть мастерами, рассылать сообщения с метками времени и выдавать импульс 1PPS? Так?
И еще, в описании к KSZ8463 есть упоминание про IEC61850 (протокол цифровых подстанций), там как раз используется PTP v2 и сигналы 1PPS, по этому импульсу ежесекундно корректируются (синхронизируются) внутренние часы ведомых устройств.
|
|
|
|
|
 |
Ответов
|
Oct 7 2016, 15:54
|
Участник

Группа: Участник
Сообщений: 61
Регистрация: 13-02-12
Пользователь №: 70 242

|
Цитата(Pridnya @ Oct 7 2016, 09:49)  Не пойму, как связаны часы микроконтроллера (модуль RTC с точностью до секунд или даже до субсекнд в случае с STM32F407) и высокоточные часы в соответсвии с PTP с точностью до 20 наносекунд, в которых время хранится 32.32 (секунды.наносекунды). ... Для STM32F4. RTC и PTP - это разные таймеры. 1PPS выход реализуется как переход PTP таймера через границу секунды. Как корректируются часы (как PTP, так и RTC), а так же быть вам мастером или слэйвом по протоколу PTP - определите вы, когда напишите софт.
|
|
|
|
|
Oct 7 2016, 17:58
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159

|
Цитата(Sekat @ Oct 7 2016, 18:54)  Для STM32F4. RTC и PTP - это разные таймеры. 1PPS выход реализуется как переход PTP таймера через границу секунды. Как корректируются часы (как PTP, так и RTC), а так же быть вам мастером или слэйвом по протоколу PTP - определите вы, когда напишите софт. Спасибо! У меня есть микроконтроллер с модулем RTC, RTC тактируется от кварца 32768 Гц, предделители равны 16 и 2048, поэтому разрешение по субсекундам равно 1/2048=0,5мс, этого достаточно для фактического разрешения 1 мс, итого в модуле RTC имеем ДД.ММ.ГГ ЧЧ:ММ:СС.sss, где sss = 0...2048 субсекунд или 0...999мс. Также в микроконтроллере есть модуль Ethernet c поддержкой Time Stamp, в нем метки времени в соответсвии со стандартом IEEE1588 хранятся в виде чисел с фиксированной запятой 32.32, т.е. 32 бита для секунд (Unix time) и 32 бита для наносекунд. Там несколько регистров для меток времени и свое системное время System Time, возможно, что это внутренние часы модуля IEEE1588 Ethernet, которые тактируются частотой 50 MHz со стороны трансивера LAN8720A. Я прав или ошибаюсь? Эти внутренние часы могут синхронизироваться с внешними (мастер часы IEEE1588), мой микроконтроллер в режиме Slave (PTP-клиент). Не пойму еще один момент: после синхронизации часов модуля IEEE1588 каким-то образом произойдет (может, через прерывание) синхронизация часов модуля RTC? Как они связаны? Может кто-нибудь ответить?
|
|
|
|
|
Oct 10 2016, 06:37
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159

|
Цитата(jcxz @ Oct 8 2016, 09:07)  Как только МК включается, следует просто переписать время из RTC в один из системных таймеров (или PTP если там такой имеется) и брать время уже оттуда и синхронизировать уже этот таймер (корректируя соответственно и RTC конечно). А если связь по Ethernet есть всегда и не может пропадать, то RTC вообще не нужен - время будет получено после включения при первой же синхронизации. Прецизионные часы в модуле Ethernet (PTP clock) есть и тактируются они частотой 168 МГц (вот откуда берется наносекундное разрешение по времени), а сам модуль Ethernet тактируется частотой 50 МГц, которая приходит от микросхемы LAN8720A. Т.е. PTP clock тактируются и в отсутствии подключения к интерфейсу Ethernet, с помощью этого интерфейса они синхронизируются с более точными (PTP сервер).
Эскизы прикрепленных изображений
|
|
|
|
|
Oct 12 2016, 05:37
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159

|
Цитата(jcxz @ Oct 11 2016, 09:47)  Тогда зачем Вам вообще RTC сдался? Используйте только этот PTP- таймер и всё. Изначально я использовал RTC, который синхронизировался по RS485 (широковещательные запросы Modbus RTU). Это бюджетное решение (не требуется сервер точного времени). Затем я добавил интерфейс Ethernet, добавил протокол Modbus TCP, естественно, что пользователь, увидев интерфейс Ethernet задаст вопрос "а как синхронизировать время по при наличии сети Ethernet". Ответить "по Modbus TCP" или "широковещательными запросами по UDP от вот этой удивительной коробки с её нестандартным протоколом синхронизации, которой ни у кого нет" - будет глупостью. Да и вообще в случае интеграции девайса в какую-либо систему с наличием синхронизации в девайсе потребуется поддержка Precision Time Protocol (в промышленных сетях используется уже много лет). Бывают случаи, когда систем синхронизации на удаленных необслуживаемых объектах нет и нет там Ethernet-а, поэтому придется брать время из RTC. Ну или добавлять в девайсы SNTP-клиенты и NTP-серверы и синхронизироваться по одним из внутренних часов девайса.
Сообщение отредактировал Pridnya - Oct 12 2016, 05:39
|
|
|
|
|
Oct 12 2016, 06:42
|
Участник

Группа: Участник
Сообщений: 61
Регистрация: 13-02-12
Пользователь №: 70 242

|
1. Не надо удивительных коробок. Используйте SNTP. Сервера с SNTP доступны и недороги. Точность после 485-го вас более чем устроит. 2. Сделайте клиента SNTP на PTP таймере STM32F4. Так будет значительно проще, чем на RTC. 3. 1588 v2 - это микросекундная и субмикросекундная точность. Зачем она вам? Сервера с PTP нераспространены и дороги.
|
|
|
|
|
Dec 14 2016, 08:48
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159

|
Цитата(Sekat @ Oct 12 2016, 09:42)  1. Не надо удивительных коробок. Используйте SNTP. Сервера с SNTP доступны и недороги. Точность после 485-го вас более чем устроит. 2. Сделайте клиента SNTP на PTP таймере STM32F4. Так будет значительно проще, чем на RTC. 3. 1588 v2 - это микросекундная и субмикросекундная точность. Зачем она вам? Сервера с PTP нераспространены и дороги. Попробовал поработать с PTP-таймером STM32F407. Он состоит из двух счетчиков: 1) счетчик секунд uint32_t 2) счетчик субсекунд uint32_t c верхним значением 0x7FFFFFFF или 999999999 (зависит от настроек), при этом теоретическое разрешение по времени равно: 1) 1/(0x7FFFFFFF+1) = 0.465 наносекунды. 2) 1/(999999999+1) = 1 наносекунда. А правктически этот счетчик инкрементируется на определенное значение каждый период HCLK, которая у меня равна 168 МГц - максимальное по DataSheet. PTP-clock инициализируем (хоть с нуля) и включаем, они идут даже без подключения к сети Ethernet. Особенность у часов такая: каждый клок HCLK значение счетчика субсекунд увеличивается на заранее заданное значение в регистре ETH_PTPSSIR (Ethernet PTP subsecond increment register). Для случая, когда максимальное значение счетчка субсекнд равно 0x7FFFFFFF и тактовая частота равна HCLK равна 168 МГц значение ETH_PTPSSIR должно быть равно: 0x7FFFFFFF / 168000000 = 12,78 округляем до 13-ти. Из-за этого округления прецизионные часы будут идти неточно без внешней синхронизации. Получается, чтобы они шли точно тактовая частота HCLK должна быть такой, чтобы значение 0x7FFFFFFF / HCLK было целым. Не понимаю, почему так сделано. Ведь с микросхемы PHY LAN8720A на STM32F407 подается опорная частота 50МГц, почему бы не сделать тактирование PTP clock от этой частоты. Переключаем счетчик на верхнее значение 999999999 и выбираем частоту 50 МГц и часы бы шли более менее точно. PS: Получается, что никакого смысла использовать PTP-clock совместно с SNTP-клиентом нет, тем более, что формат меток времени NTP-timestamp не совместим с PTP-timestamp (для NTP субсекунды 0...0xFFFFFFFF, для PTP субсекунды 0...7FFFFFFF или 0...999999999). Я-то думал, что форматы меток совпадают и можно копировать метку из NTP в PTP, а здесь еще дополнительные преобразования нужны. Буду использовать системный таймер, в нем тактировать UnixTime и счетчик миллисекунд.
|
|
|
|
|
Dec 15 2016, 09:32
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159

|
Цитата(Pridnya @ Dec 14 2016, 11:48)  Для случая, когда максимальное значение счетчка субсекнд равно 0x7FFFFFFF и тактовая частота равна HCLK равна 168 МГц значение ETH_PTPSSIR должно быть равно: 0x7FFFFFFF / 168000000 = 12,78 округляем до 13-ти.
Из-за этого округления прецизионные часы будут идти неточно без внешней синхронизации. Получается, чтобы они шли точно тактовая частота HCLK должна быть такой, чтобы значение 0x7FFFFFFF / HCLK было целым. Не понимаю, почему так сделано. Ведь с микросхемы PHY LAN8720A на STM32F407 подается опорная частота 50МГц, почему бы не сделать тактирование PTP clock от этой частоты. Переключаем счетчик на верхнее значение 999999999 и выбираем частоту 50 МГц и часы бы шли более менее точно Виноват, товарищи! Это я использовал один из режимов работы PTP-clock, а там есть еще один, как раз с учетом отношения частот 168/50=3,36 и тогда часы идут очень хорошо. Вот код инициализации: Код void InitPtpClockStm32F407(void) { ETH->PTPTSAR = 0x4C30C30C; // 2^32/(168/50) = 2^32/3.36 = 1278264076.19 округляем 0x4C30C30C ETH->PTPSSIR = 20; // 20 наносекунд. /* In Fine update mode, the value in this register is added to the system time whenever the accumulator gets an overflow. Fine update mode: значение ETH->PTPSSIR добавляется к системному времени каждый раз когда аккумулятор переполняется. */ ETH->PTPTSCR |= ETH_PTPTSCR_TSE; // Time stamp enable. ETH->PTPTSCR |= ETH_PTPTSCR_TSSTI; // Time stamp initialize. ETH->PTPTSCR |= ETH_PTPTSCR_TSFCU; // Fine update method. ETH->PTPTSCR |= ETH_PTPTSCR_TSARU; // Addend register update. Если закомментировать, то часы не идут. ETH->PTPTSCR |= ETH_PTPTSCR_TSSSR; // digital rollover control, 0 - 999 999 999. ETH->PTPTSCR |= ETH_PTPTSCR_TSPTPPSV2E; // Time stamp PTP packet snooping for version2 format enable. ETH->PTPTSCR |= ETH_PTPTSCR_TSSIPV4FE; // Time stamp snapshot for IPv4 frames enable. } Эти регистры хранят секунды и наносекунды. Код sprintf(LCD.line_1,"%d%c%d",ETH->PTPTSHR, '_',ETH->PTPTSLR);
|
|
|
|
Сообщений в этой теме
Pridnya Аппаратная поддержка протокола синхронизации времени STM32F407+LAN8720A. Oct 7 2016, 06:49  Sekat Про какой микроконтроллер вы говорите? Если про ST... Oct 7 2016, 19:48   Pridnya Цитата(jcxz @ Oct 8 2016, 09:07) Что Вы т... Oct 8 2016, 19:47       scifi Цитата(Sekat @ Oct 12 2016, 09:42) 1. Не ... Oct 12 2016, 07:18       Pridnya Цитата(Sekat @ Oct 12 2016, 09:42) 1. Не ... Oct 12 2016, 11:00        Sekat Цитата(Pridnya @ Oct 12 2016, 14:00) Спас... Oct 12 2016, 11:15         Pridnya Цитата(Sekat @ Oct 12 2016, 14:15) Если х... Oct 12 2016, 12:26          Sekat Цитата(Pridnya @ Oct 12 2016, 15:26)
Так... Oct 12 2016, 12:42         gacov Цитата(Pridnya @ Dec 15 2016, 12:32)
на... Nov 11 2017, 20:52 V K to Pridnya
Удалось разобраться с PTP на STM32F407... Dec 20 2017, 15:35
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|