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.

18f46k22 SPI wysyła, ale nie odbiera

bolek 08 Sie 2013 13:05 1212 2
  • #1 08 Sie 2013 13:05
    bolek
    Specjalista - oświetlenie sceniczne

    Wszystko zdaje się działać prawidłowo prócz odbierania po SPI.

    Ustawienie:

    Code:
        TRISCbits.TRISC3=0;               //wyjscie clk
    
        TRISCbits.TRISC4=1;               //wejscie danych
        TRISCbits.TRISC5=0;               //wyjscie danych
        ANSELCbits.ANSC4=0;
        SCS_SET;                          //linia CS w H
        SSP1STAT=0b10000000;             //samplowanie danych na koniec czasu, przy zboczu rosnoacym
        SSP1CON1=0b00100010; 


    Sama wymiana danych aktualnie wygląda tak:



    Code:
     
    
            dupa++;
            dupa1=SSP1BUF;
            SSP1BUF=dupa;
            while(SSP1STATbits.BF==0)
            dupa1=SSP1BUF;


    Różnie kombinowałem i względem tego bufor zwracał mi cały czas albo 1, albo 255, albo to co do niego wpisałem.
    Przeglądałem już różne przykłady i nic...

    0 2
  • #2 08 Sie 2013 16:31
    archanoid
    Poziom 25  

    Witam . Kolego bolek a dlaczego ustawiłeś tylko wyjście danych spi jako cyfrowe . A czy zegar i wyjście danych nie powinny być także cyfrowe . Jeśli korzystasz z kompilatora C18 to czego nie korzystasz z bibliotek microchipa. Są bardzo fajne i przyjazne.

    0
  • #3 08 Sie 2013 16:44
    bolek
    Specjalista - oświetlenie sceniczne

    Mówisz o ANSEL?. Zdaje się że ustawiłem tylko wejście danych jako cyfrowe (ANSELC4 to PIN SDI). Wedle mojej wiedzy przy pinie ustawionym jako wyjście nie ma to znaczenia, bo chodzi o to aby nie zakłócać np pomiaru ADC.

    Tak jakoś poszło że ruszyłem po swojemu a nie z gotowymi libami.

    Wkleiłem softową realizacje SPI i... pin SDI (RC4) dalej nie reaguje na zmiane stanu, tak jak by ten ANSEL "nie działał"


    ------------edit
    "Przepiołem" SDI na RB1 i działa. Coś nie tak z tym RC4, nie mam już pomysłu- czytam pdfa i nic nie widzę na ten temat. Pin nie jest dzielony z innym sprzętem i powinien być do niego dostęp.

    W razie czego aktualna konfiguracja:

    Code:
    #define SpiInit(){  TRISCbits.TRISC3=0;\
    
                            TRISBbits.TRISB1=1;\
                            TRISCbits.TRISC5=0;\
                            ANSELBbits.ANSB1=0;\
                            SCS_SET;\
                            SDO_CLR;\
                            SCL_CLR;}


    I samo SPI:

    Code:
    char SPI_RW(char value)
    
    {

           char bit_ctr;
       for(bit_ctr=0;bit_ctr<8;bit_ctr++)                                      // output 8-bit
       {
          if(value & 0x80) SDO_SET; else SDO_CLR;
          value = (value << 1);                                           // shift next bit into MSB..
          SCK_SET;                                                        // Set SCK high..
                //    delay_ms(1);                                                  //zz
                    value |= SDI_PIN;                                               // capture current MISO bit
          SCK_CLR;                                                        // ..then set SCK low again
            }
       return(value);                   // return read UINT8
    }

    0