Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Delucidazioni su SPI (codice assembler) MCU ATMEL

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Delucidazioni su SPI (codice assembler) MCU ATMEL

Messaggioda Foto Utentegionni90 » 15 apr 2013, 20:34

Ciao ragazzi, stò realizzando un progetto che riguarda la comunicazione wireless di due MCU (un ATMega8535 e un ATMega8515) tramite due transceiver dell Nordic semiconductor ovvero nRf24L01+ (qui il datasheet http://www.nordicsemi.com/eng/content/d ... on_1_0.pdf). In parole povere questi dispositivi vengono programmati tramite interfaccia SPI. Il mio problema consiste nel non riuscire a leggere lo STATUS register di questi dispositivi. Mi spiego meglio, dal datasheet (a pag 52) si legge che, ogni volta che viene scritto un comando tramite SPI il device (nrf24l01) torna lo STATUS register tramite il pin MISO. Io ho provato a leggere lo STATUS register del nRF24L01 scrivendo tramite SPI l'operazione NOP (che non fa altro che mandarmi indietro lo STATUS register) e leggendo il registro SPDR dell' MCU. Il problema è che mi torna sempre tutto 0. Probabilmente non ho capito bene come funziona l'SPI anche perché è la prima volta che mi cimento in cose del genere. La mia domanda è quando il datasheet del transcevier dice che torna lo status register al MCU significa che me lo ritrovo in SPDR o devo fare qualche altra operazione (lato MCU) per poterlo leggere? Probabilmente non sono stato chiaro ma la cosa è difficile da spiegare perciò se c'è qualche problema ditemi cosa non avete capito e grazie in anticipo
Avatar utente
Foto Utentegionni90
0 2
 
Messaggi: 23
Iscritto il: 9 nov 2012, 12:22

0
voti

[2] Re: Delucidazioni su SPI (codice assembler) MCU ATMEL

Messaggioda Foto Utentegionni90 » 16 apr 2013, 0:27

gionni90 ha scritto:Il problema è che mi torna sempre tutto 0.

Scusatemi intendevo dire tutto 1.
Avatar utente
Foto Utentegionni90
0 2
 
Messaggi: 23
Iscritto il: 9 nov 2012, 12:22

0
voti

[3] Re: Delucidazioni su SPI (codice assembler) MCU ATMEL

Messaggioda Foto Utentecyclone » 16 apr 2013, 8:12

Scusa ma NOP è un "no operation", non vedo nessun legame con la SPI a meno che tu non debba aspettare un ciclo di clock per avviare altre procedure sulla SPI.
In ogni caso, ti consiglio di postare il sorgente,
senza codice alla carta difficilmente potrai trovare supporto.

Ciao
Avatar utente
Foto Utentecyclone
86 2
New entry
New entry
 
Messaggi: 64
Iscritto il: 6 feb 2012, 11:38

0
voti

[4] Re: Delucidazioni su SPI (codice assembler) MCU ATMEL

Messaggioda Foto Utentegionni90 » 16 apr 2013, 11:26

Grazie della risposta comunque NOP è il l'istruzione che va inviata all'nRF24L01 che ha indirizzo 0xff, non è il nop del micro. Ecco il codice
Codice: Seleziona tutto
.nolist
.include "m8535def.inc"
.include "E:\AVRFiles\Library\nrf24l01registers.inc"
.list

.def temp=r16
.def data=r17
.def counter=r18
.def counter2=r19
.def regcounter=r20
.def target=r21


rjmp Init

;Wait 20 mS about
Wait:
      dec counter
      breq PC+2
      rjmp Wait
      ldi counter, 240
      dec counter2
      breq PC+2
      rjmp Wait
      ldi counter2,85
      ret

;Start transmission throuth SPI
Start_Transmission:
      sbi PORTB, 1 ;Alza CE per iniziare la trasmissione
      rcall Wait
      cbi PORTB, 1 ;Abbassa CE

SPI_MasterTransmit:
      ; Start transmission of data (r17)
      out SPDR,data
Wait_Transmit:
      ; Wait for transmission complete
      sbis SPSR,SPIF
      rjmp Wait_Transmit
      ret

Init:    ldi temp, LOW(RAMEND) ;Initialize Stack Pointer
      out SPL, temp
      ldi temp, HIGH(RAMEND)
      out SPH, temp
      
      ;Initialize Ports
      clr temp
      out DDRD, temp ;Set PORTD as input
      ser temp
      out PORTD, temp ;Pull UPS on PortD off
      out DDRC, temp ;Set PORTC as output
      clr temp
      out PORTC, temp ;Pull UPS on PORTC on
      
      ;Variables
      ldi counter, 240
      ldi counter2, 85
      
      ;SPI_MasterInit
      ;Set MOSI, SCK and SS output , all others input
      ldi temp,(1<<DDB7)|(1<<DDB5)|(1<<DDB4)
      out DDRB,temp
      ;Enable SPI, Master, set clock rate fck/16
      ldi temp,(1<<SPE)|(1<<MSTR)|(1<<SPR0) ;
      out SPCR,temp
      ldi temp, (1<<PB3);Start CSN high
      out PORTB, temp
      
Init_NRF24L01:
      ;Remember CSN start high
      ldi temp, 0b10101010
      out PORTC, temp ;Controllo posizione
      
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, W_REGISTER ;Accedo al W_REGISTER al quale gli passo l'indirizzo di CONFIG register
      subi data, -REG_CONFIG
      rcall SPI_MasterTransmit
      ldi data, 0b01001110 ;PWR_UP and TXmode (in CONFIG register) set  TX_DS interrupt active low and CRC0 (2 bytes)
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      
      rcall Wait ;Attendi 20 ms
      
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, W_REGISTER;Accedo al W_REGISTER al quale gli passo l'indirizzo di EN_AA register
      subi data,-REG_EN_AA
      rcall SPI_MasterTransmit
      ldi data, 0b00000001 ;Abilito ENAA_P0
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      
      rcall Wait ;Attendi 20 ms
      
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, W_REGISTER ;Abilta l'indirizzo addr0 in ricezione
      subi data,-REG_EN_RXADDR
      rcall SPI_MasterTransmit
      ldi data, 0b00000001
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      
      rcall Wait
      
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, W_REGISTER
      subi data,-REG_SETUP_AW
      rcall SPI_MasterTransmit
      ldi data, 0b00000011 ;Setup address witdh to 5 bytes
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      
      rcall Wait
      
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, W_REGISTER
      subi data, -REG_SETUP_RETR
      rcall SPI_MasterTransmit
      ldi data, 0b00111010 ;Set nRF24L01,s auto retransmission delay up to 1ms and auto retransmit count up to 10 re-transmit
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      
      rcall Wait
      
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, W_REGISTER
      subi data, -REG_RF_CH
      rcall SPI_MasterTransmit
      ldi data, 0b00000010 ;Set 2,4 GHz frequency
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      
      rcall Wait
      
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, W_REGISTER
      subi data, -REG_RF_SETUP
      rcall SPI_MasterTransmit
      ldi data, 0b00001111 ;Set air data rate 2Mbps, set output power 0dBm and eneble LNA
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      
      rcall Wait
      
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, W_REGISTER ;Addressing TX5
      subi data, -REG_TX_ADDR
      rcall SPI_MasterTransmit
      ldi data,0x05 ;Sending address 0xB3B4B5B605
      rcall SPI_MasterTransmit
      ldi data,0xB6
      rcall SPI_MasterTransmit
      ldi data,0xB5
      rcall SPI_MasterTransmit
      ldi data,0xB4
      rcall SPI_MasterTransmit
      ldi data,0xB3
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      
      rcall Wait
      
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI      
      ldi data, W_REGISTER ;Addressing RX0
      subi data, -REG_RX_ADDR_P0
      rcall SPI_MasterTransmit
      ldi data,0x05 ;Sending address 0xB3B4B5B605
      rcall SPI_MasterTransmit
      ldi data,0xB6
      rcall SPI_MasterTransmit
      ldi data,0xB5
      rcall SPI_MasterTransmit
      ldi data,0xB4
      rcall SPI_MasterTransmit
      ldi data,0xB3
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      
      
Start:      
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, W_TX_PAYLOAD
      rcall SPI_MasterTransmit
      ldi data, 0b01100110
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      
      ;Inizia la  trasmettere
      rcall Start_Transmission

      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ser data ;Metti in data NOP e leggi STATUS register
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      in temp, SPDR
      out PORTC, temp ;Visualizza il registro SPDR con i LED


La parte che dicevo io è solo gli ultimi 6 righi
Avatar utente
Foto Utentegionni90
0 2
 
Messaggi: 23
Iscritto il: 9 nov 2012, 12:22

0
voti

[5] Re: Delucidazioni su SPI (codice assembler) MCU ATMEL

Messaggioda Foto Utentecyclone » 16 apr 2013, 12:06

dopo ogni trasmissione devi essere certo che tutti i bit siano stati trasferiti controllando il bit SPIF del registro SPRF prima di procedere con la ricezione :


Codice: Seleziona tutto
Wait:
sbis SPSR,SPIF
rjmp Wait
in SPDR,registro   ;registro di appoggio data


esempio classico di master code:
Codice: Seleziona tutto
SPI_Send:
ldi data,0xAA
out SPDR,data
Wait:
sbis SPSR,SPIF
rjmp Wait
in SPDR,data
Avatar utente
Foto Utentecyclone
86 2
New entry
New entry
 
Messaggi: 64
Iscritto il: 6 feb 2012, 11:38

0
voti

[6] Re: Delucidazioni su SPI (codice assembler) MCU ATMEL

Messaggioda Foto Utentegionni90 » 16 apr 2013, 12:19

Si lo so infatti per questo c'è la subroutine
Codice: Seleziona tutto
SPI_MasterTransmit:
      ; Start transmission of data (r17)
      out SPDR,data
Wait_Transmit:
      ; Wait for transmission complete
      sbis SPSR,SPIF
      rjmp Wait_Transmit
      ret
Avatar utente
Foto Utentegionni90
0 2
 
Messaggi: 23
Iscritto il: 9 nov 2012, 12:22

0
voti

[7] Re: Delucidazioni su SPI (codice assembler) MCU ATMEL

Messaggioda Foto Utentecyclone » 16 apr 2013, 12:25

si, ok, ho visto:

Codice: Seleziona tutto
in temp, SPDR
out PORTC, temp ;Visualizza il registro SPDR con i LED


nel caso di master code, se non ricordo male, il codice dovrebbe essere:

Codice: Seleziona tutto
in SPDR,temp
out PORTC, temp ;Visualizza il registro SPDR con i LED


.......... forse.............
Avatar utente
Foto Utentecyclone
86 2
New entry
New entry
 
Messaggi: 64
Iscritto il: 6 feb 2012, 11:38

0
voti

[8] Re: Delucidazioni su SPI (codice assembler) MCU ATMEL

Messaggioda Foto Utentegionni90 » 16 apr 2013, 12:32

mmm ok provo e ti farò sapere grazie.
Avatar utente
Foto Utentegionni90
0 2
 
Messaggi: 23
Iscritto il: 9 nov 2012, 12:22

0
voti

[9] Re: Delucidazioni su SPI (codice assembler) MCU ATMEL

Messaggioda Foto Utentegionni90 » 16 apr 2013, 12:36

Provato, ma come sospettavo non mi fa compilare
Avatar utente
Foto Utentegionni90
0 2
 
Messaggi: 23
Iscritto il: 9 nov 2012, 12:22

0
voti

[10] Re: Delucidazioni su SPI (codice assembler) MCU ATMEL

Messaggioda Foto Utentecyclone » 16 apr 2013, 12:38

si, si scusa la forma è

Codice: Seleziona tutto
in r16, SPDR


ovvero SPDR in r16
Avatar utente
Foto Utentecyclone
86 2
New entry
New entry
 
Messaggi: 64
Iscritto il: 6 feb 2012, 11:38

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 17 ospiti