Миландр

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

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




Начать новую тему Ответить на тему  [ Сообщений: 42 ]  На страницу 1, 2, 3 Все  След.
Автор Сообщение
 Заголовок сообщения: К1986ВЕ92 не отправляет UART
СообщениеДобавлено: 2019-май-25 18:12 
Не в сети

Зарегистрирован: 2014-сен-16 11:58
Сообщения: 106
Прошу помощи, не могу заставить UART что-то отправлять. Это UART2, выходы PD0/PD1. Через эти пины я успешно заливаю прошивку, в ней должны мигать светодиоды и затем после цикла отправляться байт в UART. Так вот светодиоды мигают успешно, ничего не виснет, но байта на выходе увидеть я не могу. Никакая из программ для работы с COM-портами не показывает что принимаются данные хоть битые хоть правильные.

Пересмотрел все примеры, у меня всё в точности повторяется. И FIFO включал выключал. Вот могу какие-нибудь биты статусных регистров UART на светодиоды вывести, чтобы отладить, но только вот какие?

Ранее я работал с UART на этом МК на других платах - всё работало. А это самодельная. Но ведь прошивается же через UART, через ровно эти же PD0/PD1 UART2. Работаю через USB-UART преобразователь. Режим программирования после прошивки убираю и включаю МК заново, это ошибка некоторых новичков, но не в моем случае.

Прошу помочь, что я могу не увидеть в процессе настройки? Уже вторую неделю периодически кидаюсь решить проблему, и не вижу выхода.

Не могу прикрепить файл к теме, поэтому ссылка: http://paste.org.ru/?f1h1z2


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: К1986ВЕ92 не отправляет UART
СообщениеДобавлено: 2019-май-25 22:22 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 71
1. Объявите прототип функции void rgb_set(unsigned int color). Для остальных своих функций вы это сделали, а для этой забыли.

2. В функции void init_clock() перед переходом на тактирование ядра от PLL установите требуемую задержку доступа к флеш-памяти (регистр MDR_EEPROM->CMD ), а после перехода - выберите нужную дополнительную стабилизирующую нагрузку для встроенного регулятора напряжения (регистр MDR_BKP->REG_0E )

3. В функции void init_usart() уберите включение аппаратного управления потоком данных (строка usart.UART_HardwareFlowControl = UART_HardwareFlowControl_RXE | UART_HardwareFlowControl_TXE;)
Вы включили режим аппаратного управления потоком данных, который вам не нужен. Скорее всего именно из-за этого не происходит передачи - UART ожидает, но не видит либо запроса на передачу данных, либо сигнала готовности принимать данные. Прочитайте внимательно раздел 28.6 - Аппаратное управление потоком данных. Вы ведь никак не используете сигналы управления модемом.

4. В функции void usart_tx_byte(const char data) в строке
while(!(MDR_UART2->FR & (1<<7)));
поменяйте маску с (1>>7) на (1>>3). Ориентируйтесь по биту BUSY а не TXFE. Это надёжней.

И ещё. Квалификатор const при аргументе функции, передаваемому по значению, а не по указателю или ссылке не имеет смысла. Любое изменение аргумента внутри функции никак не повлияет на фактически передаваемое значение, т.к. в функцию передаётся КОПИЯ значения аргумента, а не его адрес (указатель или ссылка на аргумент).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: К1986ВЕ92 не отправляет UART
СообщениеДобавлено: 2019-май-26 14:38 
Не в сети

Зарегистрирован: 2014-сен-16 11:58
Сообщения: 106
Professor Chaos писал(а):
3. В функции void init_usart() уберите включение аппаратного управления потоком данных (строка usart.UART_HardwareFlowControl = UART_HardwareFlowControl_RXE | UART_HardwareFlowControl_TXE;)
Вы включили режим аппаратного управления потоком данных, который вам не нужен. Скорее всего именно из-за этого не происходит передачи - UART ожидает, но не видит либо запроса на передачу данных, либо сигнала готовности принимать данные. Прочитайте внимательно раздел 28.6 - Аппаратное управление потоком данных. Вы ведь никак не используете сигналы управления модемом.

4. В функции void usart_tx_byte(const char data) в строке
while(!(MDR_UART2->FR & (1<<7)));
поменяйте маску с (1>>7) на (1>>3). Ориентируйтесь по биту BUSY а не TXFE. Это надёжней

Спасибо за рекомендации!
Я ранее пробовал все эти комбинации, их не так много.
Сейчас у меня стоит UART_HardwareFlowControl_None и UART_FIFO_OFF, а флаг смотрю при отправке такой: while(MDR_UART2->FR & (1<<3)) потому что мы должны наоборот ждать, что busy сбросится в 0 прежде чем засовывать следующий байт.
Тем не менее, при попытке отправлять байт в UART контроллер все равно виснет, светодиод ставится в синий а следующая строка отправляет байт. Он виснет и до того как я убрал ! в цикле while для флага busy.

Тут у меня догадка, что что-то с тактированием, модуль не функционирует, что-то я не включил, не поданы такты вот и флаг не снимается в 0. Пока не понял почему.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: К1986ВЕ92 не отправляет UART
СообщениеДобавлено: 2019-май-26 15:51 
Не в сети

Зарегистрирован: 2014-сен-16 11:58
Сообщения: 106
Я зашел в файл MDR32F9Qx_config.h и с ужасом обнаружил, что у меня был неверно выставлен тип МК, подключались неверные служебные заголовочники и дефайны.

Исправил дефайны вручную (без файла _board.h). Но это не помогло. Буду рыть дальше. Саму библиотеку брал тут https://github.com/eldarkg/emdr1986x-std-per-lib
А файлы конкретно из MDR32F9Qx_StdPeriph_Driver

Пока что не работает. Еще закомментил USE_JTAG_B, видел такой совет пока искал на форуме.

Исправил так (diff):
Код:
@@ -47,22 +47,10 @@
extern "C" {
#endif

-#if ((__CC_ARM == 0) || (__ARMCC_VERSION < 5000000))
-   #include "MDR32F9Qx_board.h"
-#endif
#include "MDR32F9Qx_lib.h"
#include <stdint.h>

-#if defined (USE_MDR32F9Q1_Rev0) || defined (USE_MDR32F9Q1_Rev1) ||\
-    defined (USE_MDR32F9Q2_Rev0) || defined (USE_MDR32F9Q2_Rev1) ||\
-    defined (USE_MDR32F9Q3_Rev0) || defined (USE_MDR32F9Q3_Rev1) ||\
-    defined (USE_MDR1986VE94)
-   #define USE_MDR1986VE9x
-#endif
-
-#if defined (USE_MDR1986BE7T)
-   #define USE_MDR1986VE1T
-#endif
+#define USE_MDR1986VE9x

/* Select the header file for target microcontroller */
#if defined ( USE_MDR1986VE9x )
@@ -81,7 +69,7 @@
  * if there is no JTAG ports */
#if (defined(USE_MDR1986VE9x) || defined (USE_MDR1901VC1T))
/* #define USE_JTAG_A */
-#define USE_JTAG_B
+//#define USE_JTAG_B
#endif

/* Target system parameters */


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: К1986ВЕ92 не отправляет UART
СообщениеДобавлено: 2019-май-26 19:34 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 71
Посмотрите отладчиком значения регистров настройки UART (CR, LCR_H, IBRD, FBRD) и сравните содержимое их битовых полей с требуемым по логике работы вашей программы.
Ну и значение макроса HSE_Value должно быть задано правильно, равное (в Гц) реальной частоте вашего кварца. Задаётся в файле MDR32F9Qx_config.h. Без этого скорость передачи будет задана неправильно.
Цитата:
Еще закомментил USE_JTAG_B, видел такой совет пока искал на форуме.

Комментировать нужно тот макрос, что определяет выводы JTAG, не используемые для отладки.
Если вы подключаетесь отладчиком к выводам JTAG A, тогда нужно оставить макрос USE_JTAG_A, и закомментировать макрос USE_JTAG_B.
Если вы подключаетесь отладчиком к выводам JTAG B, тогда нужно оставить макрос USE_JTAG_B, и закомментировать макрос USE_JTAG_A.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: К1986ВЕ92 не отправляет UART
СообщениеДобавлено: 2019-май-26 20:00 
Не в сети

Зарегистрирован: 2014-сен-16 11:58
Сообщения: 106
Professor Chaos писал(а):
Посмотрите отладчиком значения регистров настройки UART (CR, LCR_H, IBRD, FBRD) и сравните содержимое их битовых полей с требуемым по логике работы вашей программы

У меня нет JTAG, только вслепую, могу биты выводить через RGB. Вообще три бита за 1 раз могу выдать и посмотреть на цвет. Надеялся как раз UART использовать для всей прочей отладки...

Professor Chaos писал(а):
Ну и значение макроса HSE_Value должно быть задано правильно, равное (в Гц) реальной частоте вашего кварца. Задаётся в файле MDR32F9Qx_config.h. Без этого скорость передачи будет задана неправильно

Кварц 8 МГц, задан верно там.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: К1986ВЕ92 не отправляет UART
СообщениеДобавлено: 2019-май-26 22:02 
Не в сети

Зарегистрирован: 2018-мар-18 15:49
Сообщения: 3
Я бы попробовал:
1 - Загружаться в режиме MODE=001, чтобы JtagB не был активен.
2 - Посмотреть осциллографом на выводах RX/TX, есть ли вообще какие-то импульсы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: К1986ВЕ92 не отправляет UART
СообщениеДобавлено: 2019-май-26 22:15 
Не в сети

Зарегистрирован: 2014-сен-16 11:58
Сообщения: 106
StartMilandr писал(а):
Я бы попробовал:
1 - Загружаться в режиме MODE=001, чтобы JtagB не был активен.
2 - Посмотреть осциллографом на выводах RX/TX, есть ли вообще какие-то импульсы.

Проблематично, я схемотехнически на своей плате сделал так, что можно либо 000 либо через джампер 101, сразу оба тяну... Надо попробовать на другой отладочной плате от LDM.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: К1986ВЕ92 не отправляет UART
СообщениеДобавлено: 2019-май-26 23:01 
Не в сети

Зарегистрирован: 2018-мар-18 15:49
Сообщения: 3
Тогда в программе стоит отключить Jtag_B в регистре BKP->REG_OE. А то получается что и Jtag по PD0-PD1 активен, и UART2 на этих же выводах работает. Маловероятно, что это причина проблемы, но и хорошего в этом нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: К1986ВЕ92 не отправляет UART
СообщениеДобавлено: 2019-май-28 09:29 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 389
Откуда: ПКК "Миландр"
Если вывод PD1 (UART2_TX) вообще не дергается, то скорее всего дело в библиотеке и в защите пинов Jtag. Предполагаю что не дергаются, поскольку иначе на компьютере по любому хотя бы битые слова принимались. Но лучше проверить осциллографом на выводах МК.

Вставьте проверку того, что отключение USE_JTAG_B сработало и регистры Port_D имеют правильную настройку. Статус вывести на светодиоды. Это на случай если при компиляции MDR32F9Qx_port.c подтягивается не тот MDR32F9Qx_config.h, в котором отключено USE_JTAG_B.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: К1986ВЕ92 не отправляет UART
СообщениеДобавлено: 2019-май-31 23:40 
Не в сети

Зарегистрирован: 2014-сен-16 11:58
Сообщения: 106
StartMilandr писал(а):
Тогда в программе стоит отключить Jtag_B в регистре BKP->REG_OE. А то получается что и Jtag по PD0-PD1 активен, и UART2 на этих же выводах работает. Маловероятно, что это причина проблемы, но и хорошего в этом нет.

Код:
000 Микроконтроллер в режиме отладки Процессор начинает выполняет программу из внутренней Flash-памяти программ. При этом установлен отладочный интерфейс JTAG_B

JTAG B
В качестве выводов интерфейса используются выводы порта D, совмещенные с каналами АЦП, выводами каналов Таймера 1 и 3, UART2 и SSP2, использование которых при отладке запрещено

Ох едрен батон, у меня как раз этот режим, значит и JTAG B включен. Пока не проверял, но вижу что это так. А оно именно что на линиях PD0/PD1 сидит. При отладке использование запрещено, т.е. даже если JTAG там не висит, раз включен - считается что отладка работает, верно?

Из-за схемотехники платы, я не могу включить другой режим, но можно ли это сделать программно?

BKP->REG_OE - не вижу его в документации, что это, где искать? Искал отдельно BKP и REG_OE
update: нашел! MDR_BKP->REG_0E "ноль е", не "о е"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: К1986ВЕ92 не отправляет UART
СообщениеДобавлено: 2019-июн-01 19:40 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1319
Откуда: Тула
LinuxFanatic писал(а):
Из-за схемотехники платы, я не могу включить другой режим, но можно ли это сделать программно?

Режим переключить точно можно. Нужно записать код нового режима и сделать ресет (только не по питанию!). Пробуйте.
Есть такой лайфхак: если используете фуллдуплекс uart (RS-232, RS-422 и подобные) на пинах PD0, PD1 и лень писать загрузчик (или желаете для обновления прошивки использовать встроенный в кристалл загрузчик) - достаточно сменить режим и дёрнуть софт-ресет и можно использовать стандартную программу :)

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: К1986ВЕ92 не отправляет UART
СообщениеДобавлено: 2019-июн-03 14:55 
Не в сети

Зарегистрирован: 2014-сен-16 11:58
Сообщения: 106
Vasiliy писал(а):
Вставьте проверку того, что отключение USE_JTAG_B сработало и регистры Port_D имеют правильную настройку. Статус вывести на светодиоды. Это на случай если при компиляции MDR32F9Qx_port.c подтягивается не тот MDR32F9Qx_config.h, в котором отключено USE_JTAG_B.

Так и есть, светодиоды говорят "работает jtag b". Буду отключать оба jtag и делать soft reset.
А как делать soft reset??? Прочитал доку и вижу reset только у ядра USB, либо сброс по watch dog. Программный reset делается через watch dog?

prostoRoman писал(а):
Есть такой лайфхак: если используете фуллдуплекс uart (RS-232, RS-422 и подобные) на пинах PD0, PD1 и лень писать загрузчик (или желаете для обновления прошивки использовать встроенный в кристалл загрузчик) - достаточно сменить режим и дёрнуть софт-ресет и можно использовать стандартную программу :)

Спасибо, интересная возможность.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: К1986ВЕ92 не отправляет UART
СообщениеДобавлено: 2019-июн-03 15:16 
Не в сети

Зарегистрирован: 2014-сен-16 11:58
Сообщения: 106
Делаю выключение так:
Код:
#if 1 // turn off jtag
   if((MDR_BKP->REG_0E & (1<<6)) || (MDR_BKP->REG_0E & (1<<7)))
   {
      MDR_BKP->REG_0E &= ~(1<<6);
      MDR_BKP->REG_0E &= ~(1<<7);
      MDR_WWDG->CFR = 0x00;
      MDR_WWDG->CR = 0xFF;
      MDR_WWDG->CR = 0xFF;
   }
#endif
После чего получаю
Код:
      if((MDR_BKP->REG_0E & 0xC0) == 0)
      {
         rgb_set(0x0000FF);
         delay_ms(250);
         rgb_set(0x000000);
         delay_ms(250);
      }
Мигает синий светодиод, значит JTAG A и B выключены. Но UART по-прежнему молчит. Отправляю при помощи UART_SendData(MDR_UART2, 0xC3);

Код:
void init_usart()
{
   PORT_InitTypeDef port;
   UART_InitTypeDef uart;

   RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTD, ENABLE);
   PORT_StructInit(&port);
   port.PORT_PULL_UP = PORT_PULL_UP_OFF;
   port.PORT_PULL_DOWN = PORT_PULL_DOWN_OFF;
   port.PORT_PD_SHM = PORT_PD_SHM_OFF;
   port.PORT_PD = PORT_PD_DRIVER;
   port.PORT_GFEN = PORT_GFEN_OFF;
   port.PORT_FUNC = PORT_FUNC_ALTER;
   port.PORT_SPEED = PORT_SPEED_MAXFAST;
   port.PORT_MODE = PORT_MODE_DIGITAL;
   port.PORT_OE = PORT_OE_OUT;
   port.PORT_Pin = PORT_Pin_1;
   PORT_Init(MDR_PORTD, &port);
   port.PORT_OE = PORT_OE_IN;
   port.PORT_Pin = PORT_Pin_0;
   PORT_Init(MDR_PORTD, &port);

   RST_CLK_PCLKcmd(RST_CLK_PCLK_UART2, ENABLE);
   UART_BRGInit(MDR_UART2, UART_HCLKdiv1);
   UART_StructInit(&uart);
   uart.UART_BaudRate = 115200;
   uart.UART_WordLength = UART_WordLength8b;
   uart.UART_StopBits = UART_StopBits1;
   uart.UART_Parity = UART_Parity_No;
   uart.UART_FIFOMode = UART_FIFO_OFF;
   uart.UART_HardwareFlowControl = UART_HardwareFlowControl_None;
   UART_Init(MDR_UART2, &uart);
   UART_Cmd(MDR_UART2, ENABLE);
}

void init_clock()
{
   NVIC->ICPR[0] = 0xFFFFFFFF;
   NVIC->ICER[0] = 0xFFFFFFFF;
   MDR_DMA->CHNL_REQ_MASK_CLR = 0xFFFFFFFF;
   MDR_DMA->CHNL_USEBURST_CLR = 0xFFFFFFFF;

#if 1 // turn off jtag
   if((MDR_BKP->REG_0E & (1<<6)) || (MDR_BKP->REG_0E & (1<<7)))
   {
      MDR_BKP->REG_0E &= ~(1<<6);
      MDR_BKP->REG_0E &= ~(1<<7);
      MDR_WWDG->CFR = 0x00;
      MDR_WWDG->CR = 0xFF;
      MDR_WWDG->CR = 0xFF;
   }
#endif

   RST_CLK_HSEconfig(RST_CLK_HSE_ON);
   while(RST_CLK_HSEstatus() != SUCCESS);
   RST_CLK_CPU_PLLconfig(RST_CLK_CPU_PLLsrcHSEdiv1, RST_CLK_CPU_PLLmul10);
   RST_CLK_CPU_PLLcmd(ENABLE);
   if(RST_CLK_CPU_PLLstatus() == ERROR) while(1);
   RST_CLK_PCLKcmd(RST_CLK_PCLK_EEPROM, ENABLE);
   RST_CLK_CPU_PLLuse(ENABLE);
   RST_CLK_CPUclkPrescaler(RST_CLK_CPUclkDIV1);
   RST_CLK_CPUclkSelection(RST_CLK_CPUclkCPU_C3);
   RST_CLK_PCLKcmd(RST_CLK_PCLK_RST_CLK, ENABLE);
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: К1986ВЕ92 не отправляет UART
СообщениеДобавлено: 2019-июн-03 17:05 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 389
Откуда: ПКК "Миландр"
А тактирование BKP где-то включается? Без тактирования регистры читаются нулями.

Спецификация:
32.1.5 SCB->AIRCR
32.1.5.1 Регистр управления прерываниями и программного сброса

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


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

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


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

Сейчас этот форум просматривают: Google [Bot] и гости: 4


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

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