Home › Forum › FORUM ELETTRONICA › RICHIESTE CIRCUITI e PUBLICAZIONI › nrf24l01 e libreria SPI MiKroC
- Questo topic ha 3 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 6 anni, 11 mesi fa da ne555. This post has been viewed 1464 times
-
AutorePost
-
22 Aprile 2017 alle 9:51 #2830Massimo Mattia Daniele PeinoPartecipante
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
22 Aprile 2017 alle 22:31 #2831ne555Amministratore del forumCiao :) 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
22 Aprile 2017 alle 22:39 #2837Massimo Mattia Daniele PeinoPartecipantescusa mi potresti scrivere anche un esempio di scrittura di un registro per esempio quando si scrive il registro per selezionare tx 0 rx.
23 Aprile 2017 alle 15:28 #2841ne555Amministratore del forumCiao 🙂 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
-
AutorePost
- Devi essere connesso per rispondere a questo topic.