Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[arm7] + Komunikacja z modułem HTRC110

csdominik 27 Jul 2010 08:23 2573 5
  • #1
    csdominik
    Level 11  
    Witam, aktualnie pracuję nad panelem RFID. Programuję AT91SAM7S256 na płytce EVBsam7s w języku C. Do HTRC dołączyłem 16MHz, do sam7 18MHz (ale taktowanie ma 48Mhz).
    Odpowiednie wyprowadzenia są połączone tak żeby komunikować się za pomocą SPI. Oczywiście przeczytałem manuale firmy NXP/Philips oraz pisałem do producenta, niestety nie uzyskałem żadnej odpowiedzi.
    Problem przedstawia się następująco - nie potrafię odebrać sensownych danych od HTRC110. Podczas optymalizowania fazy - pobieram z HTRC fazę o wartości 255, po korekcji to 61. Kiedy następnie wysyłam READTAG do htrc- wydaje się on na to nie reagować, i niezależnie czym transponder jest blisko, czy całkiem daleko, odbieram non stop 1 z wyprowadzenia modułu htrc. (w programie widze to jako 255). Zastanawiam się gdzie mogę robić potencjalny błąd. Lub o czym zapomniałem. Prawdopodobnie jest coś źle skonfigurowane (komunikacja SPI/htrc) lub zapomniałem o czymś w kodzie. Siedzę nad tym już kilka dni i obawiam się że sam błędu nie znajdę, chciałbym jednocześnie poradzić się was - czyli bardziej doświadczonych kolegów co mam zrobić.

    Żeby nie było niejasności, przedstawię część mojego kodu.
    -SAM7:
    prędkość SPI w sam7 ustalam mniej więcej na 16Mhz, czy to dobrze? Jak ewentualnie ograniczyć prędkość HTRC?

    -HTRC:
    Załączam obraz z AN98080.pdf (NXP) który obrazuje kolejność działań po włączeniu zasilania.
    [arm7] + Komunikacja z modułem HTRC110
    Zgodnie z instrukcją po inicjalizacji sam7 :
    1) (writing HTRC110 Configuration Pages) konfiguruję HTRC. Pozwolę sobie podać kod:
    Quote:

    AT91F_SPI_PutChar(AT91C_BASE_SPI, 0x16, 0); //00 010110, WriteTagMode
    wait(5000);
    AT91F_SPI_PutChar(AT91C_BASE_SPI, 0x4F, 0); //01 00 1111, SetConfigPage0, GAIN1=1, GAIN0=1, FILTERH=1, FILERL=1
    wait(5000);
    AT91F_SPI_PutChar(AT91C_BASE_SPI, 0x50, 0); //01 01 0000, SetConfigPage1, PD_MODE=0, PD=0, HYSTERESIS=0, TXDIS=0
    wait(5000);
    AT91F_SPI_PutChar(AT91C_BASE_SPI, 0x60, 0); //01 10 0000, SetConfigPage2, THRESET=0, ACQAMP=0, FREEZE1=0, FREEZE0=0
    wait(5000);
    AT91F_SPI_PutChar(AT91C_BASE_SPI, 0x73, 0); //01 11 0011, SetConfigPage3, DISLP1=0, DISSMART=0, FSEL1=1, FSEL0=1
    // FSEL1=1,FSEL0=1 to znaczy ze rąbiemy na 16Mhz!
    wait(1000)


    (W rozkazie PUTCHAR: AT91C_base_spi to zdefiniowane porty obsługi SPI, natomiast 0 to wybór peryferii.)
    Możliwe że nie dobrałem optymalnych przerw między wysyłaniem rozkazów, jednak po tym zabiegu HTRC przełącza się z 500Mhz na 125Mhz - o co nam chodziło (mierzę to między gnd a wejściem cewki).

    2) (reading phase from HTRC110+calculating sampling phasesetting sampling phase) W kolejnym kroku pobieram fazę z HTRC110, optymalizuję ją - według datasheeta NXP - dodaję do pobranej fazy 0x3F (zalecane), a następnie mnożę przez maskę (tak się składa że to również 0x3F) następnie wysyłam moją zoptymalizowaną fazę do HTRC. (sampling time 0x80+obliczona_dana)

    Quote:
    AT91F_SPI_PutChar (AT91C_BASE_SPI, 0x08, 0); // TUTAJ powinno się wstawić opóźnienie 175us. - z wstawionym też nie działa.
    bufi=AT91F_SPI_GetChar(AT91C_BASE_SPI);
    wait(4000); // zgodnie z pdf - Response bits 0 0 D5 D4 D3 D2 D1 D0 ,
    // faza zapisana bitowo. D5-D0;

    bufi=bufi<<1; // trzeba teraz fazę zdekodować. 1) przesówamy o 1 w lewo
    bufi+=0x3f ; // dodajemy offset (0011 1111) typowo 00 -> 3f, w datash. napisali ze 3f dać.
    //bufi+=0x37; // szybkie przybliżenie : wybierz z 37h, 3Fh i 07h (przesówamy co 45 stopni.
    //bufi+=0x07 ; // datash. NXP semiconductors str 46 jakiś grafik.
    bufi&=0x3f ; // przepuszczamy wszystko oprócz 6 i 7 bitu
    AT91F_SPI_PutChar (AT91C_BASE_SPI, 0x80+bufi, 0); // tutaj teoretycznie wysłałem moją fazę, 0x80 to kod operacji // sampling time



    wait(1000); //czekaj 1ms.


    3) (running general settling procedure) Co do tego punktu mam pewne wątpliwości. Nie wiem po co on jest. Ale pokornie robię tak jak jest w manualu.

    Quote:
    AT91F_SPI_PutChar(AT91C_BASE_SPI, 0x6B, 0); //SetConfigPage2 0x6B=01 10 1011b; THRESET=1, FREEZE1=1, FREEZE0=1
    delay(4000);
    AT91F_SPI_PutChar(AT91C_BASE_SPI, 0x68, 0); //SetConfigPage2 0x68=01 10 1011b; THRESET=1, FREEZE1=1, FREEZE0=1
    delay(1000);
    AT91F_SPI_PutChar(AT91C_BASE_SPI, 0x60, 0); //SetConfigPage2 0x60=01 10 1011b; THRESET=1, FREEZE1=1, FREEZE0=1



    4) (ready for reading data from the transponder) w ostatnim kroku - chcę pobierać danę z HTRC, wysyłam mu więc READTAG (na który juz niestety nie reaguje?)

    Quote:
    AT91F_SPI_PutChar (AT91C_BASE_SPI, 0xe0, 0);
    wait(175);
    zmienna1=AT91F_SPI_GetChar(AT91C_BASE_SPI);


    Proszę o pomoc i wyrozumiałość.
    Pozdrawiam Dominik



    // !!
    //update - bardzo możliwe że 125kHz udało mi się ustawić... przypadkiem.
    Jeśli ktoś posiada źródło na 100% działającego SPI na sam7. To bardzo proszę żeby wrzucił. (tak próbowałem już sample atmela. niestety nie działa).
  • #2
    kemot55
    Level 31  
    Czy ty przypadkiem chcesz odczytać dane z transpondera używając magistrali SPI (no i oczywiście HTCR'a)?
  • #3
    csdominik
    Level 11  
    Tak zgadza się, używając SPI chcę odczytać dane z modułu HTRC. Czy... to niemożliwe?
  • Helpful post
    #4
    kemot55
    Level 31  
    Możliwe, ale nie do końca po SPI. Jak włączysz tryb READ_TAG to na linii wyjściowej SPI dostaniesz nieskończony, asynchroniczny strumień bitów odczytanych z "pastylki". Zdekodować to trzeba sobie samemu na pokładzie procesora. Wyłączenie trybu READ_TAG nastąpi po zmianie stanu linii zegara SCLK.
  • Helpful post
    #5
    Kabuto15
    Level 19  
    HTRC110 komunikuje się za pomocą transmisji szeregowej, ale nie jest to stricte SPI (też kiedyś miałem z tym małe problemy). W załączniku przesyłam bibliotekę której kiedyś używałem. Nie wiem, czy jest ona optymalna/poprawna, bo już sporo czasu minęło od czasu kiedy jej używałem.
    Biblioteka docelowo pisana dla ATmega8.
  • #6
    csdominik
    Level 11  
    Dziękuję za pomoc, myślę że napiszę jeszcze jak sie sytuacja rozwinęła!
pcbway logo