Forum: Mikrocontroller und Digitale Elektronik SPI-Empfangen


von ppunkt (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin noch anfänger, und möchte per SPI auf ein EEPROM 
(25LC64)zugreifen.
Aber leider funktionierte es nicht so ganz(Das Empfangen). Ich habe 
immer 0x00 empfangen.
Das senden klappt, habe dafür ein 74hc595 zum testen genommen.

Um fehler in der verdrahtung oder am EEPROM auszuschließen, habe ich den 
Atmega 16 auf das AVR-NET-IO montiert, und versucht auf den ENC28j60 
zuzugreifen, weil das der einzige andere spi chip ist, den ich habe von 
dem ich 100%ig weiß das er funktioniert.

Nun gut, jedenfalls funktioniert es auch da nicht(das empfangen), und 
auf dem net io kann ich ja verdrahtungsfehler eigentlich ausschließen, 
um den code zu prüfen. Wie gesagt es soll ja eigentlich für den 25lc 
werden.
Die per Spi empfangenen daten werden an port c ausgegeben, an dem leds 
hängen, da der reine code vom tutorial auch nichts brachte, habe ich die 
befürchtung das evtl mein eeprom defekt sein kann..

Kann jemand vieleicht einen Blick auf meinen angehängten code werfen, 
und mir sagen was ich falsch gemacht habe? Habe versucht mich bei den 
Code an das AVR-Tutorial der seite mikrocontroller.net zu halten.

hier der haupcode, unterroutinen sind im anhang:
1
.equ F_CPU = 16000000  ; Systemtakt in Hz
2
.equ BAUD  = 1200    ; Baudrate 
3
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)
4
5
.def temp1      = r16    ; SPI
6
.def temp2      = r17    ; SPI
7
.def temp3      = r18    ; SPI
8
.def temp      = r19    ; für temp vorgänge
9
.def zeichen    = r20    ; uart, zeichen
10
11
.equ SCHIEBE_DDR  = DDRB    ; Pinbelegung für SPI festlegen
12
.equ SCHIEBE_PORT  = PORTB
13
.equ RCK      = PB4    ; SS
14
.equ SCK      = PB7    ; SCK
15
.equ SIN      = PB5    ; MOSI
16
.equ SOUT      = PB6    ; MISO
17
18
; Konfiguaration / Initialisieren
19
  ; Sonstiges zum Start
20
  ldi    r16, 0xff
21
  out    DDRC, r16
22
  out    PORTC, r16        ; LED Test
23
  ldi    r16, 0x00        
24
  mov    r0 ,r16          ; R0   = 0x00
25
26
27
  ; Stackpointer initialisieren
28
  ldi    temp1, LOW(RAMEND)    ; HIGH-Byte der obersten RAM-Adresse
29
    out     SPL, temp1
30
    ldi    temp1, HIGH(RAMEND)    ; LOW-Byte der obersten RAM-Adresse
31
    out    SPH, temp1
32
  ;ldi     temp, HIGH(RAMEND)
33
    ;out     SPH, temp
34
    ;ldi     temp, LOW(RAMEND)
35
    ;out     SPL, temp
36
37
38
  
39
  ; Baudrate für UART einstellen
40
    ldi     temp, HIGH(UBRR_VAL)
41
    out     UBRRH, temp
42
    ldi     temp, LOW(UBRR_VAL)
43
    out     UBRRL, temp
44
45
46
  ; UART Control und Status Register konfigurieren
47
    ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
48
    out     UCSRC, temp        ; Asyncron, 1-Bit, 8-Bit, UCPOL 0
49
  sbi     UCSRB,TXEN        ; TX - Einschalten
50
  
51
  
52
  ; SCK, MOSI, SS als Ausgänge schalten
53
    in    temp1, SCHIEBE_DDR
54
    ori   temp1, (1<<SIN) | (1<<SCK) | (1<<RCK) 
55
    out   SCHIEBE_DDR,temp1
56
57
  
58
  ; SPI Modul konfigurieren
59
    ldi   temp1, (1<<SPE) | (1<<MSTR)
60
    out   SPCR, temp1           ; keine Interrupts, MSB first, Master
61
                                ; CPOL = 0, CPHA =0
62
    ldi   temp1, (1<<SPI2X)    ; SCK Takt = 1/2 XTAL
63
    out   SPSR, temp1           ; double speed aktivieren
64
    out   SPDR, temp1           ; Dummy Daten, um SPIF zu setzen
65
; Ende Initialisierung  
66
; Start Lesen von SPI-Slave
67
  ; MIT ENC28J60 reden
68
  ldi    temp1, 0xFF      ; Reset Senden
69
  rcall  Schiebe        ; Daten schieben
70
    rcall  SchiebeOut      ; Daten in Ausgangsregister übernehmen
71
  
72
73
          ldi  R29, 0xC7      ; Mindestens 300 µs warten nach Reset
74
Warten0:  ldi  R30, 0x25      ; (hier ca. 300ms)
75
Warten1:  ldi  R31, 0xD9
76
Warten2:  dec  R31
77
          brne Warten2
78
          dec  R30
79
          brne Warten1
80
          dec  R29
81
          brne Warten0
82
83
84
  ldi    temp1, 0x1E      ; Read Controll Register ECON2 - Befehl -
85
    rcall  Schiebe        ; Daten schieben
86
    rcall  SchiebeOut      ; Daten in Ausgangsregister übernehmen
87
      
88
      ldi  R29, 0xFF    ; Kurz warten
89
Warten3:
90
      dec  R29
91
      brne Warten3
92
93
    rcall   schiebe_eingang    ; Einlesen
94
  out    PORTC, temp1    ; Ausgabe der Eingelesen daten
95
  
96
  loop:            
97
  rjmp  loop          ; Endlosschleife -Ende-
98
99
  .include "uart.asm"
100
  .include "spi.asm"

Danke für eure hilfe peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.