реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Программирование AVR через JTAG, Кто-нибудь имеет информацию конкретно о протоколе JTAG для AVR?
Maik-vs
сообщение Jan 7 2009, 11:11
Сообщение #31


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Цитата(Polaris @ Mar 13 2008, 14:15) *
Уважаемые знатоки!

С целью уменьшения числа коннекторов на плате озаботился следующим вопросом - можно ли программировать AVR через JTAG?
...

Почему нельзя разъём для программирования использовать в целевой системе как рабочий? Я программирую через SPI, и потом этот разъём работает в устройстве, ноги-то обычные. Только одна нога - ресет - остаётся висеть. Конечно, на них выводятся "не рискованные" сигналы, чтобы часом не пожечь.
Go to the top of the page
 
+Quote Post
Diusha
сообщение Jan 9 2009, 12:59
Сообщение #32


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



Цитата(Polaris @ Jan 6 2009, 16:19) *
Восьмого выйду на работу - отвечу. И куски кода с вычитыванием тоже смогу послать.

Я прошу прощения за назойливость, но уже девятое...
Go to the top of the page
 
+Quote Post
_kp
сообщение Jan 11 2009, 14:05
Сообщение #33





Группа: Новичок
Сообщений: 1
Регистрация: 14-03-07
Пользователь №: 26 160



Есть, еще не упомянутый тут, кроссплатформенный пакет cdk-avr-tools,
в котором есть программатор через JTAG - javr.
В программаторе есть консольный интерактивный и пакетный режимы. Быстро и надежно работает, но без украшательств.

В сборке cdk-avr-tools-6.1-20060625.src.rpm есть и исходники и документация и готовые бинарники под windows и linux.

Простейший jtag программатор - кабель из нескольких проводов в LPT порт (но же altera-byte-blaster)

Сообщение отредактировал _kp - Jan 11 2009, 14:07
Go to the top of the page
 
+Quote Post
Polaris
сообщение Jan 11 2009, 21:58
Сообщение #34


Местный
***

Группа: Свой
Сообщений: 266
Регистрация: 8-12-05
Пользователь №: 11 964



Цитата(Diusha @ Jan 9 2009, 14:59) *
Я прошу прощения за назойливость, но уже девятое...

Извините sad.gif У нас Интернета в связи с праздниками не было, надеюсь, что завтра появится. На крайний случай возьму флэшку, отправлю из дома.
Go to the top of the page
 
+Quote Post
Polaris
сообщение Jan 13 2009, 07:18
Сообщение #35


Местный
***

Группа: Свой
Сообщений: 266
Регистрация: 8-12-05
Пользователь №: 11 964



Цитата(Diusha @ Jan 6 2009, 06:47) *
1. Каким концом в регистр PROG_COMMANDS (0x5) надо совать команды, которые даны в таблице «JTAG Programming Instruction», т.е. 1-й бит слева или справа? Пробовал по-всякому. Самое смешное, какое-то шевеление (но не то) появилось, когда (случайно) «9a. Enter Signature Byte Read» я посылал первым левый бит, а все остальное – 1-м правый

2. Запись в таблице в графе "TDI Sequence" (в одной ячейке) вроде
0100011_10000000
0110001_10000000
0110011_10000000
0110011_10000000
следует понимать, что отправлять надо все приведенные TDI Sequence или любую из них?

3. А может я вообще что-то не так делаю?


1. За отправку команд у меня отвечает такая функция:
void Send_Instruction(TWord size, TByte data)
{
TMS_Low(); // Run-Test / Idle
TMS_Low(); // Run-Test / Idle
TMS_High(); // Select DR-Scan
TMS_High(); // Select IR-Scan
TMS_Low(); // Capture IR
TMS_Low(); // Shift IR
Shift_Data_Array(size, &data);
TMS_High(); // Update-IR -> New Instruction in Effect
TMS_Low(); // Run-Test / Idle
TMS_Low(); // Run-Test / Idle
}

Использую я ее так например: Send_Instruction(4,IDCODE);

Судя по тому, что я написал в Shift_Data_Array() такое:
...
if (bd&0x01)
macBitOn(PORT_JTAG,pinTDI);
else
macBitOff(PORT_JTAG,pinTDI);

JTAG_Delay();
macBitOn(PORT_JTAG,pinTCK);
JTAG_Delay();
macBitOff(PORT_JTAG,pinTCK);
bd>>=1;
...
первым идет младший бит.

2. Нужно подавать все указанные последовательности

Вот, например, чтение сигнатуры чипа:
void JTAG_ReadSign(TByte *sign)
{
TWord temp=0;
TWord key;
TByte ix;
TWord x[]={0x2308, 0x0300, 0x3200, 0x3300};

Send_Instruction(4,PROG_COMMANDS);
//enter reading signature mode
Send_Data_Output(15,(TByte *)&x[0],(TByte *)&temp);
for (ix=0; ix<3; ix++)
{
key = x[1]|(TWord)ix;
Send_Data_Output(15,(TByte *)&key,(TByte *)&temp);
//read signature byte
Send_Data_Output(15,(TByte *)&x[2],(TByte *)&temp);
Send_Data_Output(15,(TByte *)&x[3],(TByte *)&temp);
*sign++=(TByte)(temp&0xff);
}
}
Go to the top of the page
 
+Quote Post
Diusha
сообщение Jan 15 2009, 16:36
Сообщение #36


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



Цитата(Polaris @ Jan 13 2009, 10:18) *
JTAG_Delay();

А это сколько? И из каких соображений?

Цитата(Polaris @ Jan 13 2009, 10:18) *
Судя по тому, что я написал в Shift_Data_Array() такое:
...
первым идет младший бит.

Тогда не очень понятно такое:
TDI Sequence: 0110011_00000000 (в частности, 2-я часть инструкции 9с)
TDO Sequence: xxxxxxx_oooooooo
Получается, мы в чип загоняем нули и в это время читаем из него данные, а потом уже качаем в него код (0110011). Зачем чипу этот код, когда мы уже все, что хотели, от него получили ??
Go to the top of the page
 
+Quote Post
Polaris
сообщение Jan 16 2009, 07:49
Сообщение #37


Местный
***

Группа: Свой
Сообщений: 266
Регистрация: 8-12-05
Пользователь №: 11 964



Цитата(Diusha @ Jan 15 2009, 18:36) *
А это сколько? И из каких соображений?

Из таких:
void JTAG_Delay(void)
{
}
smile.gif Ввел на всякий случай, в документации ничего не нашел, плохо искал, видимо.
Цитата(Diusha @ Jan 15 2009, 18:36) *
Тогда не очень понятно такое:
TDI Sequence: 0110011_00000000 (в частности, 2-я часть инструкции 9с)
TDO Sequence: xxxxxxx_oooooooo
Получается, мы в чип загоняем нули и в это время читаем из него данные, а потом уже качаем в него код (0110011). Зачем чипу этот код, когда мы уже все, что хотели, от него получили ??

Подозреваю, что адрес байта сигнатуры зависит от заданного в команде 9b, а команда 9c только вытаскивает байт сигнатуры и подтверждает окончание чтения, так что по логике противоречий нет. Кстати, вычитываются байты тоже младшим вперед.
Go to the top of the page
 
+Quote Post
Diusha
сообщение Jan 17 2009, 05:10
Сообщение #38


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



Цитата(Polaris @ Jan 16 2009, 10:49) *
void JTAG_Delay(void)
{
}
smile.gif Ввел на всякий случай, в документации ничего не нашел, плохо искал, видимо.
Да я вот тоже не нашел, поэтому и спросил sad.gif

Спасибо, Polaris!
Главные вопросы я выяснил, теперь остается понять, почему не работает.
Возможно, еще придется вернуться к этой теме с Вашего позволения
Go to the top of the page
 
+Quote Post
Diusha
сообщение Jan 17 2009, 11:42
Сообщение #39


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



Все-таки вопросы продолжаются… не работает…

1. (На всякий случай) В Programming Enable Register 0хА370 тоже загоняется младшим вперед?

2.
Цитата
23.4 TAP Controller

• At the TMS input, apply the sequence 1, 1, 0, 0 at the rising edges of TCK to enter the Shift
Instruction Register – Shift-IR state. While in this state, shift the four bits of the JTAG
instructions into the JTAG Instruction Register from the TDI input at the rising edge of TCK. The TMS input must be held low during input of the 3 LSBs in order to remain in the Shift-IR
state. The MSB of the instruction is shifted in when this state is left by setting TMS high.

Насколько я понял, 3 мл. бита вгоняем при TMS=0, а 4-й – при TMS=1, т.е при этом мы выпрыгиваем из Shift-IR в Exit-IR.
Далее
Цитата
• Apply the TMS sequence 1, 1, 0 to re-enter the Run-Test/Idle state…

А приведена последовательность (1,1,0) как будто мы еще в Shift-IR ––???

3.
Цитата
26.10.4 PROG_COMMANDS ($5)

• Run-Test/Idle: One clock cycle is generated, executing the applied command (not always
required, see Table 26-15 below).

Но в указанной таблице об этом ничего не говорится
У Вас void Send_Instruction( начинается с
TMS_Low(); // Run-Test / Idle
TMS_Low(); // Run-Test / Idle

– как я понимаю, это 2 клока при TMS=0. Связано ли это с вышеприведенной цитатой? Откуда инфа?
Go to the top of the page
 
+Quote Post
Polaris
сообщение Jan 17 2009, 12:40
Сообщение #40


Местный
***

Группа: Свой
Сообщений: 266
Регистрация: 8-12-05
Пользователь №: 11 964



Цитата(Diusha @ Jan 17 2009, 07:10) *
Да я вот тоже не нашел, поэтому и спросил sad.gif

Спасибо, Polaris!
Главные вопросы я выяснил, теперь остается понять, почему не работает.
Возможно, еще придется вернуться к этой теме с Вашего позволения

Говорю навскидку, потому что опять же не на работе smile.gif У меня довольно длительное время не получалось считать верную сигнатуру чипа по не вполне понятной причине. В итоге победил это следующим образом: установил, что правильная сигнатура считывается только после подачи в самом начале команды входа в режим программирования. Нашел это эмпирическим путем, после этого пошло все как по маслу. Если кто-то увидел указание на это в документации, ткните меня, пожалуйста, носом smile.gif То есть рецепт такой - сначала вводим чип в режим программирования, потом уже проводим все действия, даже те, которые по логике не требуют программирования. Я на этой проблеме просидел несколько дней, проверил по шагам весь код, сверил со схемами в документации, ничего не помогало, после входа в режим все заработало без всяких исправлений.
По поводу младшего-старшего - все команды и инструкции подаются одинаково, младшим битом вперед. Там есть еще небольшое уточнение по поводу самого старшего бита, но вроде бы в документации это описано.
Go to the top of the page
 
+Quote Post
Diusha
сообщение Jan 18 2009, 08:05
Сообщение #41


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



Цитата(Polaris @ Jan 17 2009, 15:40) *
правильная сигнатура считывается только после подачи в самом начале команды входа в режим программирования. Нашел это эмпирическим путем

Вы про PROG_ENABLE (0x4) ?
У меня с самого начала не было никаких сомнений, что с нее все должно начинаться; она у меня есть (по крайней мере, с моей точки зрения)
Go to the top of the page
 
+Quote Post
Polaris
сообщение Jan 22 2009, 14:10
Сообщение #42


Местный
***

Группа: Свой
Сообщений: 266
Регистрация: 8-12-05
Пользователь №: 11 964



Цитата(Diusha @ Jan 18 2009, 10:05) *
Вы про PROG_ENABLE (0x4) ?
У меня с самого начала не было никаких сомнений, что с нее все должно начинаться; она у меня есть (по крайней мере, с моей точки зрения)

А давайте я просто проект скину, чтобы уж точно предусмотреть все варианты. Куда сбросить?
Go to the top of the page
 
+Quote Post
Diusha
сообщение Dec 11 2010, 14:48
Сообщение #43


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



Вот много времени прошло, снова взялся за JTAG. Блин, ну не работает! Все то же самое.
Ресетится АВРка через JTAG, нормально выходит из ресета, а что-то чуть более сложное (прочитать преславутые signature bytes) - ни в какую. 333 раза прочитал в даташите про JTAG, вроде все далаю буква-в-букву...
Может кто подскажет, хоть в какую сторону копнуть?
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 09:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.0148 секунд с 7
ELECTRONIX ©2004-2016