nrf24l01 e libreria SPI MiKroC

Home Forum FORUM ELETTRONICA RICHIESTE CIRCUITI e PUBLICAZIONI nrf24l01 e libreria SPI MiKroC

Questo argomento contiene 3 risposte, ha 2 partecipanti, ed è stato aggiornato da  ne555 7 mesi, 3 settimane fa. This post has been viewed 116 times

Stai vedendo 4 articoli - dal 1 a 4 (di 4 totali)
  • Autore
    Articoli
  • #2830

    Innanzitutto complimenti per il sito.
    Mi chiedevo, visto che avete scritto un articolo sull’ uso della libreria SPI QUI, un articolo sul nrf24l01 QUI( entrambi molto interessanti), perchè non scrivere un articolo usando entrambi.
    In quanto l’articolo che riporta un esempio di comunicazione tra due nrf24l01 anche se molto interessante non usa librerie.

    Massimo

    #2831

    ne555
    Amministratore del forum
    Ciao :) nel codice che tu hai visto vengono usati i seguente sottofunzioni:
    
    void nRF24L01_write(unsigned char d)                //sottoprogramma che simula una scrittura spi
      unsigned char s = 0;
    
      for(s = 0; s < 8; s++)                            //questo for serve a trasmettere sul pin mosi bit per bit il dato d
      {
        if((d & 0x80) != 0)
        {
          MOSI_pin = 1;                                 //se il bit scandito è 1 trasmetto 1
        }
        else
        {
          MOSI_pin = 0;                                 //altrimenti 0
        }
        d <<= 1;                                        //shifto d per inviare il prossimo bit
        SCK_pin = 1;                                    //creo un clock
        delay_us(8);
        SCK_pin = 0;
        delay_us(8);
      }
    }
    
    e quello per la lettura:
    
    unsigned char nRF24L01_read()                        //questo sottoprogramma simula una comunicazione SPI
    {
      unsigned char s = 0;                               //variabile per esegguire 8 esecuzioni
      unsigned char msg = 0;
    
      for(s = 0; s < 8; s++){                            //esegue 8 volte
          msg <<= 1;                                     //shifto msg
          SCK_pin = 1;                                   //attivo il clock
          delay_us(8);                                   //aspetto 8us (f spi 62Kbps)
          if(MISO_pin != 0)                              //se in=0
          {
            msg |= 1;                                    //azzero il bit di msg
          }
          SCK_pin = 0;                                   //disattivo il clock
          delay_us(8);
      }
    
      return msg;                                       //ritorno il valore letto
    }
    
    non credo servi fare un articola a parte, però è utile il tuo consiglio. In partica 
    basta inizializzare la comunicazione spi nel main con la seguente stringa 
    utilizzando un cristallo di quarzo da 4MHz:
    
    SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
    
    e sostituire alle due sottofunzioni viste prima le seguente sottofunzioni: 
    
    void nRF24L01_write(unsigned char d)                //sottoprogramma  scrittura spi
      SPI1_Write(d);
    }
    
    unsigned char nRF24L01_read()                       //questo sottoprogramma lettura SPI
    {
    msg = 
     take = SPI_Read(buffer);
      return msg;                                       //ritorno il valore letto
    }
    
    Probabilmente va inizializzato il char "buffer" all'inizio del codice.
    Se hai il circuito già montato su breadboard e testato con il codice da me 
    presentato potresti provare la modifica qui suggerita usando la 
    libreria spi e vedere se tutto funziona
    • Questa risposta è stata modificata 7 mesi, 3 settimane fa da  ne555.
    • Questa risposta è stata modificata 7 mesi, 3 settimane fa da  ne555.
    • Questa risposta è stata modificata 7 mesi, 3 settimane fa da  ne555.
    • Questa risposta è stata modificata 7 mesi, 3 settimane fa da  ne555.
    • Questa risposta è stata modificata 7 mesi, 3 settimane fa da  ne555.
    #2837

    scusa mi potresti scrivere anche un esempio di scrittura di un registro per esempio quando si scrive il registro per selezionare tx 0 rx.

    #2841

    ne555
    Amministratore del forum

    Ciao 🙂 per scrivere i registri con le varie informazioni per avviare la comunicazione e inizializzare il modulo, si usano le seguentei sottofunzioni:

    void register_write(unsigned char reg, unsigned char value) //sottoprogramma per scrivere i registri
    {
    SS_pin = 0; //indico che sto per inviare un comando
    nRF24L01_write((reg | W_REGISTER_cmd)); //maschero il registro con il comando per scrivere
    nRF24L01_write(value); //invio il valore che voglio scrivere nel registro
    SS_pin = 1;
    delay_us(8);
    }

    //—————————————————————————————————————————-//
    void write_command(unsigned char cmd) //sottoprogramma scrittura comandi
    SS_pin = 0; //indico che voglio inviare un comando
    nRF24L01_write(cmd); //scrivo il comando cmd
    SS_pin = 1; //ripristino il pin ss
    delay_us(8);
    }

    Quindi si va a scrivere normalmente con il protocollo SPI solo che il pin di SS va posto a livello logico 0, in questo modo il modulo wireless capisce che si sta per scrivere un comando o si va a scrivere un registro. il comando viene normalmente inviato tramite SPI. per scrivere nel registro invice si invia in spi la OR logica tra il registro dove si vuole scrivere e il comdando di scrittura, successivamente si invia il valore che si vuole scrivere nel registro

Stai vedendo 4 articoli - dal 1 a 4 (di 4 totali)

Devi essere loggato per rispondere a questa discussione.