Forum: Mikrocontroller und Digitale Elektronik SPI an ATmega8515L funktionier nicht


von mbuchman (Gast)


Lesenswert?

Hallo!

Ich hab in cvavr ein kleines programm geschrieben, das einfach ein byte 
über das spi senden soll.

Ich hab das oszi nun auf sck, miso, mosi gehängt aber man sieht nur 1en 
takt auf der sck leitung. Dann wird sofort der SPI transfer complete 
interrupt ausgelöst. Ich weis leider nicht was daran falsch sein kann, 
zumal es im datenblatt auch nicht viel anders steht.
hier der code:

SPCR = 0xDE; //Master, 125 kHz, Clock:cycle start, polarity: high,msb 
first
SPSR = 0x00;

dann wird das spi interrupt flag gelöscht:

#asm
   in r30, spsr
   in r30, spdr
#endasm

dann schriebe ich das zu sendende byte in das datenregister:

SPDR = 0x0f;

mit dem schreiben der daten in das spi datenregister wird die 
übertragung gestartet, es gibt jedoch nur 1en einzigen clock auf der 
leitung.

Danke für eure Hilfe!

von Michael (Gast)


Lesenswert?

hallo.

vielleicht hilft dir das weiter (datenblatt seite 131):

"If SS is configured as an input, it must be held high to ensure Master 
SPI operation. If the SS pin is driven low by peripheral circuitry when 
the SPI is configured as a Master with the SS pin defined as an input, 
the SPI system interprets this as another Master selecting the SPI as a 
Slave and starting to send data to it. To avoid bus contention, the SPI 
system takes the following actions:
1. The MSTR bit in SPCR is cleared and the SPI system becomes a Slave. 
As a
result of the SPI becoming a Slave, the MOSI and SCK pins become 
inputs."

es wäre evtl. sinnvoll, SS auch noch ans oszi zu hängen.

gruß

michael

von mbuchman (Gast)


Lesenswert?

danke für den tip - ss is bei mir ein output und auf +3.3V. am oszi sehe 
ich da auch keine änderung.
Ich hätte da noch eine andere frage:
ich möchte aus einem slave daten lesen. dazu sende ich vorher ien 
command byte. aber wie bringe ich meinen controller dazu noch 8 takte zu 
senden, um die daten aus dem slave zu clocken un zu empfangen?

von Ralph (Gast)


Lesenswert?

Wie groß hast du die zu übertragende Datenlänge eingestellt ?
SPI kann auch eine Datenlänge von 1 (BIT) bis zu 16 (Bit), hängt vom µC 
ab was geht.

Wenn du ein Byte übertragen willst muss die Datenlänge auf 8 stehen.

Soll nach dem Commandbyte eine antwort kommen, dann musst du vom Master 
ein Dummybyte senden. Nur der Master taktet den SPI Bus.

von mbuchman (Gast)


Lesenswert?

ich glaub der uc kann nur 8 bit.
das mit dem dummybyte hab ich versucht - also ich hab einfach nochmal 
0x00 in das SPDR geschrieben - am oszi sehe ich auch die takte, aber vom 
slave kommt nichts...

von Ralph (Gast)


Lesenswert?

Hat der Slave denn schon sein Datenbyte ins Schieberegister gelegt , 
wenn du das Dummybyte sendest ?

von mbuchman (Gast)


Lesenswert?

sollte er - laut datenblatt sollte das lesen der daten immerhin mit 
50MHz funktionieren - mein takt liegt bei 125kHz. oder sehe ich das 
falsch?

von Ralph (Gast)


Lesenswert?

Du bekommst auf dem Slave den Datenempfangen IRQ; dann musst du dort das 
Commandobyte auswerten und das entsprechende Antwortbyte ins 
Schieberegister legen, das dauert seine Zeit.
Was machst du auf dem Master ?  Dort schickst du das Dummybyte direkt 
nach dem Commandobyte, stimmts ?

Um das zu lösen brauchst du eine Synchronisation zwischen den beiden 
Micros.

dazu gibt es zwei Möglichkeiten.
1. der Master wartet nach de, senden des 1. Bytes eine gewisse Zeit, in 
der sichergestellt ist, das der Slavemicro den IRQ abgearbeitet hat und 
das Datenbyte im Sendebuffer liegt.

2. Du verwendest eine zusätzliche Hardwareverbindung zwischen den beiden 
Micros. Das Busy signal. Mit diesem Signal kann der Slave den Master 
anhalten bis er fertig ist, und gibt dann den Master frei, der darauf 
hin den Dummy sendet.

Ein SPI Bus besteht aus mindestend 3 Signalen ; Clock, MISO,MOSI; und 
aus zwei optionalen Signalen ; Chipselect CS und Busy.
direktion    Master   Slave
Clock        Output   Input
MOSI         Output   Input
MISO         Input    Output
CS           Output   Input
Busy         Input    Output

Sollte dein µC die optionalen Signale nicht per Hardware unterstützen , 
musst du das in SOftware mit IO PIN's erledigen.


von mbuchman (Gast)


Lesenswert?

also der slave ist kein controller sondern ein serielles flash.
es gibt noch die leitungen CS Hold(zum anhalten der verbindung) und WP 
(writeprotect)
es sieht im moment so aus:
egal was ich aus dem slave lesen möchte (statusbyte, hersteller id, 
usw..)
die MISO leitung bleibt solange high, bis vom slave die antwort kommen 
sollte. dann wird sie auf low gezogen (allerdings alle 8 takte lang) 
d.h. ich lese immer 8 nullen, obwohl zumindest bei der hersteller id 
eine zahl (20h) zu lesen sein müsste.

kann das am spi bus liegen oder liegt es eher am slave?

von mbuchman (Gast)


Lesenswert?

so ich hab jetzt was rausgefunden: wenn ich die MISO leitung vom 
ontroller trenne, und den takt reinschicke, kommen die daten raus.
sobald ich die leitung am controller wieder anschließe, bekomm ich immer 
ein high, außer da wo die daten kommen sollten bekomm ich 8 nullen.
woran kann das noch liegen?

von Ralph (Gast)


Lesenswert?

Bist du sicher das du MISO am µC als Input configuriert hast ?
Ist ein Pullup/Pulldown in der Leitung, externer oder interner im µC ?

von mbuchmann (Gast)


Lesenswert?

danke - ich hab das problem gefunden - die masseleitung zum testboard 
war gebrochen.

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.