www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI Datenübertragung


Autor: A. C. (michael1988)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich möchte mit folgendem Code ein "r" von einem MIkrocontroller zum 
nächsten übertragen. Das Ganze hat auch schon funktioniert, vor 2 
Monaten, aber jetzt tut sich garnichts mehr!

Hier der Quellcode des Masters:
.include "m8def.inc"

.def temp1     = r16
.def temp2    = r17

.equ Bereit      = 4        ;Gibt Status von COntroller an("Bereit"=Gesetzt->Controller
.equ ZentBef  = 5        ;EINGANG:Hierhin sendet Zentrale seine Befehle zur Verteilung
                ;(weg schicken;her holen;nix machen);muss global deklariert werden

.equ DD_SS      = 2      ;Mit DD_SS des Slave verbunden
.equ DD_MOSI    = 3      ;Mit DD_MISO des Slave verbunden    
.equ DD_MISO    = 4      ;Mit DD_MOSI des Slave verbunden
.equ DD_SCK     = 5      ;Mit DD_SCK des Slave verbunden

.equ vary       = 4
.equ DDR_SPI    = DDRB
.equ PORT_SPI  = PORTB

          ldi temp1,LOW(RAMEND)
          out SPL,temp1

          ldi temp1,HIGH(RAMEND)
          out SPH,temp1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
          rcall SPI_MasterInit
loop:        sbi PORTB,DD_SS
          ldi temp1,'r'
          rcall SPI_MasterTransmit
          rjmp loop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SPI_MasterInit:    ldi temp2,(1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);|(1<<ComSignalausgang)|(0<<ComSignaleingang)  ;Set MOSI and SCK output, all others input
          out DDR_SPI,temp2                ;Enable SPI, Master, set clock rate fck/16
          ldi temp2,(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0)
          out SPCR,temp2  
          ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SPI_MasterTransmit:  cbi PORT_SPI,DD_SS
          
          out SPDR,temp1                ;Start transmission of data (temp1)
Wait_Transmit:    sbis SPSR,SPIF                ;Wait for transmission complete
          rjmp Wait_Transmit
          in temp1,SPDR        
          
          sbi PORT_SPI,DD_SS
          ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;          

Und Hier der des Slaves:
.include "m8def.inc"

.def temp1     = r16
.def transZ      = r20
.def temp2    = r17
.def receiZ    = r21


.equ DD_SS      = 2      ;Mit DD_SS des Slave verbunden
.equ DD_MOSI    = 3      ;Mit DD_MISO des Slave verbunden    
.equ DD_MISO    = 4      ;Mit DD_MOSI des Slave verbunden
.equ DD_SCK     = 5      ;Mit DD_SCK des Slave verbunden

.equ vary       = 4
.equ DDR_SPI    = DDRB

          ldi temp1,LOW(RAMEND)
          out SPL,temp1

          ldi temp1,HIGH(RAMEND)
          out SPH,temp1
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
          ldi r16,0xff
          out DDRD,r16

          ;ldi r16,0xff
          ;out PORTD,r16
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
          rcall uart_init
          rcall SPI_SlaveInit
loop:        rcall SPI_SlaveReceive
          rcall uart_send
          rjmp loop
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SPI_SlaveInit:    ldi temp2,(1<<DD_MISO)    ;Set MISO output, all others input
          out DDR_SPI,temp2            ;Enable SPI
          ldi temp2,(1<<SPE)|(1<<SPR1)
          out SPCR,temp2
          
          ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SPI_SlaveReceive:  out SPDR,temp1
SPI_SlaveReceive_1:  sbis SPSR,SPIF            ;Wait for reception complete
          rjmp SPI_SlaveReceive_1        ;Read received data and return
          in temp1,SPDR
          
          ret    
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
          
.include "uart-routines.asm"  



Wäre um schnelle Hilfe sehr Dankbar

P.S. Ja ich habe die SPI-Pins richtog verbunden....

Autor: Kai Franke (kai-) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn das ganze vor zwei Monaten schonmal funktioniert hat, würde ich 
mich zuerst mal fragen was ich verändert habe, dass es nicht mehr 
funktioniert.
Da würde ich als letztes im Code suchen, weil du den wohl nicht geändert 
hast...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.