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

[c][atmega128] + avt1443 (RTL8019AS)

rmk 02 Cze 2009 19:56 2001 10
REKLAMA
  • #1 6608114
    rmk
    Poziom 12  
    Witam.
    Próbuję coś zdziałać z duetem atmega128 i kitem avt 1443 czyli RTL8019AS. I coś nie wychodzi... Sprawa wygląda tak: gdy próbuję zainicjować RTLa (kod z avrlib) po podłączeniu modułu z kompem połączenie sieciowe jest aktywne ale nie ma żadnej wymiany pakietów. Gdy wykonuję pracę krokową (jtag ice + AVR Studio) program "wykrzacza się" po funkcji ustawiającej porty. Porty się konfigurują, przy wyjściu z funkcji wstaje połączenie ale program nie przechodzi do kolejnej funkcji...
  • REKLAMA
  • #2 6634600
    rmk
    Poziom 12  
    Udało się cześciowo rozwiązać problem. Ale nadal RTL się nie inicjuje. Kod biorę stąd: Link
    Więc definicje rejestrów RTL'a wyglądają tak:
    #define CR			0x00
    #define PSTART		0x01
    #define PAR0		0x01
    #define CR9346		0x01
    #define PSTOP		0x02
    #define BNRY		0x03
    #define TSR			0x04
    #define TPSR 		0x04
    #define TBCR0 		0x05
    #define NCR 		0x05
    #define TBCR1 		0x06
    #define ISR 		0x07
    #define CURR 		0x07
    #define RSAR0 		0x08
    #define CRDA0 		0x08
    #define RSAR1 		0x09
    #define CRDA1 		0x09
    #define RBCR0 		0x0A
    #define RBCR1 		0x0B
    #define RSR 		0x0C
    #define RCR 		0x0C
    #define TCR 		0x0D
    #define CNTR0 		0x0D
    #define DCR 		0x0E
    #define CNTR1 		0x0E
    #define IMR 		0x0F
    #define CNTR2 		0x0F
    #define RDMAPORT 	0x10
    #define RSTPORT 	0x18
    #define ISR_PRX 	0
    #define ISR_PTX 	1
    #define ISR_OVW 	4
    #define ISR_RDC 	6
    #define ISR_RST 	7
    #define TXSTART_INIT 	0x40
    #define RXSTART_INIT 	0x46
    #define RXSTOP_INIT 	0x60
    #define ETHERNET_MIN_PACKET_LENGTH 	0x3C //60
    #define ETHERNET_HEADER_LENGTH 		0x0E //14
    #define IP_TCP_HEADER_LENGTH 		40
    #define TOTAL_HEADER_LENGTH (IP_TCP_HEADER_LENGTH+ETHERNET_HEADER_LENGTH)
    

    Wpis do RTL'a wygląda tak:
    void RTLwrite(unsigned char address, unsigned char data)
    {
    RTL_DATA_DDR = 0xFF;
    RTL_ADDRESS_PORT = address;
    RTL_DATA_PORT = data;
    asm("nop");
    RTL_CLEAR_WRITE;
    asm("nop");
    asm("nop");
    asm("nop");
    RTL_SET_WRITE;
    asm("nop");
    RTL_DATA_DDR = 0x00;
    RTL_DATA_PORT = 0xff;
    }

    Natomiast odczyt z RTL'a tak:
    unsigned char RTLread(unsigned char address)
    {
    unsigned char byte;
    //RTL_DATA_PORT = 0xff;
    RTL_ADDRESS_PORT = address;
    asm("nop");
    RTL_CLEAR_READ;
    asm("nop");
    asm("nop");
    asm("nop");
    byte = RTL_DATA_PIN;
    asm("nop");
    asm("nop");
    asm("nop");
    RTL_SET_READ;
    asm("nop"); 
    PORTB = byte;
    return byte;
    }

    No i z tego co zaobserwowałem to funkcja RTLwrite nie działa. Program do niej nie wchodzi. Wchodzi natomiast do funkcji RTLread. Czy ma ktoś działającą konfigurację rejestrów RTLa i sposób zapisu do tych rejestrów?
    Zauważyłem pewną zmianę, mianowicie wcześniej przy włączeniu odczytu z RTLa (RTL_CLEAR_READ) na wejściu portu danych miałem 0xff, natomiast teraz wartość ta zmienia się na 0x00, tak jakby próbował coś odczytać (ale chyba domyślne wartości rejestrów to 0xff)
  • REKLAMA
  • Pomocny post
    #3 6636622
    piter2313
    Poziom 11  
    Witam!

    po pierwsze musisz upewnić się czy operacje zapisu i odczytu faktycznie działają.

    Z tego co zaobserwowałem, zaraz po uruchomieniu RTL8019AS wybrana jest strona 0 rejestrów. Jest tam taki rejestr zwany BNRY do którego można zapisywać wszystkie wartości z przedziału 0-255 i odczytywać na tej samej stronie.

    W związku z tym zrób taki test zaraz na początku:

    
    uint16_t i;
    for(i=0;i<256;i++)
      {
      RTLwrite(BNRY,i);
      if(i != RTLread(BNRY))
        {
        // w tym miejscu zaświeć diodę, wypisz coś na LCD, etc.
        while(1);
        }
      }
    


    Ja korzystam z USARTa, MAX232 i hyperterminala, i po prostu wyrzucam na USART jaką liczbę zapisuję do rejestru i jaką odczytałem.

    To powinno ci pomóc w zorientowaniu się czy zapis/odczyt działą, jeżeli nie, to czy winą jest np. zimny lut na którejś z linii adresowych lub danych etc.

    No i sprawdź jak zdefiniowane masz RTL_DATA_DDR, RTL_ADDRESS_PORT, RTL_DATA_PORT, RTL_CLEAR_WRITE itp.

    Upewnij się również, czy na wejściu RESET modułu AVT1443 jest odpowiedni stan, jak dobrze pamiętam logiczne 0.

    Czekam na rezultaty... ;]
  • #4 6638065
    BoskiDialer
    Poziom 34  
    Problem z wchodzeniem/wychodzeniem z funkcji? Może procesor pracuje w trybie kompatybilności z mega103? Jak masz ustawione fusebity?
  • #5 6642153
    rmk
    Poziom 12  
    Atmega pracuje w trybie kompatybilności 103 ale wcześniej nie było tego problemu z funkcjami. Dzieje się tak od pewnego czasu. Ale dla pewności wyłączę go. A reszta fusów to OCDEN, JTAGEN, SPIEN, Zewn. kwarc wysokiej częstotliwości i wyłączenie po spadku napięcia poniżej 4V.
    Co do resetu to jest na nim stan niski na pewno. Porty mam dobrze skonfigurowane (ze 3 razy sprawdzałem ;)) zimnych lutów też raczej nie ma bo przy mierzeniu miernikiem na wejściach modułu są wartości takie jakie wystawiam na porcie (no i oczywiście jest przejście bo było to sprawdzone). Sprawdzę jeszcze z tym fragmentem kodu, bo wydaje mi się, że zapis nie działa. Ale to dam znać później ;)
    O dalszych działaniach będę informować.
  • REKLAMA
  • Pomocny post
    #6 6642246
    hotdog
    Poziom 26  
    Witam. uruchomiłem ten kit z atmega32 i ogólnie pingi i telnet odpowiadał. Proponuję wykorzystać gotowy, darmowy stos dostępny pod linkiem. Było to trochę czasu temu i zajęło mi kilka dni, a później zająłem się czymś innym.

    Oczywiście nie mówię że to co robisz jest bezsensu, jeżeli chcesz napisać sam sterownik do rtl'a i stos TCP/IP to OK, ale przetestuj najpierw hardware przez ten stos, bo widzę że tego nie jesteś pewien.

    Pozdrawiam i jak byś miał jakiś problem to spróbuję pomóc
    hot-dog

    Dodano po 56 [sekundy]:

    i pamiętaj że jak będziesz używał tego stosu i masz duży kwarc to spowolnij trochę zapis i odczyt z pamięci, bo układ nie zrobi tego w jednym nop'ie, bo mi dojście do tego zajęło najwięcej czasu. Przy odczycie i zapisie prawie zawsze jeden bit nie zdążył się ustawić/odczytać.

    Pozdrawiam hot-dog
  • #7 6642421
    rmk
    Poziom 12  
    Jest! Odczytuje i zapisuje RTLa:) problem był w opóźnieniach. Za krótka przerwa była przy zapisie, chociaż odczyt działał dobrze.
    Dzięki chłopaki. Teraz walka dalej będzie ;)

    @hotdog
    Nie korzystam z tego stosy, bo on jest pisany w bascomie i nic o nim nie wiem (o bascomie) a przerobienie tego na C za dużo by mi zajęło. Stos będę brać albo z bibliotek avrlib albo z uIP (mikrostos Link) a ten kod tu przestawiony to był napisany tylko w celu sprawdzenia czy RTL działa. I chciałem mieć pewność, że są dobrze skonfigurowane porty.

    Tematu jeszcze nie zamykam. Na pewno pojawią się jakieś problemy ;)
  • REKLAMA
  • #8 6642485
    hotdog
    Poziom 26  
    nie ten stos jest w C ;)
    pozdrawiam
  • #9 6642713
    piter2313
    Poziom 11  
    rmk napisał:
    Tematu jeszcze nie zamykam. Na pewno pojawią się jakieś problemy ;)


    Oj, obawiam się że masz rację, ja niestety wykorzystuje moduły AVT1443 w nietypowym zastosowaniu i żaden z dostępnych stosów TCP/IP się do tego nie nadaje. W związku z tym driver napisałem sam.

    Gdybyś się zdecydował napisać jakiś fragment sam, służę pomocą ;]
  • #10 6642741
    rmk
    Poziom 12  
    @hotdog
    A no rzeczywiście :) moje niedopatrzenie. Już mi sie tak te strony mieszają, że myślałem, że to strona z kodem bascoma :) wybacz.
    @piter2313
    A do czego wykorzystujesz ten układ?

    Mały edit... Niby RTL zapisuje jakies dane, ale przeważnie błędne (albo nie zapisuje). Na razie tylko kilka rejestrów się zgadza, reszta jest błędna. A jak to jest z wyborem strony? Nie trzeba do CR wpisywać na miejsce bitu 6 i 7 (PS0 i PS1) odpowiednio żeby wybierać stronę? Bo wydaje mi się, że 'samo' to się nie zrobi ;)

    Edit ;)
    RTL zapisuje coś, nie zawsze dobrze, ale większość jest dobra. Zmieniłem wartości przy wyborze stron i się polepszyło. Będe dalej próbował :) i informował na bieżąco, co się dzieje :)
  • #11 6653985
    piter2313
    Poziom 11  
    rmk napisał:
    A do czego wykorzystujesz ten układ?

    W skrócie: do szyfrowania połączenia Ethernetowego.

    rmk napisał:
    Niby RTL zapisuje jakies dane, ale przeważnie błędne (albo nie zapisuje). Na razie tylko kilka rejestrów się zgadza, reszta jest błędna. A jak to jest z wyborem strony? Nie trzeba do CR wpisywać na miejsce bitu 6 i 7 (PS0 i PS1) odpowiednio żeby wybierać stronę? Bo wydaje mi się, że 'samo' to się nie zrobi ;)


    No tak, samo się nie zrobi, jeżeli chcesz zapisywać lub odczytywać inną stronę rejestrów, to oczywiście musisz te bity najpierw odpowiednio ustawić. Jednak z moich obserwacji wynika, że zawsze po zrestartowaniu urządzenia wybrana jest strona 0.

    rmk napisał:

    Edit ;)
    RTL zapisuje coś, nie zawsze dobrze, ale większość jest dobra. Zmieniłem wartości przy wyborze stron i się polepszyło. Będe dalej próbował :) i informował na bieżąco, co się dzieje :)


    ;] Zwróć uwagę na trzy sprawy:

    1) Jeżeli wybierzesz stronę 0 rejestrów, a następnie wpiszesz jakąś wartość pod adres (0x02), to zostanie ona umieszczona w rejestrze PSTART (zgodnie z tablicą rejestrów, w mojej dokumentacji punkt 5.1.1, strona 9)

    Jeżeli następnie odczytasz wartość spod tego samego adresu (0x02), to odczytasz wartość rejestru CLDA0, która najprawdopodobniej będzie inna, niż ta którą zapisałeś do PSTART pod ten sam adres.

    Aby odczytać wartość PSTART, należy wybrać stronę 2 i odczytać wartość spod adresu 0x02 (patrz do tabelki...)

    2) Niektóre bity poszczególnych rejestrów są zarezerwowane, np. rejestr RCR. Jeżeli zapiszesz wartość pod adres 0x0C na stronie 0, a następnie odczytasz spod tego samego adresu na stronie 2, to ta wartość mimo wszystko może się różnić, bo zgodnie z dokumentacją 7 i 6 bit RCR jest zarezerwowany, wiec powinieneś porównywać tylko pozostałe bity, np:

    [code]
    RTLwrite(CR,0x21); //wybor strony 0
    RTLwrite(RCR,wr_temp); //zapis wartosci jakiejs zmiennej, np wr_temp
    RTLwrite(CR,0xA1); //wybor strony 2
    rd_temp = RTLread(RCR); //odczyt wartosci jakiejs zmiennej, np rd_temp

    if((wr_temp&0b00111111) != (rd_temp&0b00111111)) print("blad!");
    [\code]

    3) Nie wszystkie rejestry można zapisywać w dowolnej chwili. Polecam dokumentację układu DP8390D. Jest tam opisane wszystko po kolei.

    W związku z tym, proponowałem wcześniej rejestr BNRY, ponieważ zapisuje się go i odczytuje z tej samej strony rejestru, nie ma żadnych bitów zarezerwowanych i przyjmuje wszystkie możliwe wartości 8 bitowe.
REKLAMA