logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Programowanie procka ATMEGA128 przy użyciu protokołu STK500

MAROGO 29 Lis 2009 03:07 2240 11
REKLAMA
  • #1 7321769
    MAROGO
    Poziom 12  
    Witam:)

    Pytanie do znawców protokołu STK500. Oto fragment kodu w Pascalu tworzącego strukturę zapytania dla 3 komend (wejście w tryb programowania oraz odczyt i zapis FuseBit-ów) wysyłanych po RS-ie do procesora ATMEGA128.

    Moje pytanie: co oznaczają parametry "cmd1" do "cmd4" w tym protokole w komendzie CMD_ENTER_PROGMODE_ISP i "cmd1" do "cmd3" w pozostałych komendach i dlaczego są przypisane akurat takie wartości?

    Nie doszukałem się tej informacji w dokumentacji procesora: ATMEGA128 ani w dokumentacji protokołu STK500: STK500

    Proszę o w miarę możliwości łopatologiczne wyjaśnienie i gdzie szukać informacji na ten temat również dla innych komend?

    Jakie powinny być wartości tych parametrów dla innych procków, np. AT90CAN128?

    
    
    //=============== CMD_ENTER_PROGMODE_ISP ============
    
    MessageArr[1]:= $1B;          // StartMessage
    MessageArr[2]:= MessageID;    // MessageID
    MessageArr[3]:= $00;          // MSB Data Length
    MessageArr[4]:= $0C;        // LSB Data Length
    MessageArr[5]:= $0E;          // TOKEN
    MessageArr[6]:= CMD_ID;       // Command ID
    MessageArr[7]:= $C8;        // timeout
    MessageArr[8]:= $64;        // stabDelay
    MessageArr[9]:= $19;        // cmdexeDelay
    MessageArr[10]:= $20;       // synchLoops
    MessageArr[11]:= $00;       // byteDelay
    MessageArr[12]:= $53;       // pollValue
    MessageArr[13]:= $03;       // pollIndex
    
    MessageArr[14]:= $AC;       // cmd1  ??
    MessageArr[15]:= $53;       // cmd2  ??
    MessageArr[16]:= $00;       // cmd3  ??
    MessageArr[17]:= $00;       // cmd4  ??
    
    
    //============ CMD_PROGRAM_FUSE_ISP =================
    
     MessageArr[1]:= $1B;          // StartMessage
     MessageArr[2]:= MessageID;    // MessageID
     MessageArr[3]:= $00;          // MSB Data Length
     MessageArr[4]:= $05;        // LSB Data Length
     MessageArr[5]:= $0E;          // TOKEN
     MessageArr[6]:= CMD_ID;       // Command ID
     if (Param=1) then
      begin
        MessageArr[7]:= $AC;      // cmd1
        MessageArr[8]:= $A0;      // cmd2 ??
        MessageArr[9]:= $00;      // cmd3 ??
        MessageArr[10]:= $3F;     // cmd4 (Fuse LSB)
      end
      else if (Param=2) then
      begin
        MessageArr[7]:= $AC;      // cmd1  ??
        MessageArr[8]:= $A8;      // cmd2  ??
        MessageArr[9]:= $00;      // cmd3  ??
        MessageArr[10]:= $C8;     // cmd4 (Fuse MSB)
      end
      else if (Param=3) then
      begin
        MessageArr[7]:= $AC;      // cmd1  ??
        MessageArr[8]:= $A4;      // cmd2  ??
        MessageArr[9]:= $00;      // cmd3  ??
        MessageArr[10]:= $FF;     // cmd4 (Fuse EXT)
      end
    
    //============ CMD_READ_FUSE_ISP ===================
    
     MessageArr[1]:= $1B;          // StartMessage
     MessageArr[2]:= MessageID;    // MessageID
     MessageArr[3]:= $00;          // MSB Data Length
     MessageArr[4]:= $06;        // LSB Data Length
     MessageArr[5]:= $0E;          // TOKEN
     MessageArr[6]:= CMD_ID;       // Command ID
     MessageArr[7]:= $04;        // RetAddr
     if (Param=1) then
       begin
         MessageArr[8]:= $50;        // cmd1 ??
         MessageArr[9]:= $00;        // cmd2 ??
         MessageArr[10]:= $00;       // cmd3 ??
         MessageArr[11]:= $00;       // cmd4 (Fuse LSB) 
       end
       else if (Param=2) then
       begin
         MessageArr[8]:= $58;        // cmd1 ??
         MessageArr[9]:= $08;        // cmd2 ??
         MessageArr[10]:= $00;       // cmd3 ??
         MessageArr[11]:= $00;       // cmd4 (Fuse MSB)
       end
       else if (Param=3) then
       begin
         MessageArr[8]:= $50;        // cmd1  ??
         MessageArr[9]:= $08;        // cmd2  ??
         MessageArr[10]:= $00;       // cmd3  ??
         MessageArr[11]:= $00;       // cmd4 (Fuse EXT)
       end;
    
    


    Pzdr.
    Marogo
  • REKLAMA
  • #2 7321978
    Freddy
    Poziom 43  
    Czyżby Google nie działało i internet wysiadł ?
    Wszystko jest na stronie ATmela, dokładnie opisane wszystkie protokoły transmisji.
  • REKLAMA
  • #3 7322504
    MAROGO
    Poziom 12  
    Freddy napisał:
    Czyżby Google nie działało i internet wysiadł ?
    Wszystko jest na stronie ATmela, dokładnie opisane wszystkie protokoły transmisji.


    Nie zadawałbym pytania, gdybym przedtem nie przewertował neta, szczególnie strony Atmela, gdzie znalazłem specyfikacje protokołu STK500 oraz procka ATMEGA128 i je przeanalizowałem, ale niestety nie jestem taki spec jak Ty, że wiem od razu wszystko o tym protokole na podstawie samej dokumentacji i jak go użyć, a raptem pozostało mi rozszyfrowanie tych parametrów "cmd1" do "cmd4", gdyż nie wiem dlaczego mają takie wartości dla tego procka i skąd je się bierze.

    A nie po to zadaję pytanie na forum, żeby dostać odpowiedź w formie pytania, czy Google nie działa. Nie sądzę, że gdy kiedyś miałeś sam z czymś problem (być może w podobnej kwestiii) bo byłeś w tym zielony , to taka odpowiedź by Cię zadowoliła.

    Tak więc moje 2 pytania pozostały nadal aktulalne...

    Pzdr.
    Marogo
  • #4 7322658
    Freddy
    Poziom 43  
    MAROGO napisał:
    Freddy napisał:
    Czyżby Google nie działało i internet wysiadł ?
    Wszystko jest na stronie ATmela, dokładnie opisane wszystkie protokoły transmisji.


    Nie zadawałbym pytania, gdybym przedtem nie przewertował neta, szczególnie strony Atmela, gdzie znalazłem specyfikacje protokołu STK500 oraz procka ATMEGA128 i je przeanalizowałem, ale niestety nie jestem taki spec jak Ty, że wiem od razu wszystko o tym protokole na podstawie samej dokumentacji i jak go użyć, a raptem pozostało mi rozszyfrowanie tych parametrów "cmd1" do "cmd4", gdyż nie wiem dlaczego mają takie wartości dla tego procka i skąd je się bierze.

    A nie po to zadaję pytanie na forum, żeby dostać odpowiedź w formie pytania, czy Google nie działa. Nie sądzę, że gdy kiedyś miałeś sam z czymś problem (być może w podobnej kwestiii) bo byłeś w tym zielony , to taka odpowiedź by Cię zadowoliła.

    Tak więc moje 2 pytania pozostały nadal aktulalne...

    Pzdr.
    Marogo

    Widocznie niedokładnie przeczytałeś. Zobacz tutaj !
    Zacznij od strony 8 i 11.
    Cytat:
    The command bytes are different for word and page mode. In word mode, the ISP
    commands Write Program Memory and Read Program Memory are used. In page
    mode, Load Page, Write Program Memory Page and Read Program Memory are
    used.
  • #5 7323962
    MAROGO
    Poziom 12  
    Freddy napisał:

    Widocznie niedokładnie przeczytałeś. Zobacz tutaj !
    Zacznij od strony 8 i 11.
    Cytat:
    The command bytes are different for word and page mode. In word mode, the ISP
    commands Write Program Memory and Read Program Memory are used. In page
    mode, Load Page, Write Program Memory Page and Read Program Memory are
    used.


    Zwróciłeś moją uwagę na "cmd1" do "cmd3" w operacji CMD_PROGRAM_FLASH_ISP, a to jestem w stanie zrozumieć, ale skąd wzięły się wartości "cmd1" do "cmd3" dla operacji CMD_ENTER_PROGMODE_ISP, CMD_PROGRAM_FUSE_ISP i CMD_READ_FUSE_ISP?? Opis np. "Command Byte #1" dla "cmd1" nic mi nie wyjaśnia:( Proszę o wskazanie jak to się ma do specyfikacji procesora np. ATMEA128.
    Sorki, że pytam o takie szczegóły, być może banalne dla kogoś, kto w tym ma doświadczenie, ale ja dopiero raczkuję w tej dziedzinie elektroniki...

    Pzdr.
    Marogo
  • #6 7324016
    Freddy
    Poziom 43  
    Masz przecież w dokumentacji protokołu powiedziane, co znaczą poszczególne cmd1 - cmd4 dla każdej komendy.
  • REKLAMA
  • #7 7324101
    MAROGO
    Poziom 12  
    Freddy napisał:
    Masz przecież w dokumentacji protokołu powiedziane, co znaczą poszczególne cmd1 - cmd4 dla każdej komendy.


    No to weźmy pod lupę komendę CMD_ENTER_PROGMODE_ISP. Są tam przypisania:

    MessageArr[14]:= $AC; // cmd1
    MessageArr[15]:= $53; // cmd2
    MessageArr[16]:= $00; // cmd3
    MessageArr[17]:= $00; // cmd4

    Tak więc skąd wzięły się wartości $AC, $53 i $00? W specyfikacji ATmega128.xml dołączonej do AVR Studio tego akurat nie widzę. Analogicznie dla czytania i zapisu kazdego z FuseBit-ów są przypisane inne wartości "cmd1" do "cmd3". Chciałbym po prostu wiedzieć, skąd te dane mogą pochodzić.
  • REKLAMA
  • Pomocny post
    #8 7324599
    zumek
    Poziom 39  
    MAROGO napisał:
    ...Tak więc skąd wzięły się wartości $AC, $53 i $00? c...

    Wzięły się z dokumentacji do ATMega128, a dokładnie z tabelki, o wdzięcznej nazwie
    " SPI Serial Programming Instruction Set".
    Popatrz na ten fragment i skojarz ze swoim pytaniem :-P
    Programowanie procka ATMEGA128 przy użyciu protokołu STK500
  • #9 7324851
    MAROGO
    Poziom 12  
    zumek napisał:
    MAROGO napisał:
    ...Tak więc skąd wzięły się wartości $AC, $53 i $00? c...

    Wzięły się z dokumentacji do ATMega128, a dokładnie z tabelki, o wdzięcznej nazwie
    " SPI Serial Programming Instruction Set".
    Popatrz na ten fragment i skojarz ze swoim pytaniem :-P
    Programowanie procka ATMEGA128 przy użyciu protokołu STK500


    Na taką wskazówkę czekałem cały dzień! Jakoś nie skojarzyłem wcześniej, że z tej tabeli trzeba skorzystać, a "przewinęła" mi się wczoraj przed oczami. No cóź, nie wystarczy patrzeć, lecz trzeba widzieć ;)

    Wielkie dzięki Zumek! :)

    Pzdr.
    Marogo
  • #10 7325128
    Freddy
    Poziom 43  
    [quote="MAROGO"]
    Freddy napisał:
    ...
    Tak więc skąd wzięły się wartości $AC, $53 i $00? W specyfikacji ATmega128.xml dołączonej do AVR Studio tego akurat nie widzę. Analogicznie dla czytania i zapisu kazdego z FuseBit-ów są przypisane inne wartości "cmd1" do "cmd3". Chciałbym po prostu wiedzieć, skąd te dane mogą pochodzić.

    Bo po szczegóły należy patrzeć do dokumentacji procesora. Te bajty są różne dla różnych procesorów.
    W dokumentacji protokołu jest przykład dla ATMega2561.
  • #11 7325230
    Mat_91
    Poziom 25  
    Freddy jesteś pewny że są różne dla różnych procesorów? Bo jak dla mnie to są one identyczne dla całej rodziny avr. Przynajmniej tak wynika z jednej książki którą posiadam a w niej pisze że np zezwolenie na programowanie czyli seria bajtów AC,53,00,00 jest zawsze taka sama. Oczywiście różnią się bajty w których znaczenie ma adres jakiejś komórki (jak np. odczyt sygnaturki) ale reszta jest niezmienna. Chyba że mówimy o czym innym :]
  • #12 7326717
    Freddy
    Poziom 43  
    Mat_91 napisał:
    ...
    Oczywiście różnią się bajty w których znaczenie ma adres jakiejś komórki (jak np. odczyt sygnaturki) ale reszta jest niezmienna.
    ...

    Dlatego napisałem, że szczegóły w dokumentacji procesora.
REKLAMA