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. Posto anche il codice
- Code: Select all
.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 in cui tento di accedere allo STATUS register si trova alle ultime righe.