Forum: Mikrocontroller und Digitale Elektronik Mega32/Mega8 SPI funktioniert nicht


von JÜrgen G. (Firma: 4CKnowLedge) (psicom) Benutzerseite


Lesenswert?

Hallo, schönen Nachmittag ^^

Nach etlichen Kaffeetassen und Versuchen, hab ich mich durchgerungen, 
nach diesem (wahrscheinlich) banalen Fehler zu fragen...

Ich hab folgenden Code mit Mega8 und Mega32 probiert und messe mit Oszi 
und LA genau gar nichts! Hab ich etwas übersehen?

Beide µC's auf 8MHz interner Takt gefused.
1
#include <avr/io.h>
2
3
void SPI_MasterInit(void);
4
void SPI_MasterTransmit(char);
5
6
7
void main(void)
8
{
9
  SPI_MasterInit();
10
  while(1)
11
  {
12
    SPI_MasterTransmit(0xEE);
13
14
  }
15
}
16
17
18
void SPI_MasterInit(void)
19
{
20
/* Set MOSI, SCK and /SS output, all others input */
21
DDRB = (1<<PB5)|(1<<PB7)|(1<<PB4);
22
/* Enable SPI, Master, set clock rate fck/16 */
23
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
24
}
25
26
27
void SPI_MasterTransmit(char cData)
28
{
29
/* Start transmission */
30
SPDR = cData;
31
/* Wait for transmission complete */
32
while(!(SPSR & (1<<SPIF)));
33
}

von klausy (Gast)


Lesenswert?

versuch mal:

void SPI_MasterTransmit(char cData)
{

/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));

/* Start transmission */
SPDR = cData;

}

von JÜrgen G. (Firma: 4CKnowLedge) (psicom) Benutzerseite


Lesenswert?

Nö... selbe Reaktion... gar keine...

von klausy (Gast)


Lesenswert?

muß gehn...

von JÜrgen G. (Firma: 4CKnowLedge) (psicom) Benutzerseite


Lesenswert?

klausy wrote:
> muß gehn...

Dieser Ansicht war ich bis vor kurzem auch ^^

Meine Schaltung ist Minimal: Mega32 am Steckbrett, Pullup am /Reset, GND 
und VCC überall hin und Oszi am SCK Pin.
Programmer ist abgehängt...

von klausy (Gast)


Lesenswert?

was is mit den define's der Bits? sonst ist alles korrekt...
Hardware????

von JÜrgen G. (Firma: 4CKnowLedge) (psicom) Benutzerseite


Lesenswert?

klausy wrote:
> was is mit den define's der Bits? sonst ist alles korrekt...
> Hardware????

Ja, das sollte ja nur ein Testprogramm sein, die Defines dürften an dem 
ganzen nichts ändern...

Die Hardware läuft korrekt... Ich hab zum Test mal LED's auf den Pins 
getestet...


Ich hab das ganze mal durch den Debugger (nur Simuliert) laufen 
lassen...

Dabei ist mir aufgefallen... wenn ich
1
void SPI_MasterInit(void)
2
{
3
/* Set MOSI, SCK and /SS output, all others input */
4
DDRB = (1<<PB5)|(1<<PB7)|(1<<PB4);
5
/* Enable SPI, Master, set clock rate fck/16 */
6
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
7
}

so mache, setzt mir das schreiben auf SPCR PB5(MOSI) den PIN also wird 
zum Eingang...

jetzt hab ich das ganze so:
1
void SPI_MasterInit(void)
2
{
3
4
/* Enable SPI, Master, set clock rate fck/16 */
5
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
6
7
/* Set MOSI, SCK and /SS output, all others input */
8
DDRB = (1<<PB5)|(1<<PB7)|(1<<PB4);
9
}

lt. Debugger sind jetzt zumindest mal die Datenrichtungen richtig...

EDIT: Ich habe das ganze getestet mit beiden Versionen der 
Transmit-Funktion und keines der beiden Programme zeigt Reaktion.

von tom (Gast)


Lesenswert?

Hallo Jürgen,

Tust Du so, dann sollte es gehen, ansonsten hast Du ein HW Problem :

void SPI_Init(void)
{
  uint8_t dummy;

  PORTB |= (uint8)0x20;   /* set MOSI hi */
  DDRB &= (uint8)~0x40;  /* clr bits */
  DDRB |= (uint8)0xb0;   /* 1011 SCK=O,MISO=I,MOSI=O,SS=O */
  /* setup SPI : clock = f/32 */
  /* select clock phase positive-going in middle of data */
  /* master mode, enable SPI */
  SPCR = (1<<MSTR)|(1<<SPE)|(1<<SPR1)|(1<<SPI2X);

  dummy = (SPSR); // clear status, nie verkehrt...
}

uint8_t SPI_TransferByte(uint8_t tx)
{
  uint8_t rx;

  SPDR = tx;

  // polling mode, wait for SPIF
  while((SPSR & (uint8_t)0x80) != (uint8_t)0x80);

  rx = SPDR;

return rx;
}

von JÜrgen G. (Firma: 4CKnowLedge) (psicom) Benutzerseite


Lesenswert?

Danke Tom! Ich hab mal deinen Code reingeklopft...

Anscheinend ist es wirklich ein HW Problem...

Allerdings funktioniert die ISP Schnittstelle, drum frag ich mich wieso 
nicht die SPI? Am Steckbrett kanns kaum liegen, da ich alle Messungen 
direkt an den Pins des µC durchführe...

Ein kleines Danke nochmal zwischendurch ^^

von Udo (Gast)


Lesenswert?

Hallo Jürgen,

mein Code auf einem 32 mit 16MHz Quarz sieht so aus:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <stdlib.h>
4
5
void transmit(unsigned char, char);
6
7
void Load_Low()
8
{  
9
  PORTB &= ~(1 << PB4);
10
}
11
12
void Load_High()
13
{
14
  PORTB |= (1 << PB4);
15
}
16
17
18
void SPI_MasterInit(void) {
19
20
    DDRB = (1<<PB4)|(1<<PB5)|(1<<PB7);      // set PB4(SS), PB5 (MOSI) and PB7 (SCK) output, all others input
21
22
    SPCR = (1<<SPE)|(1<<MSTR);           // enable SPI, Master, set clock rate fck/4  
23
  
24
    PORTB |= (1 << PB7)|(1 << PB4);
25
}
26
27
void transmit(unsigned char addr, char data) {
28
  
29
  SPDR = addr;                      // Start transmission
30
  while(!(SPSR & (1<<SPIF)));           // Wait for transmission complete
31
  
32
  asm volatile("nop");
33
 
34
  SPDR = data;                      // Start transmission
35
  while(!(SPSR & (1<<SPIF)));            // Wait for transmission complete
36
}
37
38
void test_Init(void)
39
{
40
  Load_Low();
41
  for (int i = 0; i < 8; i++)
42
  {
43
  transmit(0x0C,0x01);            // normal mode  transmit(0x0C,0x01);
44
  }
45
  Load_High();
46
47
int main()
48
{
49
  
50
  SPI_MasterInit();
51
  _delay_us(10);
52
  test_Init();
53
  
54
  tu was....
55
56
  while (1) { _delay_ms(10); }
57
}

Das funktioniert bei mir einwandfrei.

Gruß
Udo

von JÜrgen G. (Firma: 4CKnowLedge) (psicom) Benutzerseite


Angehängte Dateien:

Lesenswert?

Jetzt wirds schön langsam Zeit zum fluchen!

Dein Programm geht (bei mir) nicht... Das ich kein Quarz benutze dürfte 
ja nicht stören...

Im Anhang ist meine Schaltung... Ich werd mich jetzt mal mit dem JTAG 
des USBProgv3 spielen... der Simulator hat hier ziemlich wenig Sinn!

von Udo (Gast)


Lesenswert?

Hallo Jürgen,

mal ne ganz dumme Frage. Mit welchem Programm und Prommer arbeitest du?

Gruß
Udo

von JÜrgen G. (Firma: 4CKnowLedge) (psicom) Benutzerseite


Lesenswert?

Udo wrote:
> mal ne ganz dumme Frage. Mit welchem Programm und Prommer arbeitest du?

Halt ich gar nicht so dumm... AVRStudio4.12 und dem USBProgv3 vom 
Benedikt...

Appendix: Lib ist WinAVR-20071221

von JÜrgen G. (Firma: 4CKnowLedge) (psicom) Benutzerseite


Angehängte Dateien:

Lesenswert?

Wuhuuuuu es funktioniert!

Danke an Jörg Wunsch, der mir hier geholfen hat!

Im Anhang jetzt die funktionierende SPI Schnittstelle! Schuld war die 
Optimierung des Compiler (-O2) und jetzt benutze ich (-Os) und jetzt 
gehts!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Das mit der Optimierung kauf' ich dir nicht ab, aber lass uns bitte
auf avrfreaks.net weiter diskutieren, damit wir nicht zwei Threads
parallel haben.

Für alle anderen:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=423448

von Udo (Gast)


Lesenswert?

Hallo Jürgen,

eine Frage: welches Programm nutzt du zur Aufzeichnung der Daten. Ich 
meine das Bild, was du in denem letzten Beitrag eingefügt hast.

Gruß
Udo

von JÜrgen G. (Firma: 4CKnowLedge) (psicom) Benutzerseite


Lesenswert?

Hallo Udo,

Das ist die Software zum Logicport von Intronix (Logikanalysator)


lg jÜrgen

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.