Миландр

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

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 310 сообщений ]  На страницу « 117 18 19 20 21 »
Автор Сообщение
СообщениеДобавлено: 2021-сен-28 13:02 
Не в сети

Зарегистрирован: 2018-дек-17 15:20
Сообщения: 172
Организация: частное лицо
Цитата:
Еще один вопрос в связи с переходом между приложениями:
Сейчас я использую USB CDC в обоих приложениях (и в том, что стартует по включению питания, и в том, на которое осуществляется переход).
Несмотря на отключение тактов на USB (USB_DevicePowerOff(); MDR_CLK->USBMAC_CLK = 0; MDR_CLK->USB0_CLK = 0;) не происходит перезапуска USB COM в системе.
Подскажите пожалуйста, как правильно отключать USB Device?
Ножки USB.DP USB.DN перевести в ручное управление и выставить на них нули.


Вернуться к началу
СообщениеДобавлено: 2021-сен-28 13:51 
Не в сети
Support
Аватара пользователя

Зарегистрирован: 2018-авг-10 23:14
Сообщения: 530
Организация: АО «ПКК Миландр»
Откуда: Зеленоград
Andrey.Microteh писал(а): *
Еще один вопрос в связи с переходом между приложениями:
Сейчас я использую USB CDC в обоих приложениях (и в том, что стартует по включению питания, и в том, на которое осуществляется переход).
Несмотря на отключение тактов на USB (USB_DevicePowerOff(); MDR_CLK->USBMAC_CLK = 0; MDR_CLK->USB0_CLK = 0;) не происходит перезапуска USB COM в системе.
Подскажите пожалуйста, как правильно отключать USB Device?
Здравствуйте!

Всё решение заключено вокруг работы физики USB, то есть линий DP и DN. В блок USB микроконтроллера 1986ВК018 встроена настройка Soft Connect/Disconnect для переключения PHY между нормальным режимом и режимом non-driving, то есть настройку можно применять для отключения устройства со своего хоста без изменения физических соединений (то есть без выдергивания кабеля). Настройка производится в регистрах POWER и CONFIGDATA внутри блока USB согласно актуальной версии спецификации на микроконтроллер 1986ВК018.

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

Информационный портал отдела технической поддержки support.milandr.ru


Вернуться к началу
СообщениеДобавлено: 2021-сен-28 14:36 
Не в сети

Зарегистрирован: 2021-авг-09 09:21
Сообщения: 35
Организация: ООО "Предприятие "Микротех"
Lampadov писал(а): *
Andrey.Microteh писал(а): *
Еще один вопрос в связи с переходом между приложениями:
Сейчас я использую USB CDC в обоих приложениях (и в том, что стартует по включению питания, и в том, на которое осуществляется переход).
Несмотря на отключение тактов на USB (USB_DevicePowerOff(); MDR_CLK->USBMAC_CLK = 0; MDR_CLK->USB0_CLK = 0;) не происходит перезапуска USB COM в системе.
Подскажите пожалуйста, как правильно отключать USB Device?
Здравствуйте!

Всё решение заключено вокруг работы физики USB, то есть линий DP и DN. В блок USB микроконтроллера 1986ВК018 встроена настройка Soft Connect/Disconnect для переключения PHY между нормальным режимом и режимом non-driving, то есть настройку можно применять для отключения устройства со своего хоста без изменения физических соединений (то есть без выдергивания кабеля). Настройка производится в регистрах POWER и CONFIGDATA внутри блока USB согласно актуальной версии спецификации на микроконтроллер 1986ВК018.
Не понял идею.
CONFIGDATA - только для чтения. Останавливаюсь на отладчике, смотрю в POWER - бит 6 ( Soft Connect/Disconnect) в 0. А по идее должен быть в 1, раз ноги DP/DM задействованы.
В Вашей библиотеке MDR32F2C10_usb_device.c есть функция USB_DevicePowerOff():
USB_Result USB_DevicePowerOff( void )
{
ClearBit( MDR_USB0->POWER, USB_PWR_SFTC_BIT );
USB_DeviceContext.USB_DeviceState = USB_DEV_STATE_UNKNOWN;

return USB_SUCCESS;
}
Запускаю ее - ничего не происходит (как был бит 6 в 0, так он и остался).
Документация гласит:
"После того, как бит Soft Conn установлен, сброс этого бита приведет к установке OPMODE [1:0] на 01b, PHY перейдет в
режим non-driving, а линии D+ и D- будут тройном состоянии. После этого контроллер будет
отключен от других устройств на шине USB."

Попробовал запустить Ваш пример usb_cdc_echo. Там то же самое, бит SOFT_CONN стоит в 0 при работающем USB COM.
Так какой бит отвечает за сброс ног? Что-то я не понимаю...


Вернуться к началу
СообщениеДобавлено: 2021-сен-30 11:18 
Не в сети

Зарегистрирован: 2021-авг-09 09:21
Сообщения: 35
Организация: ООО "Предприятие "Микротех"
Проблему я обошел.
При переходе из одного приложения в другое в регисте SCB->AIRCR установил бит системного сброса аналогично NVIC_SystemReset:
typedef void(*pHandler)(void);

void GotoApplication(uint32_t applicationStartAddress)
{
__disable_irq();
SysTickDisable();
CLK_SetSystemClock(MAX_CLK_HSI);
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | SCB_AIRCR_SYSRESETREQ_Msk); // Keep priority group unchanged
SCB->VTOR = applicationStartAddress;
register pHandler ResetHandlerPfunc = *((volatile pHandler *)(applicationStartAddress+4));
__set_MSP(*(uint32_t*)applicationStartAddress);
ResetHandlerPfunc();
}

USB при этом стал перезапускаться.
Однако вопрос остался открытым: в режиме USB Device бит 6 Soft Connect/Disconnect в регистре MDR_USB->POWER стоит в 0, хотя должен быть в 1 при включенных ногах, и соответственно его сброс не приводит к выключению ног USB.


Вернуться к началу
СообщениеДобавлено: 2021-сен-30 11:49 
Не в сети
Support
Аватара пользователя

Зарегистрирован: 2018-авг-10 23:14
Сообщения: 530
Организация: АО «ПКК Миландр»
Откуда: Зеленоград
Andrey.Microteh писал(а): *
Проблему я обошел.
При переходе из одного приложения в другое в регисте SCB->AIRCR установил бит системного сброса аналогично NVIC_SystemReset:
typedef void(*pHandler)(void);

void GotoApplication(uint32_t applicationStartAddress)
{
__disable_irq();
SysTickDisable();
CLK_SetSystemClock(MAX_CLK_HSI);
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | SCB_AIRCR_SYSRESETREQ_Msk); // Keep priority group unchanged
SCB->VTOR = applicationStartAddress;
register pHandler ResetHandlerPfunc = *((volatile pHandler *)(applicationStartAddress+4));
__set_MSP(*(uint32_t*)applicationStartAddress);
ResetHandlerPfunc();
}

USB при этом стал перезапускаться.
Однако вопрос остался открытым: в режиме USB Device бит 6 Soft Connect/Disconnect в регистре MDR_USB->POWER стоит в 0, хотя должен быть в 1 при включенных ногах, и соответственно его сброс не приводит к выключению ног USB.
Здравствуйте!

Спасибо за дополнительную информацию, конфигурация регистра AIRCR, поля SYSRESETREQ, инициирует процесс программного сброса микроконтроллера. По части работы функционала вокруг бита "Soft Connect / Disconnect" внутри блока USB 1986ВК018/016 ведется исследование, о всех результатах будет сообщаться в текущей теме официального форума. Спасибо за ожидание.

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

Информационный портал отдела технической поддержки support.milandr.ru


Вернуться к началу
СообщениеДобавлено: 2021-окт-01 09:44 
Не в сети

Зарегистрирован: 2021-авг-09 09:21
Сообщения: 35
Организация: ООО "Предприятие "Микротех"
Добрый день.
У меня проблема с перезаписью внутренней флэш.
Из Вашего примера Flash_Source взял функции чтения/записи/стирания флэш.
Запускаю прикладную программу с 0x0100.8000, функции работы с флэш - __ramfunc
Вычитываю сектор флэш с адреса 0x0100.0000 в буфер ОЗУ. Стираю во флэш этот сектор. Записываю его же на место с верификацией. При верификации проверяю содержимое и ECC - все сходится.
После этого вычитываю этот же сектор во второй буфер в ОЗУ и сравниваю с первым буфером побайтно - содержимое сходится.
При попытке перейти на выполнение кода из этого сектора - HardFaultHandler. При этом MDR_FLASH->ECCCS показывает ошибку ECC.
Я не понимаю, я неправильно рассчитываю ECC при записи? Или стираю неправильно?
Приложил тестовый пример.
Поправьте меня пожалуйста.


Вложения:
test.zip [4.99 МБ]
68 скачиваний
Вернуться к началу
СообщениеДобавлено: 2021-окт-05 14:09 
Не в сети
Support
Аватара пользователя

Зарегистрирован: 2018-авг-10 23:14
Сообщения: 530
Организация: АО «ПКК Миландр»
Откуда: Зеленоград
Andrey.Microteh писал(а): *
Добрый день.
У меня проблема с перезаписью внутренней флэш.
Из Вашего примера Flash_Source взял функции чтения/записи/стирания флэш.
Запускаю прикладную программу с 0x0100.8000, функции работы с флэш - __ramfunc
Вычитываю сектор флэш с адреса 0x0100.0000 в буфер ОЗУ. Стираю во флэш этот сектор. Записываю его же на место с верификацией. При верификации проверяю содержимое и ECC - все сходится.
После этого вычитываю этот же сектор во второй буфер в ОЗУ и сравниваю с первым буфером побайтно - содержимое сходится.
При попытке перейти на выполнение кода из этого сектора - HardFaultHandler. При этом MDR_FLASH->ECCCS показывает ошибку ECC.
Я не понимаю, я неправильно рассчитываю ECC при записи? Или стираю неправильно?
Приложил тестовый пример.
Поправьте меня пожалуйста.
Здравствуйте!

Обратите, пожалуйста, внимание, что ECC в функции ProgramPage() из FLM, которую Вы встроили в свой код в виде надстроечной функции Write(), считается на основании адреса, переданного в эту функцию. Вариант с передачей адреса "startAddress - FLASH_START_ADDRESS" (startAddress = 0x01000000, FLASH_START_ADDRESS = 0x01000000) приводит к переходу в функцию Write() с адресом 0x0, из-за чего производится неверный расчёт ECC.

Будьте, пожалуйста, внимательны. Парировать такие ошибки можно в том числе с подключением в работу регистров ECCADR, ECCDATA и ECCECC при их активации полями FIX_SECC и FIX_DECC регистра ECCCS для одиночных и двойных ошибок соответственно.

Спасибо за обращение.

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

Информационный портал отдела технической поддержки support.milandr.ru


Вернуться к началу
СообщениеДобавлено: 2021-окт-06 06:50 
Не в сети

Зарегистрирован: 2021-авг-09 09:21
Сообщения: 35
Организация: ООО "Предприятие "Микротех"
Lampadov писал(а): *
Andrey.Microteh писал(а): *
Добрый день.
У меня проблема с перезаписью внутренней флэш.
Из Вашего примера Flash_Source взял функции чтения/записи/стирания флэш.
Запускаю прикладную программу с 0x0100.8000, функции работы с флэш - __ramfunc
Вычитываю сектор флэш с адреса 0x0100.0000 в буфер ОЗУ. Стираю во флэш этот сектор. Записываю его же на место с верификацией. При верификации проверяю содержимое и ECC - все сходится.
После этого вычитываю этот же сектор во второй буфер в ОЗУ и сравниваю с первым буфером побайтно - содержимое сходится.
При попытке перейти на выполнение кода из этого сектора - HardFaultHandler. При этом MDR_FLASH->ECCCS показывает ошибку ECC.
Я не понимаю, я неправильно рассчитываю ECC при записи? Или стираю неправильно?
Приложил тестовый пример.
Поправьте меня пожалуйста.
Здравствуйте!

Обратите, пожалуйста, внимание, что ECC в функции ProgramPage() из FLM, которую Вы встроили в свой код в виде надстроечной функции Write(), считается на основании адреса, переданного в эту функцию. Вариант с передачей адреса "startAddress - FLASH_START_ADDRESS" (startAddress = 0x01000000, FLASH_START_ADDRESS = 0x01000000) приводит к переходу в функцию Write() с адресом 0x0, из-за чего производится неверный расчёт ECC.

Будьте, пожалуйста, внимательны. Парировать такие ошибки можно в том числе с подключением в работу регистров ECCADR, ECCDATA и ECCECC при их активации полями FIX_SECC и FIX_DECC регистра ECCCS для одиночных и двойных ошибок соответственно.

Спасибо за обращение.
Спасибо большое за помощь!
Конечно, не ошибается тот, кто ничего не делает... Но неприятно чувствовать себя некомпетентным.


Вернуться к началу
СообщениеДобавлено: 2021-окт-07 10:41 
Не в сети
Support
Аватара пользователя

Зарегистрирован: 2018-авг-10 23:14
Сообщения: 530
Организация: АО «ПКК Миландр»
Откуда: Зеленоград
Andrey.Microteh писал(а): *
Проблему я обошел.
При переходе из одного приложения в другое в регисте SCB->AIRCR установил бит системного сброса аналогично NVIC_SystemReset:
typedef void(*pHandler)(void);

void GotoApplication(uint32_t applicationStartAddress)
{
__disable_irq();
SysTickDisable();
CLK_SetSystemClock(MAX_CLK_HSI);
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | SCB_AIRCR_SYSRESETREQ_Msk); // Keep priority group unchanged
SCB->VTOR = applicationStartAddress;
register pHandler ResetHandlerPfunc = *((volatile pHandler *)(applicationStartAddress+4));
__set_MSP(*(uint32_t*)applicationStartAddress);
ResetHandlerPfunc();
}

USB при этом стал перезапускаться.
Однако вопрос остался открытым: в режиме USB Device бит 6 Soft Connect/Disconnect в регистре MDR_USB->POWER стоит в 0, хотя должен быть в 1 при включенных ногах, и соответственно его сброс не приводит к выключению ног USB.
Здравствуйте!

Благодарим за ожидание, потребовалось время, чтобы проанализировать RTL-описание на блок с разработчиками.

Обратите, пожалуйста, внимание, что изначально в ходе детального исследования было выяснено, что действительно бит "Soft Connect / Disconnect", отвечающий за отключение работы физического уровня по выводам DP и DN, в ходе работы блока USB отрабатывает неверно, несмотря на то, что с ним ведут работу несколько функций из библиотеки, в том числе при базовой конфигурации блока, если выбран режим "Device" - то есть фактически строки кода, завязанные на переключении "Soft Connect / Disconnect", ничего не выполняют. Предположение о том, что данный функционал просто не реализован на уровне RTL подтвердился: функция не была имплементирована в описании. На работу блока USB данный бит никак не влияет, но его упоминание будет исключаться как из библиотек SPL для микроконтроллера 1986ВК018/016, так и из спецификации. Соответственно, если стоит вопрос отключения ведомого устройства USB от хоста, то программный сброс является хорошим выходом из данной ситуации.

Большое спасибо как за обращение, так и за проверенное решение.

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

Информационный портал отдела технической поддержки support.milandr.ru


Вернуться к началу
СообщениеДобавлено: 2021-окт-15 17:54 
Не в сети
Support
Аватара пользователя

Зарегистрирован: 2018-авг-10 23:14
Сообщения: 530
Организация: АО «ПКК Миландр»
Откуда: Зеленоград
Andrey.Microteh писал(а): *
Добрый день.
Планируется ли портирование и подключение LwIP на Ваш контроллер?
Здравствуйте!

Обратите, пожалуйста, внимание, что во вложении к посту находится проект по работе с LwIP в микроконтроллере 1986ВК018/016. Проект базируется на ОС FreeRTOS, при этом реализована только базовая функциональность по получению IP - любой другой функционал реализуется самостоятельно.

Благодарим за обращение.


Вложения:
1986VK018_dhcp.zip [1.3 МБ]
29 скачиваний

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

Информационный портал отдела технической поддержки support.milandr.ru
Вернуться к началу
СообщениеДобавлено: 2021-окт-19 11:49 
Не в сети

Зарегистрирован: 2021-авг-09 09:21
Сообщения: 35
Организация: ООО "Предприятие "Микротех"
Добрый день.
Разбираю Ваш пример с RTC, появился вопрос:
в файле rtc.c в функции InitRtc задается разрешение клоков, прескалер в 3 регистра (REG_64_TMR0..2,RTC_PRL_TMR0..2):

//RTC_ReadyWait();
MDR_BKP->REG_64_TMR0 = 0x00000401;//0x00000C01;
MDR_BKP->REG_64_TMR1 = 0x00000401;
MDR_BKP->REG_64_TMR2 = 0x00000401;
//RTC_ReadyWait();
MDR_BKP->RTC_PRL_TMR0 = RTC_PRESCALER_VALUE;
//RTC_ReadyWait();
MDR_BKP->RTC_PRL_TMR1 = RTC_PRESCALER_VALUE;
//RTC_ReadyWait();
MDR_BKP->RTC_PRL_TMR2 = RTC_PRESCALER_VALUE;

А потом почему-то работа продолжается только с 1 регистром из трех:

//RTC_ReadyWait();
MDR_BKP->REG_64_TMR0 |= (RTC_CalibratorValue & 0x3F) << 2;

//RTC_ReadyWait();
MDR_BKP->REG_64_TMR0 |= 0x00000800;//0x00000C01;

//RTC_ReadyWait();
MDR_BKP->RTC_CS_TMR0 |= 0x00000010;

Если регистры RTC надо писать по 3, то по идее и разрешение работы RTC ( MDR_BKP->REG_64_TMR0 |= 0x00000800) надо писать во все 3 регистра?
Поясните пожалуйста.

Еще один странный артефакт.
Запускаю RTC, время и дата нормально устанавливаются и читаются. Как только пытаюсь выполнить чтение или запись из внутренней флэш в регистровом режиме, так после этого в RTC_ReadyWait перестает устанавливаться нужный бит WEN. Попробовал по выходе из процедуры работы с флэш перезапускать InitRtc - не помогает. Все прерывания на выходе из флэш нормально восстанавливаются и продолжают работать. А в MDR_BKP->RTC_CS_TMR0..2 больше не возникает 6 бит.


Вернуться к началу
СообщениеДобавлено: 2021-окт-19 17:49 
Не в сети
Support

Зарегистрирован: 2017-май-31 15:10
Сообщения: 107
Организация: АО "ПКК Миландр"
Откуда: АО "ПКК Миландр"
Добрый день.
Andrey.Microteh писал(а): *
Если регистры RTC надо писать по 3, то по идее и разрешение работы RTC ( MDR_BKP->REG_64_TMR0 |= 0x00000800) надо писать во все 3 регистра?
Поясните пожалуйста.
Согласно документации:
При записи в регистры батарейной памяти запись происходит одновременно в три регистра, при этом не имеет значения, по какому адресу из этих трех регистров производится запись.
Драйвер поправим. Спасибо.
Andrey.Microteh писал(а): *
Еще один странный артефакт.
Запускаю RTC, время и дата нормально устанавливаются и читаются. Как только пытаюсь выполнить чтение или запись из внутренней флэш в регистровом режиме, так после этого в RTC_ReadyWait перестает устанавливаться нужный бит WEN. Попробовал по выходе из процедуры работы с флэш перезапускать InitRtc - не помогает. Все прерывания на выходе из флэш нормально восстанавливаются и продолжают работать. А в MDR_BKP->RTC_CS_TMR0..2 больше не возникает 6 бит.
Можно, пожалуйста, увидеть пример с проявлением артефакта.

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


Вернуться к началу
СообщениеДобавлено: 2021-окт-20 08:33 
Не в сети

Зарегистрирован: 2021-авг-09 09:21
Сообщения: 35
Организация: ООО "Предприятие "Микротех"
Andrey.Microteh писал(а): *
Еще один странный артефакт.
Запускаю RTC, время и дата нормально устанавливаются и читаются. Как только пытаюсь выполнить чтение или запись из внутренней флэш в регистровом режиме, так после этого в RTC_ReadyWait перестает устанавливаться нужный бит WEN. Попробовал по выходе из процедуры работы с флэш перезапускать InitRtc - не помогает. Все прерывания на выходе из флэш нормально восстанавливаются и продолжают работать. А в MDR_BKP->RTC_CS_TMR0..2 больше не возникает 6 бит.
Можно, пожалуйста, увидеть пример с проявлением артефакта.
[/quote]
Вот тестовый проект с примером. Нормальный RtcSetTime до чтения флэш и баг RtcSetTime после чтения.
Вложение:
test.zip [2.33 МБ]
20 скачиваний


Вернуться к началу
СообщениеДобавлено: 2021-окт-20 14:07 
Не в сети
Support

Зарегистрирован: 2017-май-31 15:10
Сообщения: 107
Организация: АО "ПКК Миландр"
Откуда: АО "ПКК Миландр"
Andrey.Microteh писал(а): *
Вот тестовый проект с примером. Нормальный RtcSetTime до чтения флэш и баг RtcSetTime после чтения.
test.zip
Спасибо.
Функция ReadFlash(DATA_START_ADDRESS,(unsigned char *)&tmp,4) выполняет вызов FlashInit (), внутри которой, происходит блокировка записи в регистры BKP, то есть, перетирается ключ разрешения записи в регистры - 0x8555AAA1.
Открыть FlashInit()
__ramfunc void FlashInit (void) 
{
....

  MDR_BKP->KEY = 0x42;
...  
}
Закрыть
Соответственно, после этого все остальные записи в батарейный домен фактически не происходят и флаг в RTC_ReadyWait () никогда не выставляется.

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


Вернуться к началу
СообщениеДобавлено: 2021-окт-21 09:04 
Не в сети

Зарегистрирован: 2021-авг-09 09:21
Сообщения: 35
Организация: ООО "Предприятие "Микротех"
Artem1 писал(а): *
Andrey.Microteh писал(а): *
Вот тестовый проект с примером. Нормальный RtcSetTime до чтения флэш и баг RtcSetTime после чтения.
test.zip
Спасибо.
Функция ReadFlash(DATA_START_ADDRESS,(unsigned char *)&tmp,4) выполняет вызов FlashInit (), внутри которой, происходит блокировка записи в регистры BKP, то есть, перетирается ключ разрешения записи в регистры - 0x8555AAA1.
Открыть FlashInit()
__ramfunc void FlashInit (void) 
{
....

  MDR_BKP->KEY = 0x42;
...  
}
Закрыть
Соответственно, после этого все остальные записи в батарейный домен фактически не происходят и флаг в RTC_ReadyWait () никогда не выставляется.
Спасибо. Никак не привыкну к Вашей блокировке регистров от записи.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 310 сообщений ]  На страницу « 117 18 19 20 21 »

Часовой пояс: UTC+03:00


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

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


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

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB