Delucidazioni su SPI (codice assembly) MCU ATMEL

Sezione dedicata ai Microcontrollori e ai Sistemi Embedded

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

Postby js-bascom » 03 May 2013, 10:04

Non saprei se sta funzionado bene o no. Sembra che il board e' trasmettitore, quindi penso che doversti aver un'altro board che funzioni come ricevitore e quind vedere se l'informazione e' ricevuta bene.
John Samperi
Ampertronics Pty. Ltd.
www.ampertronics.com.au
* Electronic Design * Custom Products * Contract Assembly
User avatar
js-bascom
 
Posts: 176
Joined: 23 Mar 2013, 02:53
Location: Sydney, AUSTRALIA Ex Nunziata, Mascali (CT)

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

Postby deluca » 03 May 2013, 10:16

Confermo quanto detto da js-bascom,

non è detto che stia funzionando tutto e bene, possiamo cmq affermare che l'interfaccia seriale sta funzionando.
per testare il circuito completo devi montarne un altro per la ricezione, solo così potrai essere certo del buon funzionamento.
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

Postby gio919kun » 03 May 2013, 21:40

Ok grazie, appena avrò novità mi farò risentire
buon week end
gio919kun
 
Posts: 27
Joined: 16 Apr 2013, 11:39

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

Postby js-bascom » 03 May 2013, 22:28

Senza dubbio il nuovo deluca avatar e' molto piu' simpatico del robot....... :-)
John Samperi
Ampertronics Pty. Ltd.
www.ampertronics.com.au
* Electronic Design * Custom Products * Contract Assembly
User avatar
js-bascom
 
Posts: 176
Joined: 23 Mar 2013, 02:53
Location: Sydney, AUSTRALIA Ex Nunziata, Mascali (CT)

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

Postby deluca » 04 May 2013, 13:24

@js, grazie per il simpatico........ all'avatar si intende.

si però il robot si muoveva e salutava,
ma ad un certo punto mi ha chiesto di essere sostituito perchè a furia di salutare ha usurato gli harmonic-drive del braccio... ;)
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

Postby gio919kun » 06 May 2013, 22:04

Ciao ragazzi, finalmente ho delle novità positive sono riuscito a leggere i registri dei moduli come volevo. Il problema stava nella routine di SPI in pratica io leggevo mentre scrivevo invece dovevo prima scrivere e poi leggere, quindi ho creato una subroutine a parte per la lettura.
Code: Select all
SPI_MasterRecive:
      sbis SPSR, SPIF
      rjmp SPI_MasterRecive
      in status, SPDR
      ret


Ora stò cercando di trasmettere qualcosa dal TX all'RX. Vi aggiornerò grazie a tutti per l'aiuto :)
gio919kun
 
Posts: 27
Joined: 16 Apr 2013, 11:39

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

Postby gio919kun » 09 May 2013, 17:39

Salve, porto ottime notizie, finalmente funziona tutto, trasmissione ricezione interrupt e tutto il resto. Mille grazie per il vostro aiuto e la vostra cordialità, consiglierò a tutti questo forum.
Saluti :D
gio919kun
 
Posts: 27
Joined: 16 Apr 2013, 11:39

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

Postby js-bascom » 09 May 2013, 22:05

Sta lavorando con il tuo codice in assembly o solo con il BASCOM?
John Samperi
Ampertronics Pty. Ltd.
www.ampertronics.com.au
* Electronic Design * Custom Products * Contract Assembly
User avatar
js-bascom
 
Posts: 176
Joined: 23 Mar 2013, 02:53
Location: Sydney, AUSTRALIA Ex Nunziata, Mascali (CT)

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

Postby deluca » 09 May 2013, 23:01

Ottima domanda js-bascom,

ci spetta saperlo...... gio919kun. :D
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

Postby gio919kun » 10 May 2013, 14:37

Con il mio codice assembly
gio919kun
 
Posts: 27
Joined: 16 Apr 2013, 11:39

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

Postby legacy » 10 May 2013, 15:47

Ottimo, ce lo posti completo, ora che funziona ?
legacy
 
Posts: 862
Joined: 12 Mar 2012, 11:30

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

Postby gio919kun » 10 May 2013, 21:39

Si certo anche se sono un po confusionari comunque se hai problemi a capire il codice mi puoi contattare.
Questo è il TX:
Code: Select all
;*************************************************
;* written by: Abbruzzo Giovanni               
;* date:   1/05/2013                           
;* version: 1.0                         
;* file saved as: ProvaNRF24L01.asm               
;* for AVR: m8535                               
;* clock frequency: 8MHz                         
;* items: setup SPI and using NRF24L01+ device   
;*              Legend:                            
;*            PB1=CE (to nRF24L01 side)                    
;*                                    
;*            PB3=CSN                     
;*              PB4=SS                           
;*             PB5=MOSI                     
;*              PB6=MISO                         
;*              PB7=SCK                         
;*            
;*            PD3=INT1 (IRQ to    nRF24L01 side)
;*                  
;*              W_REGISTER=001AAAAA             
;*              R_REGISTER=000AAAAA             
;*                                    
;*                                               
;*************************************************


.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
.def status=r22


;Look-up-table

      rjmp Init; Reset Handler
       reti ; IRQ0 Handler (PD2)
       rjmp IRQ1 ; IRQ1 Handler (PD3)
       reti ; Timer2 Compare Handler
       reti ; Timer2 Overflow Handler
       reti ; Timer1 Capture Handler
       reti ; Timer1 Compare A Handler
       reti ; Timer1 Compare B Handler
       reti ; Timer1 Overflow Handler
       reti ; Timer0 Overflow Handler
       reti ; SPI Transfer Complete Handler
      reti ; USART RX Complete Handler
      reti ; UDR Empty Handler
      reti ; USART TX Complete Handler
      reti ; ADC Conversion Complete Handler
      reti ; EEPROM Ready Handler
      reti ; Analog Comparator Handler
      reti ; Two-wire Serial Interface Handle   
      reti ; IRQ2 Handler (PB2)
      reti ; Timer0 Compare Handler
      reti ; Store Program Memory Ready Handler


One_sec:
      in temp, TCNT0 ;read T/C0
      cp temp, target ;is temp = target?
      breq PC + 2 ;yes, so skip 2 steps
      rjmp One_sec ;no, so loops back to One_sec
      ldi temp, 63
      add target, temp ;add n1 to target
      inc regcounter ;increment regcounter
      cpi regcounter, 62   ;is regcounter = n2?
      breq PC+2 ;yes, so skip 2 steps
      rjmp One_sec ;no, so loops back to One_sec
      clr regcounter ;restart to count with 0
      ret
      
;Wait 28 mS about
Wait:
      dec counter
      breq PC+2
      rjmp Wait
      ldi counter, 240
      dec counter2
      breq PC+2
      rjmp Wait
      ldi counter2,240
      ret

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

SPI_MasterRecive:
      sbis SPSR, SPIF
      rjmp SPI_MasterRecive
      in status, SPDR
      ret

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
      out PORTC, temp ;Start with lights off
      
      
      
      ;Variables
      ldi counter, 240
      ldi counter2, 240
      
      ;Timer counter
      ldi temp, 0b00000101
      out TCCR0, temp   ;T/C0 counts at CK/1024
      clr temp
      out TCNT0, temp   ;init T/C0 to zero
      ldi target, 63
      clr regcounter ;start to count with 0
      
      ;SPI_MasterInit
      ;Set MOSI, SCK,CE,CSN SS output , all others input
      ldi temp,(1<<DDB7)|(1<<DDB5)|(1<<DDB4)|(1<<DDB1)|(1<<DDB3)
      out DDRB,temp
      ;Enable SPI, Master, set clock rate fck/8
      ldi temp, (1<<SPI2X)
      out SPSR, temp ;Double speed
      ldi temp,(1<<SPE)|(1<<MSTR)|(1<<SPR0)|(0<<SPR1)|(0<<DORD)|(0<<CPHA)|(0<<CPOL)
      out SPCR,temp
      ldi temp, (1<<PB3);Start CSN high
      out PORTB, temp
      
      ;Eneble interupts
      ldi temp, (0<<ISC11)|(0<<ISC10)    
      out MCUCR, temp ;INT1 generates an interrupt request on low level
      ldi temp, (1<<INT1)
      out GICR, temp ;Enables ext INT1 interrupts   
      sei
      
Init_NRF24L01:
      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 and MAX_DS interrupt active low and CRC0 (2 bytes)
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      
      
      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
      
      
      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
      
   
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, W_REGISTER
      subi data, -REG_RF_CH
      rcall SPI_MasterTransmit

      ldi data, 0b00101000 ;Set 2,44 GHz frequency
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      

      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, W_REGISTER
      subi data, -REG_RF_SETUP
      rcall SPI_MasterTransmit

      ldi data, 0b00001110 ;Set air data rate 2Mbps, set output power 0dBm
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      
      
      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,0x34 ;Sending address 0xB3B4B5B605
      rcall SPI_MasterTransmit
      ldi data,0x43
      rcall SPI_MasterTransmit
      ldi data,0x10
      rcall SPI_MasterTransmit
      ldi data,0x10
      rcall SPI_MasterTransmit
      ldi data,0x01
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      
   
      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,0x34 ;Sending address 0xB3B4B5B605
      rcall SPI_MasterTransmit
      ldi data,0x43
      rcall SPI_MasterTransmit
      ldi data,0x10
      rcall SPI_MasterTransmit
      ldi data,0x10
      rcall SPI_MasterTransmit
      ldi data,0x01
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
   
Start:      
      ldi temp, 0b11111110
      out PORTC, temp
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ser data ;NOP write nop for receiving status register
      rcall SPI_MasterTransmit
      rcall SPI_MasterRecive
      sbi PORTB, 3
      out PORTC, status
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, W_TX_PAYLOAD
      rcall SPI_MasterTransmit
      ldi data, 0b01010101
      rcall SPI_MasterTransmit
      sbi PORTB, 1 ;Alza CE per iniziare la trasmissione

      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      ldi temp, 0b11011111
      out PORTC, temp
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ser data ;NOP write nop for receiving status register
      rcall SPI_MasterTransmit
      rcall SPI_MasterRecive
      sbi PORTB, 3
      out PORTC, status
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      sbic PINC, 0
      rcall Flush_TXFIFO
      nop
      rjmp Start
      
Flush_TXFIFO:
      ldi temp, 0b01111111
      out PORTC, temp
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, FLUSH_TX
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      ;Leggi STATUS
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ser data ;NOP write nop for receiving status register
      rcall SPI_MasterTransmit
      rcall SPI_MasterRecive
      sbi PORTB, 3
      out PORTC, status
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      ret
   
Flush_Max_Rt:
      ldi temp, 0b10111111
      out PORTC, temp
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, W_REGISTER ;Abilta l'indirizzo addr0 in ricezione
      subi data,-REG_STATUS
      rcall SPI_MasterTransmit
      ldi data, 0b00010000 ;Reset MAX_RT
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      ;Leggi STATUS
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ser data ;NOP write nop for receiving status register
      rcall SPI_MasterTransmit
      rcall SPI_MasterRecive
      sbi PORTB, 3
      out PORTC, status
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      ret
      
IRQ1:
      ldi temp, 0b10111111
      out PORTC, temp
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      ;Leggi STATUS
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ser data ;NOP write nop for receiving status register
      rcall SPI_MasterTransmit
      rcall SPI_MasterRecive
      sbi PORTB, 3 ;Alza CSN per abilitare la comunicazione SPI
      out PORTC, status
      sbic PINC, 4
      rcall Flush_Max_Rt
      ;Leggi STATUS
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ser data ;NOP write nop for receiving status register
      rcall SPI_MasterTransmit
      rcall SPI_MasterRecive
      sbi PORTB, 3 ;Alza CSN per abilitare la comunicazione SPI
      out PORTC, status
      sbic PINC, 5
      rjmp End
      reti
End:
      ldi temp, 0b11101111
      rjmp End

e questo il RX:
Code: Select all
;*************************************************
;* written by: Abbruzzo Giovanni               
;* date:   2/05/2013                           
;* version: 1.0                         
;* file saved as: Project2dot6ricevitore.asm               
;* for AVR: m8515                               
;* clock frequency: 8MHz                         
;* items: setup SPI and using NRF24L01+ device   
;*              Legend:                            
;*            PB1=CE (to nRF24L01 side)                    
;*                             
;*            PB3=CSN   (to nRF24L01 side)                  
;*              PB4=SS (non utilizzato)                       
;*             PB5=MOSI                     
;*              PB6=MISO                         
;*              PB7=SCK     
;*          PD3=INT1 (to nRF24L01 side)   
;*                                    
;*              W_REGISTER=001AAAAA             
;*              R_REGISTER=000AAAAA             
;*                                    
;*                                               
;*************************************************


.nolist
.include "m8515def.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
.def status=r22


;Look-up-table

      rjmp Init; Reset Handler
       reti ; IRQ0 Handler (PD2)
       rjmp Start; IRQ1 Handler (PD3)
       reti ; Timer2 Compare Handler
       reti ; Timer2 Overflow Handler
       reti ; Timer1 Capture Handler
       reti ; Timer1 Compare A Handler
       reti ; Timer1 Compare B Handler
       reti ; Timer1 Overflow Handler
       reti ; Timer0 Overflow Handler
       reti ; SPI Transfer Complete Handler
      reti ; USART RX Complete Handler
      reti ; UDR Empty Handler
      reti ; USART TX Complete Handler
      reti ; ADC Conversion Complete Handler
      reti ; EEPROM Ready Handler
      reti ; Analog Comparator Handler
      reti ; Two-wire Serial Interface Handle   
      reti ; IRQ2 Handler
      reti ; Timer0 Compare Handler
      reti ; Store Program Memory Ready Handler
      
;Wait 30 mS about
Wait:
      dec counter
      breq PC+2
      rjmp Wait
      ldi counter, 240
      dec counter2
      breq PC+2
      rjmp Wait
      ldi counter2,240
      ret

One_sec:
      in temp, TCNT0 ;read T/C0
      cp temp, target ;is temp = target?
      breq PC + 2 ;yes, so skip 2 steps
      rjmp One_sec ;no, so loops back to One_sec
      ldi temp, 63
      add target, temp ;add n1 to target
      inc regcounter ;increment regcounter
      cpi regcounter, 62   ;is regcounter = n2?
      breq PC+2 ;yes, so skip 2 steps
      rjmp One_sec ;no, so loops back to One_sec
      clr regcounter ;restart to count with 0
      ret
;Start transmission throuth SPI
SPI_MasterRecive:
      sbis SPSR, SPIF
      rjmp SPI_MasterRecive
      in status, SPDR
      ret

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
      ser temp
      out DDRC, temp ;Set PORTC as output
      out PORTC, temp ;Start with LEDs off
      
      ;Variables
      ldi counter, 240
      ldi counter2, 240
      
      ;SPI_MasterInit
      ;Set MOSI, SCK,CE,CSN SS output , all others input
      ldi temp,(1<<DDB7)|(1<<DDB5)|(1<<DDB4)|(1<<DDB1)|(1<<DDB3)
      out DDRB,temp
      ;Enable SPI, Master, set clock rate fck/8
      ldi temp, (1<<SPI2X)
      out SPSR, temp ;Double speed
      ldi temp,(1<<SPE)|(1<<MSTR)|(1<<SPR0) ;
      out SPCR,temp
      ldi temp, (1<<PB3);Start CSN high
      out PORTB, temp    
      
      ;Timer counter
      ldi temp, 0b00000101
      out TCCR0, temp   ;T/C0 counts at CK/1024
      clr temp
      out TCNT0, temp   ;init T/C0 to zero
      ldi target, 63
      clr regcounter ;start to count with 0
         
      ;Eneble interupts
      ldi temp, (0<<ISC11)|(0<<ISC10)
      out MCUCR, temp ;INT1 generates an interrupt request on low level
      ldi temp, (1<<INT1)
      out GICR, temp ;Enables extINT1 interrupt
      

Init_NRF24L01:
      ;Remember CSN start high
      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, 0b00111111 ;PWR_UP and RXmode (in CONFIG register) set  RX_DS interrupt active low and CRC0 (2 bytes)
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      
      
      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
      
      
      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
      
   
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, W_REGISTER
      subi data, -REG_RF_CH
      rcall SPI_MasterTransmit

      ldi data, 0b00101000 ;Set 2,44 GHz frequency
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      

      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, W_REGISTER
      subi data, -REG_RF_SETUP
      rcall SPI_MasterTransmit

      ldi data, 0b00001110 ;Set air data rate 2Mbps, set output power 0dBm and eneble LNA
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI      
   
      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,0x34 ;Sending address 0xB3B4B5B605
      rcall SPI_MasterTransmit
      ldi data,0x43
      rcall SPI_MasterTransmit
      ldi data,0x10
      rcall SPI_MasterTransmit
      ldi data,0x10
      rcall SPI_MasterTransmit
      ldi data,0x01
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI

      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, W_REGISTER ;Addressing RX0
      subi data, -REG_RX_PW_P0
      rcall SPI_MasterTransmit

      ldi data, 0b00000001 ;1 byte
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      
Loop:
      cbi PORTC, 0
      sei   
      sbi PORTB, 1 ;Alza CE per iniziare la ricezione
      nop
      nop
      nop
      nop
      rjmp Loop

Start:   
   
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, R_REGISTER
      subi data, -REG_CONFIG ;Leggi config
      rcall SPI_MasterTransmit

      ldi data, 0b00001111 ;Questo byte serve solo per riceveere status
      rcall SPI_MasterTransmit
      rcall SPI_MasterRecive ;Ricevi status
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      out PORTC, status
      rcall One_sec
      rcall One_sec ;Aspetta 3 secondo
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec

      
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, R_REGISTER
      subi data, -REG_EN_AA ;Leggi en_aa
      rcall SPI_MasterTransmit

      ldi data, 0b00001111 ;Questo byte serve solo per ricevere status
      rcall SPI_MasterTransmit
      rcall SPI_MasterRecive ;Ricevi status
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      out PORTC, status
      rcall One_sec
      rcall One_sec ;Aspetta 3 secondo
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec

      
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, R_REGISTER
      subi data, -REG_EN_RXADDR ;Leggi rx_addr
      rcall SPI_MasterTransmit

      ldi data, 0b00001111 ;Questo byte serve solo per riceveere status
      rcall SPI_MasterTransmit
      rcall SPI_MasterRecive ;Ricevi status
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      out PORTC, status
      rcall One_sec
      rcall One_sec ;Aspetta 3 secondo
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec

      
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, R_REGISTER
      subi data, -REG_RF_CH;Leggi rf_ch
      rcall SPI_MasterTransmit

      ldi data, 0b00001111 ;Questo byte serve solo per riceveere status
      rcall SPI_MasterTransmit
      rcall SPI_MasterRecive ;Ricevi status
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      out PORTC, status
      rcall One_sec
      rcall One_sec ;Aspetta 3 secondo
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec

      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, R_REGISTER
      subi data, -REG_RF_SETUP ;Leggi rf_setup
      rcall SPI_MasterTransmit

      ldi data, 0b00001111 ;Questo byte serve solo per riceveere status
      rcall SPI_MasterTransmit
      rcall SPI_MasterRecive ;Ricevi status
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      out PORTC, status
      rcall One_sec
      rcall One_sec ;Aspetta 3 secondo
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec

      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, R_REGISTER
      subi data, -REG_RX_PW_P0 ;Leggi config
      rcall SPI_MasterTransmit

      ldi data, 0b00001111 ;Questo byte serve solo per riceveere status
      rcall SPI_MasterTransmit
      rcall SPI_MasterRecive ;Ricevi status
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      out PORTC, status
      rcall One_sec
      rcall One_sec ;Aspetta 3 secondi
      rcall One_sec
      rcall One_sec
      rcall One_sec
      rcall One_sec
      
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, R_RX_PAYLOAD
      rcall SPI_MasterTransmit
      ser data ;Questo byte serve solo per riceveere payload
      rcall SPI_MasterTransmit
      rcall SPI_MasterRecive ;Ricevi status
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
      out PORTC, status
      cbi PORTB, 3 ;Abbassa CSN per abilitare la comunicazione SPI
      ldi data, W_REGISTER
      subi data,-REG_STATUS
      rcall SPI_MasterTransmit
      ldi data, 0b01000000 ;Reset RX_DR
      rcall SPI_MasterTransmit
      sbi PORTB, 3 ;Alza CSN per chiudere la comunicazione SPI
Loop1:   
      nop
      nop
      rjmp Loop1
      
      


e questa è la libreria da importare:
Code: Select all
/* Memory Map */
.equ  REG_CONFIG =     0x00
.equ  REG_EN_AA  =     0x01
.equ  REG_EN_RXADDR =   0x02
.equ  REG_SETUP_AW   = 0x03
.equ  REG_SETUP_RETR  =0x04
.equ  REG_RF_CH       =0x05
.equ  REG_RF_SETUP    =0x06
.equ  REG_STATUS      =0x07
.equ  REG_OBSERVE_TX = 0x08
.equ  REG_CD         =0x09
.equ  REG_RX_ADDR_P0= 0x0A
.equ  REG_RX_ADDR_P1= 0x0B
.equ  REG_RX_ADDR_P2 = 0x0C
.equ  REG_RX_ADDR_P3 = 0x0D
.equ  REG_RX_ADDR_P4 = 0x0E
.equ  REG_RX_ADDR_P5 = 0x0F
.equ  REG_TX_ADDR    = 0x10
.equ  REG_RX_PW_P0   = 0x11
.equ  REG_RX_PW_P1   = 0x12
.equ  REG_RX_PW_P2   = 0x13
.equ  REG_RX_PW_P3  =  0x14
.equ  REG_RX_PW_P4  =  0x15
.equ  REG_RX_PW_P5  =  0x16
.equ  REG_FIFO_STATUS =0x17
.equ  REG_FEATURE     =0x1D
.equ  REG_DYNPD=        0x1C

/* Bit Mnemonics */
.equ  REG_MASK_RX_DR=  6
.equ  REG_MASK_TX_DS = 5
.equ  REG_MASK_MAX_RT =4
.equ  REG_EN_CRC      =3
.equ  REG_CRCO        =2
.equ  REG_PWR_UP     = 1
.equ  REG_PRIM_RX    = 0
.equ  REG_ENAA_P5    = 5
.equ  REG_ENAA_P4    = 4
.equ  REG_ENAA_P3    = 3
.equ  REG_ENAA_P2    = 2
.equ  REG_ENAA_P1    = 1
.equ  REG_ENAA_P0    = 0
.equ  REG_ERX_P5    =  5
.equ  REG_ERX_P4    =  4
.equ  REG_ERX_P3    =  3
.equ  REG_ERX_P2    =  2
.equ  REG_ERX_P1    =  1
.equ  REG_ERX_P0    =  0
.equ  REG_AW        =  0
.equ  REG_ARD       =  4
.equ  REG_ARC       =  0
.equ  REG_PLL_LOCK   = 4
.equ  REG_RF_DR      = 3
.equ  REG_RF_PWR     = 1
.equ  REG_LNA_HCURR  = 0
.equ  REG_RX_DR      = 6
.equ  REG_TX_DS       =5
.equ  REG_MAX_RT      =4
.equ  REG_RX_P_NO     =1
.equ  REG_TX_FULL     =0
.equ  REG_PLOS_CNT    =4
.equ  REG_ARC_CNT     =0
.equ  REG_TX_REUSE    =6
.equ  REG_FIFO_FULL   =5
.equ  REG_TX_EMPTY    =4
.equ  REG_RX_FULL     =1
.equ  REG_RX_EMPTY    =0
.equ  REG_RPD         =0x09
.equ  REG_RF_DR_LOW   =5
.equ  REG_RF_DR_HIGH  =3
.equ  REG_RF_PWR_LOW  =1
.equ  REG_RF_PWR_HIGH =2

/* Instruction Mnemonics */
.equ  R_REGISTER    =0x00
.equ  W_REGISTER    =0x20
.equ  REGISTER_MASK =0x1F
.equ  R_RX_PAYLOAD  =0x61
.equ  W_TX_PAYLOAD  =0xA0
.equ  FLUSH_TX      =0xE1
.equ  FLUSH_RX      =0xE2
.equ  REUSE_TX_PL   =0xE3
.equ  FAI_NIENTE    =0xFF
.equ  ACTIVATE      =0xA0
.equ  DATADATA       =0x73
gio919kun
 
Posts: 27
Joined: 16 Apr 2013, 11:39

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

Postby js-bascom » 10 May 2013, 22:03

Bravissimo, viva l'assembly.
John Samperi
Ampertronics Pty. Ltd.
www.ampertronics.com.au
* Electronic Design * Custom Products * Contract Assembly
User avatar
js-bascom
 
Posts: 176
Joined: 23 Mar 2013, 02:53
Location: Sydney, AUSTRALIA Ex Nunziata, Mascali (CT)

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

Postby legacy » 11 May 2013, 00:03

E, w l'asm ... mi ricorda tanto le parti in asm della mia scheda MIPS32, e le dovevo per forza scrivere in asm, anche se scrivere in asm su un core super scalare con pipeline hazards non e' per niente bello. Stavo scrivendo un layer del BSP e certe cose (per es, leggere/scrivere un registro CPU, TLB o COP, manipolare lo stack, invalidare la cache) in C non le puoi fare o le puoi fare ma non in modo altrettanto efficiente, oltre al fatto che molti compilatori C non si sa mai come traducono qualcosa, servono un sacco di pragma o comunque di paletti e relative verifiche, ed io non volevo farmi male. Morale ho scritto si e no 200 di rige in asm per tagliare la testa al toro, pero' a lavoro finito mi e' venuto il malditesta.

Trovo piacevole solo l'asm di macchine CISC anni '80, tra cui Z80 o 6800 e derivati.
legacy
 
Posts: 862
Joined: 12 Mar 2012, 11:30

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

Postby deluca » 11 May 2013, 07:37

@gio919,
un bel lavoretto, complimenti !! specialmente per un ragazzo alle prime armi... ma di sicuro talentuoso.

Leggere righe di programma scritte in asm da altri, per me è un vero piacere.
Sappiamo che si studia solo a livello educazionale e che purtroppo non è più la tendenza attuale, causa i compilatori che ti fanno risparmiare in time-to-market,
ma ripensare e rispolverare i miei progetti realizzati in assembly con lo Z80 prima, con l'8051 e L'ST6 dopo mi fa venire una certa nostalgia.

In bocca al lupo.
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Delucidazioni su SPI (codice assembly) MCU ATMEL

Postby gio919kun » 11 May 2013, 09:58

Grazie grazie, ma questa è solo una piccola parte del progetto, ora va implementato con tutto il resto. Viva l'assembly, saluti e crepi il lupo :)
gio919kun
 
Posts: 27
Joined: 16 Apr 2013, 11:39

Previous

Return to Microcontrollori e microprocessori

Who is online

Users browsing this forum: No registered users and 4 guests

cron