Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Komunikacja po SPI , brak sygnału na SCK

Zemsta.Elektryka 12 Lut 2010 10:52 1545 2
  • #1 12 Lut 2010 10:52
    Zemsta.Elektryka
    Poziom 9  

    Witam. Od dłuższego czasu próbuje dogadać się z MRF24J40MA po SPI i niestety jest to ciągłe pasmo porażek. Używam biblioteki do SPI załączonej w kompilatorze C18. Procesor to PIC18F46K20.

    Kod programu:

    Code:

    #include <p18f46k20.h>
    #include <spi.h>
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    #pragma config FOSC = INTIO67 //internal osc. on
    #pragma config WDTEN = OFF //WDT off
    #pragma config DEBUG = ON
    #pragma config LVP = OFF
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    unsigned char SPI_adress = 0x03; //adres pod który wysyłam
    unsigned char SPI_data = 0xFF;  //wartość wysyłana
    int licznik;
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void openSPI (void);
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void main (void)
    {
    // inicialization of ports

    ANSELH = 0;
    TRISA = 0x00; //Port A wyjscia
    TRISB = 0x18; //Port B wyjscia za wyjątkiem 2 przycisków RB3 i RB4
    TRISC = 0b00010000; //Port C wyjścia za wyjątkiem RC4 gdzie jest SDI
    TRISD = 0x00; //Port D wyjscia
    LATA = 0x00;


    LATCbits.LATC0 = 0; //CS = 0
    LATCbits.LATC1 = 1; //WAKE = 1
    LATCbits.LATC2 = 1; //RESET = 1



    // RESETING TRANSCIEVER
    for (licznik = 0; licznik < 15000 ; licznik++ );
    LATCbits.LATC2 = 0;
    for (licznik = 0; licznik < 15000 ; licznik++ );
    LATCbits.LATC2 = 1;
    for (licznik = 0; licznik < 15000 ; licznik++ );

    SPI_adress = ((SPI_adress << 1)&0b01111111); //ustawianie adresu według specyfikacji układu odbierającego MRF24J40MA
    openSPI(); //otwarcie SPI

    WriteSPI(SPI_adress); //Zapis pierwszego bajtu
    WriteSPI(SPI_data); //Zapis drugiego bajtu
    for (licznik = 0; licznik < 15000 ; licznik++ ); //wait

    SPI_adress = (SPI_adress & 0b01111110); //Ustawianie adresu na odczyt
    WriteSPI (SPI_adress);  //Zapis adresu
    SPI_data = ReadSPI(); //Odczytanie danej , tutaj powinno odczytać nasze 0xFF

    LATA = SPI_data; //wystawienie danej na port

    while (1)
    {
    WriteSPI(SPI_adress);
    };
    }
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void openSPI (void)
    {
    SSPSTATbits.SMP = 0;    //data sampling seting
    SSPSTATbits.CKE = 1;    //change SDO when SCK from low to Hi
    SSPCON1bits.CKP = 0;    //Idle SCK = L
    SSPCON1bits.SSPM0 = 1;  //SPI Master mode, clock = FOSC/16
    SSPCON1bits.SSPM1 = 0;
    SSPCON1bits.SSPM2 = 0;
    SSPCON1bits.SSPM3 = 0;
    SSPCON1bits.SSPEN = 1;  //SPI Enable
    }
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



    Niestety zamiast na porcie odebrać 0xFF odbieram 0x00 tak jakby tamten układ nic nie nadawał. Co gorsza patrząc na pętle główną programu tam ciągle wysyłam dane żeby sobie sprawdzić woltomierzem pin SCK czy wysyła CLK (powinni tam być pewnie coś koło 1,5 V przy zasilaniu 3V) niestety mam tam przez cały czas potencjał masy.

    Oto schemat połączeń w moim układzie.

    Komunikacja po SPI , brak sygnału na SCK

    Sam już nie wiem co z tym układem jest nie tak. Byłbym naprawdę wdzięczny za jakąkolwiek pomoc. Czy w przypadku trybu Master musze podpiąć pin SS do masy? Czytałem że jest on używany tylko przy trybie Slave ale sam już nie wiem.

    0 2
  • #2 13 Lut 2010 11:55
    ginar
    Poziom 21  

    Skoro na SCK przy ciągłym wysyłaniu danych nic się nie dzieje to transmisja raczej nie idzie...
    Spróbuj ustawić pin SS na wyjściowy i na stan 1 jeszcze przed jakąkolwiek inicjalizacją rejestrów SPI.

    0
  • #3 19 Lut 2010 00:00
    CDMaster
    Poziom 14  

    1. Dlaczego przeciążasz funkcję OpenSPI?? Standardowa jest bardzo dobra:D
    2. Sampling najlepiej zrobić na zboczu opadającym (dokumentacja MRF24J40MA str 137)
    3. Z doświadczenia wiem, że warningi w C18 to zła rzecz... Głównie te dotyczące funkcji bez prototypu - ich nie należy ignorować. Sprawdź czy aby na pewno takich nie masz:D
    4. Jeszcze jedna ważna uwaga... Myślę, że główny powód powstania tego tematu... Po bibliotecznej WriteSPI czekasz, aż informacja zostanie wysłana while(jakis SPI busy bit:D); czy jakoś tak:D No chyba, że używasz przerwań, ale tutaj takich nie widzę:P
    5. Tak dla estetyki... #include <delays.h> czy delay:D Znajdziesz tam coś co możesz użyć zamiast tych pętli;P

    0