Доброго времени суток
Взял народный программатор usbasp (скорее всего, китайский клон), чтобы извращаться с arduino более плотно. Там же два чипа, а через icsp можно по spi достучаться до них обоих напрямую. Будет весело (спойлер: было, но не так, как я представлял)
Линукс новую игрушку видит. Через udev добавил симлинк
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", MODE="0660", SYMLINK+="USBasp", OWNER="router"
пнул
udevadm control --reload-rules
udevadm trigger
пока все хорошо
итак,
- atmega328p-pu, основной чип, разъём ICSP
- atmega16u2-mu, вспомогательный чип, разъём ICSP1 (на плате маркировки нет. есть только в datasheet. в общем тот, что ближе к USB)
отлично, avrdude согласен работать с обоими чипами:
# когда подключаюсь к ICSP, т.е. к основному чипу
avrdude -p atmega328p -c usbasp -P /dev/USBasp -v -n
avrdude -p atmega328p -c usbasp -P /dev/USBasp -v -U flash:r:/tmp/program.hex:i
# когда подключаюсь к ICSP1, т.е. ко вспомогательному чипу
avrdude -p atmega16u2 -c usbasp -P /dev/USBasp -v -n
avrdude -p atmega16u2 -c usbasp -P /dev/USBasp -v -U flash:r:/tmp/program_16u2.hex:i
Теперь пора подружить ide с новым программатором usbasp
снова подключаю usbasp к основному чипу (atmega328p, ICSP)
пока в arduino пустая программа
void loop() {
delay(1000);
пусть помигает лампочкой. тривиально
void setup() {
// put your setup code here, to run once:
pinMode(13, OUTPUT);
}
void loop() {
//delay(1000);
// put your main code here, to run repeatedly:
digitalWrite(13, HIGH);
delay(100);
digitalWrite(13, LOW);
delay(1000);
}
- tools - programmer - usbasp (по дефолту было AVRISP mkii)
- upload . не работает. ок, тогда
- sketch - upload using programmer
upload using programmer проходит. начинает мигать лампочка
проблема
а вот дальше происходит что-то непонятное:
отключаю usbasp, подключаю к плате обычный usb кабель
и arduino отказывается делать upload
avrdude тоже отказывается работать:
router@calypso:~$ avrdude -p atmega328p -c arduino -P /dev/ttyACM0 -v -n
avrdude: Version 7.1
Copyright the AVRDUDE authors;
see https://github.com/avrdudes/avrdude/blob/main/AUTHORS
System wide configuration file is /etc/avrdude.conf
User configuration file is /home/router/.avrduderc
User configuration file does not exist or is not a regular file, skipping
Using Port : /dev/ttyACM0
Using Programmer : arduino
avrdude stk500_recv() error: programmer is not responding
avrdude stk500_getsync() warning: attempt 1 of 10: not in sync: resp=0x00
avrdude stk500_recv() error: programmer is not responding
avrdude stk500_getsync() warning: attempt 2 of 10: not in sync: resp=0x00
avrdude stk500_recv() error: programmer is not responding
avrdude stk500_getsync() warning: attempt 3 of 10: not in sync: resp=0x00
avrdude stk500_recv() error: programmer is not responding
avrdude stk500_getsync() warning: attempt 4 of 10: not in sync: resp=0x00
лампочка мигает, т.е. программа, которую я до этого залил через usbasp, выполняется
очень интересно. отключаю usb кабель, подключаю usbasp к основному чипу (atmega328p, ICSP)
через avrdude пробую прогнать verify (сравнить с дампом, который я сделал до изменения программы)
router@calypso:~$ avrdude -p atmega328p -c usbasp -P /dev/USBasp -v -U flash:v:/tmp/program.hex:i
[...]
Reading | ################################################## | 100% 8.18 s
avrdude avr_verify() warning: verification mismatch
device 0xff != input 0x04 at addr 0x0254 (error)
device 0xff != input 0x01 at addr 0x0255 (error)
device 0xff != input 0x30 at addr 0x0256 (error)
device 0xff != input 0x91 at addr 0x0257 (error)
device 0xff != input 0x00 at addr 0x0258 (error)
device 0xff != input 0x01 at addr 0x0259 (error)
device 0xff != input 0x23 at addr 0x025a (error)
device 0xff != input 0xe0 at addr 0x025b (error)
device 0xff != input 0x23 at addr 0x025c (error)
device 0xff != input 0x0f at addr 0x025d (error)
suppressing further verification errors
avrdude do_op() error: verification mismatch
для очистки совести подключаюсь к второму чипу (atmega16u2, ICSP1), прогоняю верификацию и на нём - там всё в порядке
снова подключаюсь к основному чипу (atmega328p, ICSP) и через avrdude заливаю старый дамп
router@calypso:~$ avrdude -p atmega328p -c usbasp -P /dev/USBasp -v -U flash:w:/tmp/program.hex:i
[...]
avrdude: auto set sck period (because given equals null)
avrdude: AVR device initialized and ready to accept instructions
avrdude: device signature = 0x1e950f (probably m328p)
avrdude: Note: flash memory has been specified, an erase cycle will be performed.
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: auto set sck period (because given equals null)
avrdude: reading input file /tmp/program.hex for flash
with 32768 bytes in 1 section within [0, 0x7fff]
using 256 pages and 0 pad bytes
avrdude: writing 32768 bytes flash ...
Writing | ################################################## | 100% 11.58 s
avrdude: 32768 bytes of flash written
avrdude: verifying flash memory against /tmp/program.hex
Reading | ################################################## | 100% 8.00 s
avrdude: 32768 bytes of flash verified
avrdude done. Thank you.
отключаю usbasp, подключаю плату обычным usb кабелем. Теперь снова с ней работает и arduino ide, и avrdude
для очистки совести воспроизвожу проблему
- подключаю программатор usbasp к основному чипу (atmega328p, ICSP)
- через arduino ide залил новую программу. вижу, что она начала работать
- отключаю usbasp, подключаю плату обычным usb кабелем. программа выполняется
- проблема. arduino ide отказывается что-либо прошивать. avrdude отказывается работать с платой
- отключаю обычный usb, подключаю usbasp к основному чипу, заливаю старый дамп
- отключаю программатор usbasp, подключаю обычный usb
- все работает
WTF?
Я не менял ничего на вспомогательном чипе atmega16u2, который обеспечивает работу с usb, поддержку cdc acm, поддержку dfu. и прошивку основного чипа без дополнительных программаторов
Насколько я понимаю, я менял исключительно программу для основного чипа
Каким образом это могло привести к тому, что штатный программатор - вспомогательный чип atmega16u2 - отказывался работать с основным (до возвращения старого дампа)?

