Atmega64 SPI Problem

OP #962481
Hi *,

ich bin langsam am verzweifeln, mein SPI am mega64 will keine Bits 
ausspucken (SCK/MOSI kein signal am Ozsi). PORTB ist komplett als Out 
konfiguriert, mein SPCR=0x0b01011000, SPSR=0x00.

Ich kann in SPDR genau ein Byte reinschreiben, dann geht er nach 
"while(!(SPSR & 0b1000000))" eins weiter, aber danach will SPIF nicht 
mehr auf eins gehen und das Programm bleibt hängen.

Die SPI Fuse ist auf enabled gesetzt, sonst könnte ich ja nix reinladen. 
Aber ich hab nirgendwo gesehen, dass ich mit der Fuse enabled das SPI im 
regulären Betrieb nicht benutzen kann...

Gibts da sonst noch Fallstricke?

Danke
OP #962502
Du hast natürlich recht :) ist schon spät.... here comes:
1
#include <mega64.h>
2
#include <delay.h>
3

4
void main(void) {
5
PORTA=0x00; //DEBUG LEDS
6
DDRA=0xFF;
7

8
PORTB=0x00; //SPI PORT
9
DDRB=0xFF;
10

11
TIMSK=0x00;
12
ETIMSK=0x00;
13

14
SPCR=0x0b01011000;
15
SPSR=0x00;
16

17
while (1) {
18
  PORTA = 0xFF; //LEDs aus
19
  SPDR = 0x40;
20
  while(!(SPSR & (1<<8))) {}
21
  PORTA.0 = 0; //1. LED an
22
  delay_ms(1000);
23
  SPDR = 0xA1;
24
  while(!(SPSR & (1<<8))) {}
25
  PORTA.1 = 0; //2. LED an
26
  delay_ms(1000);
27
};
28
}

ich messe hier mir dem oszi an SCK und MOSI, aber da rührt sich (außer 
beim Programmieren) nichts. Wohl aber ändert SCK die Ruhepolarität, wenn 
ich die Polarität im SPCR ändere. Er kommt aus der ersten While Warte 
Schleife nicht raus, und ich kann mir nicht erklären, weshalb. Quarz ist 
16MHz, Compiler ist CodeVision, neueste Version.

Hab ich etwas übersehen?

Danke.
Gast #962515
>MISO darf nicht als Ausgang gesetzt werden, nur SS, MOSI und SCK.

Bei MasterMode ist kann und sollte der als Ausgang geschaltet sein.

ich vermute folgendes:
1
while (1)
2
{
3
  SPDR = 0x40;
4
  while(!(SPSR & (1<<8)));
5

6
  delay_ms(1000);
7

8
  SPDR = 0xA1;
9
  while(!(SPSR & (1<<8)));
10
  delay_ms(1000);
11
}
lt deinen Einstelungen sendest du mit clk/4. ergibt bei 16MHz eine 
Sendedauer von 2µsek!
Und das wird alle 1'000'000µsek  gesendet! Das ist ohne geeignete 
Triggerung nicht "zu finden".
Vorschlag:
Lass mal beide Delays weg, somit müsste der einfach die zwei Bytes 
rausblasen.
Fehler im Code finde ich nicht. Mal abgesehen, dass man einiges schöner 
schreiben kann:
1
while(!(SPSR & (1<<SPIF)));
2
...
OP #962522
> Das ist ohne geeignete Triggerung nicht "zu finden".
hab ein tds 2014, das findet alles =)

Egal, hier war der Fehler:
1
while(!(SPSR & (1<<SPIF)));
kennt codevision nicht.
1
 while(!(SPSR & (1<<8)));
verursachte einen deadlock
1
 while(!(SPSR & 0b1000000));
tut jetzt und mit timebase 1us schön sichtbar :)

Danke euch und gn8
#962523
>>MISO darf nicht als Ausgang gesetzt werden, nur SS, MOSI und SCK.
>Bei MasterMode ist kann und sollte der als Ausgang geschaltet sein.

Hm, du meinst wohl eher Eingang, wenn wir von MISO im Mastermode 
sprechen ?
Wie auch immer, im Datenblatt heist es dass MISO sowieso fest auf 
Eingang geschaltet wird wenn der SPI Mastermode aktiviert wird. Der Rest 
(MOSI, SCK und SS) sind "user defined" und sollten auf Ausgang 
geschaltet werden, was er auch schön getan hat.

>ich messe hier mir dem oszi
Da würde ich mich mal Matthias anschließen. Dieser Peak-Tech Logic-Probe 
(früher sagte man da mal Logiktester) tut für sowas hervorragende 
Dienste, weil du damit auch sehr kurze Impulse sichtbar machen kannst.
#962525
Tja, mein Betrag war ein paar Sekunden zu spät um sinnvoll zu sein :-)
1
while(!(SPSR & (1<<8)));

Hoppla, da fällt es mir wie Schuppen von den Haaren. 1<<8 ist das neunte 
Bit, aber SPSR hat nur 8 :-)

Das hier sollte es dann tun:
1
while(!(SPSR & (1<<7)));
#962595
Christoph Söllner wrote:
> ich messe hier mir dem oszi an SCK und MOSI, aber da rührt sich (außer
> beim Programmieren) nichts.
Wieso ändert sich beim Programmieren was an MOSI? Du hast doch nicht 
etwa den ISP-Anschluss an MOSI und MISO angeschlossen? Wenn dem so wäre, 
dürftest Du den µC allerdings überhaupt nicht programmieren können.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.