www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mega8, SPI, SCK tut nichts


Autor: Markus R. (maggus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich kämpfe gerade mit dem Hardware-SPI eines Mega8. Auf der Datenleitung 
spuckt der AVR zwar was aus, allerdings bleibt die CLK-Leitung völlig 
stumm. Ich komm einfach nicht auf den fehler, die Hardware scheint 
vollkommen i.o. zu sein (muss man bei den Fusebits was beachten 
bezüglich SPI?).
MOSI = output
SCK = output

//main:
SPCR |= ((1<<SPE)|(1<<MSTR)|(1<<SPR0)); 
SPSR &= ~(1<<SPI2X);

while(1)
{
    sd_write_byte(0x53);
}



//sub:
void sd_write_byte(unsigned char byte)
{
  SPDR = byte;   //Sendet ein Byte
  while(!(SPSR & (1<<SPIF))); //Wartet bis Byte gesendet wurde
  SPDR;
}

Gruß Markus

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
im Master mode muss der SS Pin als Ausgang geschaltet sein. In deinem 
Fall PB2.

Gruß

Autor: Bensch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> im Master mode muss der SS Pin als Ausgang geschaltet sein. In deinem
Fall PB2.

Das ist falsch, siehe Datenblatt.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fabian Ostner wrote:
> im Master mode muss der SS Pin als Ausgang geschaltet sein.

Nein.
Im Master Mode ist SS einfach nur ein ganz normaler I/O-Pin.

Autor: Markus R. (maggus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit dem SS-Pin habe ich auch schon alles mögliche ausprobiert, aber 
daran liegts nicht (egal ob Ausgang oder Eingang, low oder high).

DDRB |= ((1<<PB1) | (1<<PB2) | (1<<PB3) | (1<<PB5));
PORTB |= ((1<<PB2));      // SS auf 1
PORTB &= ~(1<<PB1);

PB1 soll mal CS werden, spielt beim jetzigen Problem aber noch keine 
Rolle.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void sd_write_byte(unsigned char byte)
{
  SPDR = byte;   //Sendet ein Byte
  while(!(SPSR & (1<<SPIF))); //Wartet bis Byte gesendet wurde

  SPDR; //<<<--- was soll das bezwecken? Weg damit.
}

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da die Herren so aufs Datenblatt pochen, hier ein kleiner Ausschnitt für 
euch:

>If SS is configured as an output, the pin is a general output pin which >does not 
affect the
>SPI system. Typically, the pin will be driving the SS pin of the SPI Slave.
>If SS is configured as an input, it must be held high to ensure Master SPI 
>operation.

Also falls Eingang muss er High gehalten werden, für Master mode. 
Sinnfrei für Master Betrieb. Also auf Ausgang schalten.

Gruß

Autor: Markus R. (maggus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@holger

Das ist dazu da, um das SPIF Flag zu clearen, wenn ich es weglasse 
wackelt der SCK Pin allerdings trotzdem nicht.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Das ist dazu da, um das SPIF Flag zu clearen, wenn ich es weglasse
>wackelt der SCK Pin allerdings trotzdem nicht.

  SPDR = byte;   //Sendet ein Byte

macht das auch schon. Es wird also auch beim schreiben
in SPDR gelöscht.

Kannst du SCK als einfachen IO-Pin noch toggeln?

Autor: Markus R. (maggus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Kannst du SCK als einfachen IO-Pin noch toggeln?

Nein geht nich. Selbst wenn ich den SPI ausschalte (SPE = 0) kann ich 
den pin nicht toggeln.

while(1)
{
  PORTB ^= (1<<PB5);
  _delay_us(2);
}

mit PB1 z.B. geht die Sache aber.
Woran liegt das?

Es ist übrigens ein ATmega8L8 @3,0V 4mhz, falls das was zur Sache tut.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Kannst du SCK als einfachen IO-Pin noch toggeln?

>Nein geht nich. Selbst wenn ich den SPI ausschalte (SPE = 0) kann ich
>den pin nicht toggeln.
>Woran liegt das?

Kurzschluss auf der Leitung?

Autor: Markus R. (maggus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Kurzschluss auf der Leitung?

Nein, habs grade nochmal durchgemessen.

Auf einem Mega162 @5V 8mhz(interner osc) wackelt der SCK Pin brav bei 
gleichen Registereinstellungen.

Autor: Michael K. (mmike)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch mal nen anderen Pin wackeln zu lassen und schau's Dir auf dem 
Scope an. Prüf auch mal die Einstellungen beim kompilieren (richtiger 
Controller ausgewählt, ...). Mit was wird denn kompiliert? Winavr, 
AVRStudio?

Poste auch mal den kompletten Quellcode.

Autor: Markus R. (maggus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie gesagt, wenn ich z.B. PB1 wackeln lasse funktioniert das gut, es 
gibt auch ein sauberes Rechteck auf dem Scope.

Hier mal der komplette code für den Mega8:
#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>
#include <util/uart_mega.h>



void sd_write_byte(unsigned char byte);




int main(void)
{  
  DDRB |= ((1<<PB2) | (1<<PB3) | (1<<PB5));
  PORTB |= (1<<PB2);      // SS auf 1
  
  uart_init();
  
  SPCR |= ((1<<SPE)|(1<<MSTR)|(1<<SPR0)); //Enable SPI, SPI in Master Mode, presc = 16

  
  _delay_ms(100);  
  
  while(1)
  {
    sd_write_byte(0x53);
    _delay_us(10);
  }
}


void sd_write_byte(unsigned char byte)
{
  SPDR = byte;   //Sendet ein Byte
  while(!(SPSR & (1<<SPIF)));  //Wartet bis Byte gesendet wurde
}

Compiler ist WinAVR, geflasht wird mit PonyProg.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du direkt am Chip gemessen oder irgendwo
auf der Platine? Vieleicht steckt das Beinchen
ja nicht im Sockel, oder falls SMD, gar nicht angelötet.

Autor: Markus R. (maggus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, hab jetzt noch 2 andere ATmega8L-8PU getestet, einer mit internem 
OSC und einer mit externem Quartz, diese funktionieren mit exakt dem 
gleichen Code wunderbar. Die Fusebits sind auch gleich.
Ich nehme also an, dass genau dieser eine AVR wohl (teilweise?) kaputt 
ist...

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.