Hej!!
Tak sobie grzebię ostatnio z ARMami i AVRami, gdyż potrzebuję za pomocą ARMa programować AVRa ;)... I postanowiłem, że w przejściowej wersji zrobię sobie programator podłączany do kompa. Widziałem mnóstwo opisów do standardowego ISPProg'a obsługiwanego przez AVR Studio, więc zacząłem działać :)... protokół niby prosty, ale jednak coś nie halo :/... AVRProg mojego układu nie wykrywa, chociaż zaimplementowałem chyba wszystkie możliwe komendy!! Zacząłem sprawdzać różne ustawienia portu COM (choć powinno być 115200 8n1 podobno). Nic :/... Więc połączyłem ze sobą 2 COMy i zobaczyłem, co tam AVRStudio wysyła na moją płytkę... i oto dostałem takie coś:
1B 01 00 01 0E 01 14 1B 02 00 01 0E 01 17 30 20 30 20 30 20 30 20 .... (potem powtarza się w kółko 30 20 kilkadziesiąt razy).Problem jest taki, że ŻADEN z tych kodów nie należy do listy instrukcji!! Domyślnie aplikacja powinna odpowiadać na niego znakiem '?'!! Moj program tak robi, ale to nic nie daje :/...
Podejrzenie padło na jednak inne ustawienie prędkości, ale proszę, znalazłem Device Monitoring Studio, odpaliłem, i w raportach widać wyraźnie, że AVRStudio ustawia takie parametry:
. 000002: Create Request (DOWN), 24.07.2008 17:37:19.718 +8.359 Process 0xcd8 (AVRStudio.exe) attempted to open the device 000003: Create Request (UP), 24.07.2008 17:37:19.718 +0.0 Process 0xcd8 (AVRStudio.exe) create request status: 0x00000000(...)
000022: I/O Request (DOWN), 24.07.2008 17:37:19.718 +0.0 IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate Baud Rate=115200000023: I/O Request (UP), 24.07.2008 17:37:19.718 +0.0 IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate
(...)
000028: I/O Request (DOWN), 24.07.2008 17:37:19.718 +0.0 IOCTL_SERIAL_SET_LINE_CONTROL: Set line control WordLength=8 StopBits=1 stop bit Parity=No parityNiestety, nie mam teraz pod ręką działającego programatora, żeby zobaczyć, jak one ze sobą gadają i co sobie nawzajem wysyłają. Ale może ktoś da radę mi pomóc? To chyba popularnie używany protokół przy używaniu np. bootloader'a w AVRach :)...
Dodatkowo przesyłam listę instrukcji z jakiegoś programatora wykorzystującego ten protokół (szerokość wiersza > 70 znaków!!)
Pozdrawiam Konop
;* Commands | Host writes | Host reads ;* | ID (hex ) | data | data |
;* | Enter programming mode | 'P'(0x50) | | | 13d ;* | Report autoincrement address | 'a'(0x61) | | | 'Y' ;* | Set address | 'A'(0x41) | ah al | | 13d ;* | Write program memory, low byte | 'c'(0x63) | dd | | 13d ;* | Write program memory, high byte | 'C'(0x43) | dd | | 13d ;* | Issue Page Write | 'm'(0x6d) | | | 13d ;* | Read program memory | 'R'(0x52) | | dd(dd)| ;* | Write data memory | 'D'(0x44) | dd | |
13d ;* | Read data memory | 'd'(0x64) | | dd | ;* | Chip erase | 'e'(0x65) | | | 13d ;* | Write lock bits | 'l'(0x6c) | dd | | 13d ;* | Leave programming mode | 'L'(0x4c) | | | 13d ;* | Select device type | 'T'(0x54) | dd | | 13d ;* | Read signature bytes | 's'(0x73) | | 3*dd | ;* | Return supported device codes | 't'(0x74) | | n*dd | 00d ;* | Return software identifier | 'S'(0x53) | | s[7] | ;* | Return sofware version | 'V'(0x56) | | dd dd | ;* | Return hardware version | 'v'(0x76) | | dd dd | ;* | Return programmer type | 'p'(0x70) | | dd | ;* | Set LED | 'x'(0x78) | dd | | 13d ;* | Clear LED | 'y'(0x79) | dd | | 13d ;* | Universial command | ':'(0x3a) | 3*dd | dd | 13d ;* | New universal command | '.'(0x2E) | 4*dd | dd | 13d;* | New Commands since Version 3.3 | | | | ;* | Exit (AVR109, Bootloader) | 'E'(0x45) | | |
13d ;* | Return Chip ID (Terminalmode only)| 'i'(0x69) | | s[n] |;* | New Commands since Version 3.5 | | | | ;* | Implemented Atmel Bootloader commands (Atmel Appl. Note 109) |
;* | Report Block write Mode | 'b'(0x62) | |'Y'2*nn| 13d ;* | Block Write | 'B'(0x42) |2*nn'M'| n*dd | 13d ;* | Block Read | 'g'(0x67) |2*nn'M'| n*dd | 13d
;* | Commands to test (fully implemented since V3.8, Unverified) |
;* | Return Lockbits | 'r'(0x72) | | dd | 13d ;* | Return High Fusebits | 'N'(0x4E) | | dd | 13d ;* | Return extendet Fusebits | 'Q'(0x51) | | dd | 13d ;* | Write fuse bits (reserved) | 'f'(0x66) | dd | | 13d ;* | Read fuse and lock bits (reserved)| 'F'(0x46) | | dd |
Dodatkowo na samym początku jest czekanie na znak 1B (albo na znak rozny od 1B).