Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

dsPIC33 i magistrala CAN (MPLAB C30)

nsvinc 01 Maj 2008 00:13 1898 6
  • #1 01 Maj 2008 00:13
    nsvinc
    Poziom 35  

    Chcę stworzyć system oparty na dwóch prockach PIC mających w sobie moduły ECAN.
    Procesory zostały podłączone ze sobą przez transceivery TJA1050.

    Po skonfigurowaniu modułów CAN w procesorach, próbuje nawiązać komunikację, tj. przesłać ramkę z jednego do drugiego. Tyle, że nadajnik jak najbardziej próbuje coś nadać (widać to po częstotliwości na wyjsicu kontrolera C1TX, jak i na samej magistrali za transceiverem), ale drugi procesor nie widzi nadawanych bitów.

    Pomiary wskazały brak jakiegokolwiek sygnału na C1RX drugiego procesora. Tak jakby TJA1050 zjadało sygnał z magistrali.

    Tak więc usunąłem transceivery i podłączyłem procesory bezposrednio
    (C1RX<-C1TX,C1TX->C1RX), i efekt ten sam. Oba procesory próbują coś nadać, ale nie widzą tego co leci na magistrali...

    W tym przypadku mozna zaobserwować, że nie pojawia sie sygnał o jakies zmierzalnej częstotliwości na obu podłączeniach.

    Jednak: jesli zostawi sie wejscia C1RX wiszące w powietrzu i np. dotknie ich palcem, procesory zgłaszają przerwanie błędnej ramki (i nic dziwnego, palec nie generuje danych, ale to znaczy ze procesor odbierać coś umie).

    Sądzę z tego, że oba procki tak samo potrafią nadawać jak i odbierać, ale nie współpracują ze sobą...

    Gdzie może być błąd?

    Kody konfiguracyjne pisane pod C30:

    Code:

    //CAN RX DMA
    DMA2CONbits.SIZE=0;
    DMA2CONbits.DIR=0;
    DMA2CONbits.AMODE=2;
    DMA2CONbits.MODE=0;
    DMA2REQ=0x37;
    DMA2PAD=(volatile unsigned int)&C2RXD;
    DMA2CNT=7;
    DMA2STA=__builtin_dmaoffset(can1_buf);
    DMA2CONbits.CHEN=1;
    IFS1bits.DMA2IF=0;
    IEC1bits.DMA2IE=1;
    //CAN TX DMA
    DMA3CONbits.SIZE=0x0;
    DMA3CONbits.DIR=0x0;
    DMA3CONbits.AMODE=0x2;
    DMA3CONbits.MODE=0x0;
    DMA3REQ=0x47;
    DMA3CNT=7;
    DMA3PAD=(volatile unsigned int)&C2TXD;
    DMA3STA=__builtin_dmaoffset(can1_buf);
    DMA3CONbits.CHEN=0x1;
    IFS2bits.DMA3IF=0;
    IEC2bits.DMA3IE=1;
    //CAN1 CFG
    C2CTRL1bits.REQOP = 4;
    while(C2CTRL1bits.OPMODE!=4);
    C2CTRL1bits.CANCKS = 0x1;
    C2CFG2bits.SEG1PH = 0x7;
    C2CFG2bits.SEG2PHTS = 0x1;
    C2CFG2bits.SEG2PH = 0x5;
    C2CFG2bits.PRSEG = 0x4;
    C2CFG2bits.SAM = 0x1;
    C2CFG1bits.SJW = 0x3;
    C2CFG1bits.BRP = 0x0 ;
    C2CTRL1bits.REQOP = 0;
    while(C2CTRL1bits.OPMODE!=0);
    C2CTRL1bits.WIN=0;
    //CAN RX buffer2,3
    C2TR23CONbits.TXEN2=0; //buffer2 rx
    C2TR23CONbits.TXEN3=0; //buffer3 rX
    C2TR23CONbits.TXREQ2=0; //tak ma byc
    C2TR23CONbits.TXREQ3=0; //tak ma byc
    C2TR23CONbits.RTREN2=0; //bez ramek zdalnych
    C2TR23CONbits.RTREN3=0; //jw
    C2TR23CONbits.TX2PRI=0; //niema wplywu
    C2TR23CONbits.TX3PRI=0; //jw
    //CAN RX buffer4,5
    C2TR45CONbits.TXEN4=0; //buffer4 rx
    C2TR45CONbits.TXEN5=0; //buffer5 rX
    C2TR45CONbits.TXREQ4=0; //tak ma byc
    C2TR45CONbits.TXREQ5=0; //tak ma byc
    C2TR45CONbits.RTREN4=0; //bez ramek zdalnych
    C2TR45CONbits.RTREN5=0; //jw
    C2TR45CONbits.TX4PRI=0; //niema wplywu
    C2TR45CONbits.TX5PRI=0; //jw
    //CAN TX
    C2TR01CONbits.TXEN0=1; //buffer0 tx
    C2TR01CONbits.TXEN1=0; //buffer1 TX
    C2TR01CONbits.TXREQ0=0; //
    C2TR01CONbits.TXREQ1=0; //
    C2TR01CONbits.RTREN0=0; //bez ramek zdalnych
    C2TR01CONbits.RTREN1=0; //jw
    C2TR01CONbits.TX0PRI=3; //buffer0 najwyrzszy priorytet
    C2TR01CONbits.TX1PRI=2; //buffer1 prawie najwyrzszy priorytet


    Dodam, że jeden procesor kożysta z CAN1, drugi z CAN2, kod podałem z konfiga tego drugiego procka, ale oba są identyczne.

    Procesor dsPIC33FJ256GP710.

    Przerwania:
    Code:

    //CAN int
    C2CTRL1bits.WIN=0;
    C2FCTRLbits.DMABS=6; //32 buffers
    C2FCTRLbits.FSA=8; // FIFO w usmy bufor
    C2INTF=0; //czysc flagi pszerwania
    //wlacz przerwania:
    C2INTEbits.RBIE=1; //pszerwanie RX
    C2INTEbits.TBIE=1; //pszerwanie TX
    C2INTEbits.RBOVIE=1; //rx buf ovf
    C2INTEbits.IVRIE=1; //odebrana ivalid mesadż int

    //INT
    IFS3bits.C2RXIF=0; //ECAN rx data ready flag=0
    IEC3bits.C2RXIE=1; //ECAN1 rx data ready int

    IFS3bits.C2IF=0; //ECAN event flag=0
    IEC3bits.C2IE=1; //ECAN event int


    Mysle jednak ze błąd jest gdzieś w samej topologii lub konfiguracji nadajnika/odbiornika w częsci generowania bitów danych...

    Proszę o pomoc,z góry dziękuje...[za cierpliwość w czytaniu kodu, ale komentarze są celem rozbawienia czytającego..:) ]

    Pozdrawiam

    0 6
  • #2 01 Maj 2008 10:35
    piti___
    Poziom 23  

    Witam

    Czy dałeś opornik 120ohm przy transceiverach CAN między CANL i CANH ?

    Cytat:

    Dodam, że jeden procesor kożysta z CAN1, drugi z CAN2, kod podałem z konfiga tego drugiego procka, ale oba są identyczne.


    Nie wiem czy dobrze zrozumiałem, jeśli nadajesz z CAN2.0 to układ pracujący na CAN1.0 nie odbierze ramki (chociaż coś na linii RX powinno się pojawić). Szukaj błędów przy transceiverach. Połącz masy CANa może coś się pojawi za transceiverem. Czy przebiegi masz na obu liniach CANL i CANH ?

    Moduły CAN działają w loopback mode ?

    Robiłem projekt na PIC18LF2680 (ECAN) CAN1.0 500kbps. Mogę podesłać trochę kodu.

    0
  • #3 01 Maj 2008 11:53
    nsvinc
    Poziom 35  

    Bardzi bym prosił o kod, porównam.
    Z tego co wiem pice18 mają moduły CAN, nie ECAN i to jednak jest niewielka różnica.

    dsPICe których używam mają DWA kanały ECAN, oznaczone C1RX/TX, C2RX/TX, i bynajmniej nie chodzi tu o standardy.

    Nadaje w CAN2.0B, ramka standardowa.

    Niestety, loopback w tych PICach jest, ale stwierdzili w erracie ze on nie działa i niestety mają rację :)

    Co do loopbacka:
    Testowałem na jednym z procków ten loopback, i sama wysyłka w tym trybie działa, tzn. dostaje przerwanie prawidłowo wysłanej ramki.

    Czy uklady mają prawo chodzic BEZ transceiverów (tak jak opisałem w drugiej częsci posta)?...

    Dodano po 2 [minuty]:

    CANy mają połączone masy = są zasilane z tego samego źródła.

    Nie wiem czy na CANH CANL mam >>przebiegi<< ale na pewno pojawia się tam częstotliwość. (miernik mi nie wyrabia z tym, ale jesli bez wsyłki jest zero a jak zacznie nadawać jest 8kHz znaczy ze cos tam zaczyna płynąć...)

    0
  • #5 01 Maj 2008 12:16
    piti___
    Poziom 23  

    nsvinc napisał:
    Bardzi bym prosił o kod, porównam.
    Z tego co wiem pice18 mają moduły CAN, nie ECAN i to jednak jest niewielka różnica.


    Stare układy np PIC18F458 mają moduły "CAN", nowe układy PIC18F4580 (zero na końcu) mają już ECAN.

    nsvinc napisał:

    Czy uklady mają prawo chodzic BEZ transceiverów (tak jak opisałem w drugiej częsci posta)?...


    Nie testowałem alę sądze że przy takim połączeniu układy powinny pracowac.

    nsvinc napisał:

    Nie wiem czy na CANH CANL mam >>przebiegi<< ale na pewno pojawia się tam częstotliwość. (miernik mi nie wyrabia z tym, ale jesli bez wsyłki jest zero a jak zacznie nadawać jest 8kHz znaczy ze cos tam zaczyna płynąć...)


    Sygnał na magistrali jest różnicowy więc przydało by się mieć pewność że na obu liniach "coś" jest. Nalepiej sprawdzić oscyloskopem.

    Rejestr TRIS pin CANRX jest ustawiony na 1 ? Nie wiem jak w dsPIC33 ale w PIC18 CAN siedzi na porcie B i trzeba jeszcze zmienić wpis w ADCON1 żeby go zmienić na we/wy cyfrowe.

    W załączniku konfiguracja CANa z mojego projektu. Ustawienia prędkości transmisji wziąłem z forum microchipa, opis w datasheet jest dosyć zakręcony.

    Pozdrawiam

    0
  • #6 01 Maj 2008 12:19
    Freddie Chopin
    Specjalista - Mikrokontrolery

    piti___ napisał:
    Rejestr TRIS pin CANRX jest ustawiony na 1 ? Nie wiem jak w dsPIC33 ale w PIC18 CAN siedzi na porcie B i trzeba jeszcze zmienić wpis w ADCON1 żeby go zmienić na we/wy cyfrowe.

    w 16b PICach nie trzeba ustawiac TRISa dla peryferiow. jesli wlaczysz jakies, to on tak czy siak przejmuje kontrole nad portem, cokolwiek by tam na TRISx nie bylo ustawione.

    0x41 0x56 0x45!!

    0
  • #7 01 Maj 2008 12:28
    nsvinc
    Poziom 35  

    Oscyloskopu brak, jesli bym go miał to nie musiałbym prosić o pomoc na forum :)

    Terminator (rezystor na koncu linii) dorzuce jutro wieczorem jak przyjdą nowe transceivery....

    Na razie próbuje od dwóch dni odpalić proste połączenie między dwoma prockami bez transceiverów i śmieszny jest fakt ze i tak nie działa.

    Zahaczyłem pomysł podłączenia wy/we CANów z procka bezposrednio między sobą, krzyżując, z microchipowej noty aplikacyjnej, gdzie robiło sie "sprzętowy loopback" miedzy CAN1 i CAN2. Ja podłączyłem tak samo, tyle ze pomiędzy dwoma prockami.

    ->Freddie
    Właśnie. Peryferia sobie przejmują kontrolę nad pinami, i TRIS nie ma nic do rzeczy.
    Ale jak ja chciałem WYŁĄCZYĆ JEDEN Z MODUŁÓW CAN, to
    a) nie ma gdzie
    b) datasheet nie przewiduje mozliwosci wyłączenia któregokolwiek CANa
    c)Zmiana TRIS,LAT i tak nic nie daje....

    0
TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo