Mikrocontroller und Digitale Elektronik
›
Thread
SPI Datenübertragung
AC
A. C.
(michael1988)
OP
27.01.2008 20:16
#764086
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: 1 .include "m8def.inc"
2
3 .def temp1 = r16
4 .def temp2 = r17
5
6 .equ Bereit = 4 ;Gibt Status von COntroller an("Bereit"=Gesetzt->Controller
7 .equ ZentBef = 5 ;EINGANG:Hierhin sendet Zentrale seine Befehle zur Verteilung
8 ;(weg schicken;her holen;nix machen);muss global deklariert werden
9
10 .equ DD_SS = 2 ;Mit DD_SS des Slave verbunden
11 .equ DD_MOSI = 3 ;Mit DD_MISO des Slave verbunden
12 .equ DD_MISO = 4 ;Mit DD_MOSI des Slave verbunden
13 .equ DD_SCK = 5 ;Mit DD_SCK des Slave verbunden
14
15 .equ vary = 4
16 .equ DDR_SPI = DDRB
17 .equ PORT_SPI = PORTB
18
19 ldi temp1,LOW(RAMEND)
20 out SPL,temp1
21
22 ldi temp1,HIGH(RAMEND)
23 out SPH,temp1
24 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
25 rcall SPI_MasterInit
26 loop: sbi PORTB,DD_SS
27 ldi temp1,'r'
28 rcall SPI_MasterTransmit
29 rjmp loop
30 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
31 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32 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
33 out DDR_SPI,temp2 ;Enable SPI, Master, set clock rate fck/16
34 ldi temp2,(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0)
35 out SPCR,temp2
36 ret
37 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
38 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
39
40 SPI_MasterTransmit: cbi PORT_SPI,DD_SS
41
42 out SPDR,temp1 ;Start transmission of data (temp1)
43 Wait_Transmit: sbis SPSR,SPIF ;Wait for transmission complete
44 rjmp Wait_Transmit
45 in temp1,SPDR
46
47 sbi PORT_SPI,DD_SS
48 ret
49 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Und Hier der des Slaves: 1 .include "m8def.inc"
2
3 .def temp1 = r16
4 .def transZ = r20
5 .def temp2 = r17
6 .def receiZ = r21
7
8
9 .equ DD_SS = 2 ;Mit DD_SS des Slave verbunden
10 .equ DD_MOSI = 3 ;Mit DD_MISO des Slave verbunden
11 .equ DD_MISO = 4 ;Mit DD_MOSI des Slave verbunden
12 .equ DD_SCK = 5 ;Mit DD_SCK des Slave verbunden
13
14 .equ vary = 4
15 .equ DDR_SPI = DDRB
16
17 ldi temp1,LOW(RAMEND)
18 out SPL,temp1
19
20 ldi temp1,HIGH(RAMEND)
21 out SPH,temp1
22 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
23 ldi r16,0xff
24 out DDRD,r16
25
26 ;ldi r16,0xff
27 ;out PORTD,r16
28 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
29 rcall uart_init
30 rcall SPI_SlaveInit
31 loop: rcall SPI_SlaveReceive
32 rcall uart_send
33 rjmp loop
34 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
35 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
36 SPI_SlaveInit: ldi temp2,(1<<DD_MISO) ;Set MISO output, all others input
37 out DDR_SPI,temp2 ;Enable SPI
38 ldi temp2,(1<<SPE)|(1<<SPR1)
39 out SPCR,temp2
40
41 ret
42 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
43 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
44 SPI_SlaveReceive: out SPDR,temp1
45 SPI_SlaveReceive_1: sbis SPSR,SPIF ;Wait for reception complete
46 rjmp SPI_SlaveReceive_1 ;Read received data and return
47 in temp1,SPDR
48
49 ret
50 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
51
52 .include "uart-routines.asm"
Wäre um schnelle Hilfe sehr Dankbar
P.S. Ja ich habe die SPI-Pins richtog verbunden....
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
Bitte melde dich an, um einen Beitrag zu schreiben.
Noch kein Account?
Die Registrierung ist kostenlos und dauert nur eine Minute.
Jetzt registrieren