Миландр
http://forum.milandr.ru/

Проблема с использованием портов совмещенных с JTAG
http://forum.milandr.ru/viewtopic.php?f=22&t=3439
Страница 1 из 1

Автор:  Александр Панов [ 2016-апр-20 01:03 ]
Заголовок сообщения:  Проблема с использованием портов совмещенных с JTAG

При разработке изделия я столкнулся со следующей проблемой. В разрабатываемом устройстве мне необходимо использовать порт D на вывод и при этом загружать рабочую программу из FLASH памяти. Но при установке битов MODE[2:0] в состояние 000 вывод PD4 все время находится в состоянии 1. Директивы #define USE_JTAG_A #define USE_JTAG_B в файле MDR32F9Qx_config.h я закоментировал. В 6 и 7 биты регистра MDR_BKP->REG_0E прописываю 0.
Подскажите пожалуйста как переконфигурировать функции порта D с использования JTAG на обычные порты ввода/вывода.
Да, порт B в моей схеме тоже используется, поэтому загрузка с MODE[2:0] 001 не подходит.
Пишу данные командой MDR_PORTD->RXTX=DATA;
Микросхема К1986ВЕ92QI

Автор:  A_D [ 2016-апр-20 12:22 ]
Заголовок сообщения:  Re: Проблема с использованием портов совмещенных с JTAG

Ну вроде бы вполне ясно написано, что в 000 режиме будет работать JTAG. А что бы он не работал - надо выбрать другие режимы, последние два не подходят для постоянной работы, а один без использования JTAG работает с внешней памятью только....
Вложение:
Снимок.PNG
Снимок.PNG [ 136.85 КБ | Просмотров: 6080 ]

Автор:  Александр Панов [ 2016-апр-20 18:38 ]
Заголовок сообщения:  Re: Проблема с использованием портов совмещенных с JTAG

Это я понял. В том то вопрос и заключался как можно переконфигурировать порты, чтобы отключить сигнал TDO. Если конечно это возможно. Запись PORTD=DATA; компилятором (Keil v5.18) не воспринимается, а при записи в порт через регистр RXTX как я понял происходит логическое ИЛИ с сигналом TDO, который поддерживает вывод в 1.

Автор:  R Max [ 2016-апр-20 19:13 ]
Заголовок сообщения:  Re: Проблема с использованием портов совмещенных с JTAG

1 висит возможно из-за того, что включена подтяжка внутри порта вывода к VCC (регистр MDR_PORTD->PULL).

Порт D для вывода TDO можно настроить так:
Код:
#define PORT_JTAG_Msk 0x001F

#define JB_TDO_Pos 4
#define JB_TDO_Msk (1<<4)

#define   RST_CLK_PER_CLOCK_PCLK_EN_PORTD_Msk   (1<<24)
#define   PORT_FUNC_MODE_Msk   3
#define   PORT_PWR_Msk   3

MDR_RST_CLK->PER_CLOCK |= RST_CLK_PER_CLOCK_PCLK_EN_PORTD_Msk;

MDR_PORTD->ANALOG |= JB_TDO_Msk;
MDR_PORTD->FUNC &= ~(PORT_FUNC_MODE_Msk<<JB_TDO_Pos*2);
MDR_PORTD->OE |= JB_TDO_Msk;
MDR_PORTD->PWR |= (PORT_PWR_Msk<<JB_TDO_Pos*2);
MDR_PORTD->PULL &= ~((1<<JB_TDO_Pos)|(1<<(JB_TDO_Pos+PORT_PULL_UP_Pos)));
MDR_PORTD->PD &= ~JB_TDO_Msk;


Из-за того, что JTAG совмещён c выводами с GPIO и альтернативными функциями, необходимо специальным образом устанавливать и сбрасывать выводы, сначала считывая весь порт, иначе отладка через среду проектирования будеть выключаться на какой-то инструкции:
Код:
// Установка бита JB_TDO
PORTD->RXTX = JB_TDO_Msk | (PORTD->RXTX & (~PORT_JTAG_Msk));
// Сброс бита JB_TDO
PORTD->RXTX &= ~(JB_TDO_Msk | PORT_JTAG_Msk);

Автор:  Александр Панов [ 2016-апр-20 20:25 ]
Заголовок сообщения:  Re: Проблема с использованием портов совмещенных с JTAG

R Max спасибо. Завтра попробую.

Автор:  Александр Панов [ 2016-апр-21 15:43 ]
Заголовок сообщения:  Re: Проблема с использованием портов совмещенных с JTAG

Спасибо всем, кто попытался помочь. Моя ошибка была в том, что я перед записью в 6 и 7 биты регистра MDR_BKP->REG_0E "0" не включил тактирование регистра MDR_BKP. Проблема решилась просто включением тактирования регистра BKP в MDR_RST_CLK->PER_CLOCK (27 бит).
После этого инструкции типа MDR_PORTD->RXTX = DATA; работают корректно.
Для наступивших на те-же грабли:
1 включаем тактирование регистра BKP (1 в 27-й бит MDR_RST_CLK->PER_CLOCK)
2 запрещаем не нужный в данный момент JTAG ("0" в 6 или 7 бит MDR_BKP->REG_0E)
3 порт, совмещенный с JTAG работает.

Автор:  MWaso [ 2016-июл-21 10:22 ]
Заголовок сообщения:  Re: Проблема с использованием портов совмещенных с JTAG

Скажите пожалуйста, можно ли использовать ножки портов, совмещенные с незадействованным выводом активного JTAG, если используется двухпроводной интерфейс SWD. Т.е. в SWD используются TMS и TCK, можно ли при этом использовать для своих нужд выводы JRST, JTDO, JTDI? Стандартные библиотеки, естественно, не используем.

Имеется частично успешный опыт такого использования выводов на микроконтроллере STM32F103 - там проблема возникла только с выводом JTDI (не переключался в режим выхода).

Автор:  ЧумА [ 2016-июл-21 13:43 ]
Заголовок сообщения:  Re: Проблема с использованием портов совмещенных с JTAG

Есть успешный опыт использования TDO как выхода :). И даже TMS, TCK как входов, с прошивкой по SWD

Автор:  Cas [ 2016-авг-01 20:45 ]
Заголовок сообщения:  Re: Проблема с использованием портов совмещенных с JTAG

ЧумА писал(а):
Есть успешный опыт использования TDO как выхода :). И даже TMS, TCK как входов, с прошивкой по SWD

А отладке это не мешает? У меня JTAG "отваливается" при записи в регистр RXTX, при этом в качестве выходов настроены пины не относящиеся к JTAG. Может подскажете как это обойти на 1986ВЕ9х?

Автор:  ЧумА [ 2016-авг-02 08:45 ]
Заголовок сообщения:  Re: Проблема с использованием портов совмещенных с JTAG

Цитата:
У меня JTAG "отваливается" при записи в регистр RXTX, при этом в качестве выходов настроены пины не относящиеся к JTAG.

Тема стара как форум :). Для нормальной работы отладчика завести тень порта, все манипуляции по записи в порт выполнять с тенью, затем копировать тень в порт. Пример:
shadow &= ~(1 << clr_bit);
shadow |= 1 << set_bit;
PORT = shadow;
Разряды задействованные в JTAG/SWD в "тени" не использовать.
P.S. В SPL это, вроде, как-то учтено.

Автор:  Игорь_мать_его [ 2017-апр-28 17:22 ]
Заголовок сообщения:  Re: Проблема с использованием портов совмещенных с JTAG

В ножки JTAG нельзя писать единицы, при записи в порт всегда делайте маску и сбрасывайте все биты JTAG в ноль:

void port_pin_clr(int port_base_addr, int pin_num)
{
uint32_t* port = (uint32_t*)port_base_addr;
#ifdef JTAG_B
if(port_base_addr == MDR_PORTD_BASE) *port = ~((1 << pin_num) | JTAG) & *port;
#else
if(port_base_addr == MDR_PORTB_BASE) *port = ~((1 << pin_num) | JTAG) & *port;
#endif
else *port &= ~(1 << pin_num);
}

void port_pin_set(int port_base_addr, int pin_num)
{
uint32_t* port = (uint32_t*)port_base_addr;
#ifdef JTAG_B
if(port_base_addr == MDR_PORTD_BASE) *port = (1 << pin_num) | *port & ~JTAG;
#else
if(port_base_addr == MDR_PORTB_BASE) *port = (1 << pin_num) | *port & ~JTAG;
#endif
else *port |= 1 << pin_num;
}

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/