USBasp и программирование по TPI
Недавно, мне пришлось использовать ATtiny10 в одном из проектов. Поскольку, я не обнаружил, в сообществе, статьи о программировании этих контролеров, то решил поделиться своим опытом.

В большинство 8-битных AVR'ов код заливается по интерфейсу ISP, который является вариантом, всем хорошо знакомого SPI. В нем 4 линии (не забываем про SS) и RESET, итого 5 выводов, а ещё земля и питание, значит нужно, ни как не меньше 7ми ножек. Поэтому, в шестиногих ATtiny4/5/9/10 применён Tiny Programming Interface (TPI). Ему нужно всего 2 линии, не считая RESET, а именно TPICLK для тактирования, и TPIDATA – двунаправленная линия данных. Описывать его работу я не стану, в соответствующем аппноте всё разжевано.

Поскольку, при работе с мелкими проектами, я обычно использую USBasp, было решено заставить его шить эти контроллеры.
Покопавшись в исходнике (напомню, что микропрограмма USBasp от 28 мая 2011 года уже имеет поддержку TPI), я пришёл к выводу, что выводы программатора надо подключить следующим образом: SCK -> TPICLK, MOSI -> TPIDATA. MISO болтается в воздухе. Для проверки, ATtiny10 был установлен на макетку.

Запустив SinaProg (v2.1), я обнаружил, что tiny10 нет в списке. За то он есть в конфиге дудки. Добавим tiny10 в список, для этого откроем Device.txt (в том же каталоге, что и SinaProg) и допишем новую строку, структура такая:
Внимание, никаких пробелов, только табуляция!
Сигнатура нужна, чтобы SinaProg признал контроллер. Найти её можно, например, здесь, или в даташите. Итого получилось:
Выбираем ATtiny10, нажимаем Search, и получаем:
Правильно, дудка не знает, что USBasp поддерживает TPI. Можно пересобрать avrdude, исправив эту ошибку. А можно взять уже исправленную версию. В любом случае, копируем каталог SinaProg и работаем с копией. Заменим avrdude.exe и avrdude.conf на исправленные (можно взять в конце статьи). Снова пробуем найти микроконтроллер и… снова фейл! Почему? Потому, что я запитал контролер 3 вольтами, а TPI работает, только при 5 вольтовом питании!
Вот, теперь всё в порядке:

Можно лить код, однако калькулятор фьюзов всё ещё не работает. Это можно исправить!
Структура файлов Calc_??.cal одинакова:
Объясню. Например, вот таблица Lock Bits.

В норме, 2 последних бита, равны 1. Значит, байт принимает вид 0b00000011=0x03, если надо запрограммировать 0 бит, то байт примет вид 0b00000010=0x02. Что с этим сделает SinaProg? Вычтет из первого второе и вычтет результат из 0xff, тем самым, сформировав нужное значение.
В Calc_LB.cal (Lock Bits) пишем:
Остальные файлы править бессмысленно, так как фьюзов всего 3, и они находятся в нестандартной области памяти: WDTON и RSTDISBL в представлении не нуждаются, CKOUT — на PB2 появиться импульсы с тактовой частотой, около 1 МГц.
Обладателям разномастных FT2XX-based программаторов, немного сложнее, дудка версии 5.11.1 позволяет шить по TPI. Однако, надо спаять кабель, и подобрать инверсию выводов в avrdude.conf. Как, например, написано вот здесь (), но с FT4232 оно не работает, печально.
Каждый раз втыкать провода в макетку лениво. Поэтому, была сделана чудовищная платка. На которой разместился стандартный разъём AVR ISP. Вот так оно выглядит:

…и устанавливается в макетку.

Зачем, в схеме, нужен диод Шоттки? Он предотвращает проникновение 5 вольт по цепи питания, и повреждение низковольтной периферии, подключенной к контроллеру.
avrdude_USBasp_TPI.zip: исправленный avrdude.
P.S. Главное — не победа, а участие

В большинство 8-битных AVR'ов код заливается по интерфейсу ISP, который является вариантом, всем хорошо знакомого SPI. В нем 4 линии (не забываем про SS) и RESET, итого 5 выводов, а ещё земля и питание, значит нужно, ни как не меньше 7ми ножек. Поэтому, в шестиногих ATtiny4/5/9/10 применён Tiny Programming Interface (TPI). Ему нужно всего 2 линии, не считая RESET, а именно TPICLK для тактирования, и TPIDATA – двунаправленная линия данных. Описывать его работу я не стану, в соответствующем аппноте всё разжевано.

Поскольку, при работе с мелкими проектами, я обычно использую USBasp, было решено заставить его шить эти контроллеры.
Покопавшись в исходнике (напомню, что микропрограмма USBasp от 28 мая 2011 года уже имеет поддержку TPI), я пришёл к выводу, что выводы программатора надо подключить следующим образом: SCK -> TPICLK, MOSI -> TPIDATA. MISO болтается в воздухе. Для проверки, ATtiny10 был установлен на макетку.

Запустив SinaProg (v2.1), я обнаружил, что tiny10 нет в списке. За то он есть в конфиге дудки. Добавим tiny10 в список, для этого откроем Device.txt (в том же каталоге, что и SinaProg) и допишем новую строку, структура такая:
<Имя девайса> <Идентификатор из avrdude.conf> <Сигнатура девайса>
Внимание, никаких пробелов, только табуляция!
Сигнатура нужна, чтобы SinaProg признал контроллер. Найти её можно, например, здесь, или в даташите. Итого получилось:
ATtiny10 t10 1e9003
Выбираем ATtiny10, нажимаем Search, и получаем:

Правильно, дудка не знает, что USBasp поддерживает TPI. Можно пересобрать avrdude, исправив эту ошибку. А можно взять уже исправленную версию. В любом случае, копируем каталог SinaProg и работаем с копией. Заменим avrdude.exe и avrdude.conf на исправленные (можно взять в конце статьи). Снова пробуем найти микроконтроллер и… снова фейл! Почему? Потому, что я запитал контролер 3 вольтами, а TPI работает, только при 5 вольтовом питании!
Вот, теперь всё в порядке:

Можно лить код, однако калькулятор фьюзов всё ещё не работает. Это можно исправить!
Структура файлов Calc_??.cal одинакова:
<Имя из Device.txt> <Вес НЕ программированого бита> <Вес программированого бита > <Описание>
Объясню. Например, вот таблица Lock Bits.

В норме, 2 последних бита, равны 1. Значит, байт принимает вид 0b00000011=0x03, если надо запрограммировать 0 бит, то байт примет вид 0b00000010=0x02. Что с этим сделает SinaProg? Вычтет из первого второе и вычтет результат из 0xff, тем самым, сформировав нужное значение.
В Calc_LB.cal (Lock Bits) пишем:
ATtiny10 0x03 0x03 Mode 1: No memory lock features enabled
ATtiny10 0x03 0x02 Mode 2: Further programming disabled
ATtiny10 0x03 0x00 Mode 3: Further programming and verification disabled
Остальные файлы править бессмысленно, так как фьюзов всего 3, и они находятся в нестандартной области памяти: WDTON и RSTDISBL в представлении не нуждаются, CKOUT — на PB2 появиться импульсы с тактовой частотой, около 1 МГц.
Обладателям разномастных FT2XX-based программаторов, немного сложнее, дудка версии 5.11.1 позволяет шить по TPI. Однако, надо спаять кабель, и подобрать инверсию выводов в avrdude.conf. Как, например, написано вот здесь (), но с FT4232 оно не работает, печально.
Каждый раз втыкать провода в макетку лениво. Поэтому, была сделана чудовищная платка. На которой разместился стандартный разъём AVR ISP. Вот так оно выглядит:

…и устанавливается в макетку.

Зачем, в схеме, нужен диод Шоттки? Он предотвращает проникновение 5 вольт по цепи питания, и повреждение низковольтной периферии, подключенной к контроллеру.
avrdude_USBasp_TPI.zip: исправленный avrdude.
P.S. Главное — не победа, а участие

- +12
- 13 октября 2012, 20:50
- TheLongRunSmoke
- 1
Файлы в топике:
avrdude_USBasp_TPI.zip
для программирования Attiny еще можно использовать "AVRISP mkII clone", который дружит с Avr Studio v5/v6 :)
Ни на одной из трех машин, на которых я работаю, проблем не было.
- TheLongRunSmoke
- 15 октября 2012, 07:22
- ↑
- ↓
Вероятно, ты не пользуешься семеркой — на ней LS bulk device просто не запускается.
Кроме того, варианты V-USB с согласованием уровней стабилитронами часто конфликтуют на физическом уровне. С некоторыми хостами/хабами просто не определяются (причем это еще и от самих стабилитронов зависит, и еще от каких-то факторов). Лучше использовать 3.3В питание.
Кроме того, варианты V-USB с согласованием уровней стабилитронами часто конфликтуют на физическом уровне. С некоторыми хостами/хабами просто не определяются (причем это еще и от самих стабилитронов зависит, и еще от каких-то факторов). Лучше использовать 3.3В питание.
Семёрка? Из принципа ей не пользуюсь, не нравится. А на XP всё нормально, по крайней мере на относительно старом железе. Про 3вольтовое питание, спасибо, учту.
- TheLongRunSmoke
- 15 октября 2012, 08:31
- ↑
- ↓
Дело вкуса. И XP все равно однажды устареет до невозможности использования, как устарела, скажем, 98-я. Кроме того, не работает оно неспроста — спецификация запрещает делать низкоскоростные bulk-устройства, просто XP этот запрет игнорирует. В линуксе они, AFAIK, тоже не работают — по той же причине.
Испытал. Под Семёркой всё замечательно работает. Драйвера нужны на базе libUSB начиная с 1.2.4. Не думаю, что XP выйдет из употребления в ближайшие 5 лет. А Мелкософт, быть может, склепает нечто приемлемое.
- TheLongRunSmoke
- 18 октября 2012, 17:14
- ↑
- ↓
Недавно, мне пришлось использовать ATtiny10 в одном из проектов.Прямо таки «пришлось»? А почему?
В нем 4 линии (не забываем про SS) и RESET, итого 5 выводовRESET и есть SS для режима программирования. Так что по ножкам оно как раз впритык. Собственно, и на твоем программаторе 6 пинов, причем два из них — те самые GND и VCC. И новый ненамного лучше, всего на одну линию меньше. Или RESET для TPI необязателен?
<Имя из Device.txt> <Вес НЕ программированого бита> <Вес программированого бита > <Описание>Больше похоже на <Имя> <Маска> <Значение> <Описание>. «Маска» определяет биты, который относятся к этой опции, а «Значение» — значение этих бит. Формула применения: Fuse = (Fuse & ~Mask) or (Value & Mask), т.е. из Value берутся биты по маске и помещаются в байт фьюзов.
Пришлось, tiny13 было слишком дофига, да и стоит tiny10 в два раза меньше, и занимает меньше места. О проекте, может быть, потом расскажу.
- TheLongRunSmoke
- 15 октября 2012, 08:47
- ↑
- ↓
Я брал в Элитане, какое-то время назад. А можно и образцы у Atmel'а заказать, пришлют 5 штук.
- TheLongRunSmoke
- 19 октября 2012, 15:51
- ↓
Можно. Только, надо уровни согласовать. Можно почитать вот здесь.
- TheLongRunSmoke
- 05 февраля 2013, 06:28
- ↓
Разные. Мало того, PDI позволяет ещё и проводить отладку, через соответствующий программатор.
- TheLongRunSmoke
- 05 февраля 2013, 09:26
- ↑
- ↓
Комментарии (32)
RSS свернуть / развернуть