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