mikrocontroller.net

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


Autor: JÜrgen Grieshofer (Firma: 4CKnowLedge) (psicom) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <avr/io.h>

void SPI_MasterInit(void);
void SPI_MasterTransmit(char);


void main(void)
{
  SPI_MasterInit();
  while(1)
  {
    SPI_MasterTransmit(0xEE);

  }
}


void SPI_MasterInit(void)
{
/* Set MOSI, SCK and /SS output, all others input */
DDRB = (1<<PB5)|(1<<PB7)|(1<<PB4);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}


void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
}

Autor: klausy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
versuch mal:

void SPI_MasterTransmit(char cData)
{

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

/* Start transmission */
SPDR = cData;

}

Autor: JÜrgen Grieshofer (Firma: 4CKnowLedge) (psicom) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nö... selbe Reaktion... gar keine...

Autor: klausy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
muß gehn...

Autor: JÜrgen Grieshofer (Firma: 4CKnowLedge) (psicom) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: klausy (Gast)
Datum:

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

Autor: JÜrgen Grieshofer (Firma: 4CKnowLedge) (psicom) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
void SPI_MasterInit(void)
{
/* Set MOSI, SCK and /SS output, all others input */
DDRB = (1<<PB5)|(1<<PB7)|(1<<PB4);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}

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

jetzt hab ich das ganze so:
void SPI_MasterInit(void)
{

/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);

/* Set MOSI, SCK and /SS output, all others input */
DDRB = (1<<PB5)|(1<<PB7)|(1<<PB4);
}

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.

Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: JÜrgen Grieshofer (Firma: 4CKnowLedge) (psicom) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ^^

Autor: Udo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jürgen,

mein Code auf einem 32 mit 16MHz Quarz sieht so aus:
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>

void transmit(unsigned char, char);

void Load_Low()
{  
  PORTB &= ~(1 << PB4);
}

void Load_High()
{
  PORTB |= (1 << PB4);
}


void SPI_MasterInit(void) {

    DDRB = (1<<PB4)|(1<<PB5)|(1<<PB7);      // set PB4(SS), PB5 (MOSI) and PB7 (SCK) output, all others input

    SPCR = (1<<SPE)|(1<<MSTR);           // enable SPI, Master, set clock rate fck/4  
  
    PORTB |= (1 << PB7)|(1 << PB4);
}

void transmit(unsigned char addr, char data) {
  
  SPDR = addr;                      // Start transmission
  while(!(SPSR & (1<<SPIF)));           // Wait for transmission complete
  
  asm volatile("nop");
 
  SPDR = data;                      // Start transmission
  while(!(SPSR & (1<<SPIF)));            // Wait for transmission complete
}

void test_Init(void)
{
  Load_Low();
  for (int i = 0; i < 8; i++)
  {
  transmit(0x0C,0x01);            // normal mode  transmit(0x0C,0x01);
  }
  Load_High();

int main()
{
  
  SPI_MasterInit();
  _delay_us(10);
  test_Init();
  
  tu was....

  while (1) { _delay_ms(10); }
}

Das funktioniert bei mir einwandfrei.

Gruß
Udo

Autor: JÜrgen Grieshofer (Firma: 4CKnowLedge) (psicom) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: Udo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jürgen,

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

Gruß
Udo

Autor: JÜrgen Grieshofer (Firma: 4CKnowLedge) (psicom) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: JÜrgen Grieshofer (Firma: 4CKnowLedge) (psicom) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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&f...

Autor: Udo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: JÜrgen Grieshofer (Firma: 4CKnowLedge) (psicom) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Udo,

Das ist die Software zum Logicport von Intronix (Logikanalysator)


lg jÜrgen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.