Atmega64 SPI Problem

OP #962481
Lesenswert?

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
Lesenswert?

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
Lesenswert?

>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
Lesenswert?

> 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
Lesenswert?

>>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.
#962595
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren