mikrocontroller.net

Forum: Compiler & IDEs SPI in Gang bringen / überoptimiert?


Autor: CAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute, ich wollte jetzt mal die SPI-SChnittstelle in Gang bringen 
und habe ein kleines Testprogramm aus meinem Projekt extrahiert. Es soll 
einfach permanent ein Byte (0x95) per SPI senden. Der Code compiliert 
aber zu 0 Byte - warum?

//Bibliotheken
#include <avr/io.h>
#include <stdint.h> // damit man uint8_t verwenden kann

//für SPI:
#define DDR_SPI  DDRB
#define PORT_SPI PORTB
#define MOSI   2
#define MISO   3
#define SCK     1
#define SS     4 // eigentlich 0, aber ich will es selbst steuern

//Variable
static uint8_t dummy;

//Funktionen
int main(void);
static uint8_t SPI_Transfer(uint8_t sByte);
static void SPI_MasterInit(void);

//Hauptprogramm
int main(void)
{
  SPI_MasterInit();

  while(1)
  {
    dummy=SPI_Transfer(0x95);
  }
}

void SPI_MasterInit(void)
{
  // Set MOSI, SCK and SS output, MISO Input
  DDR_SPI |= (1<<MOSI)|(1<<SCK)|(1<<SS);
  DDR_SPI &= ~(1<<MISO);
  //from datasheet
         SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}

uint8_t SPI_Transfer(uint8_t sByte)
{
  SPDR = sByte;
  while(!(SPSR & (1<<SPIF)));
  return SPDR;
}

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe den Code mal compiliert. (ATMEGA8 und AVR-Studio)

das Ergebnis:
Program:     120 bytes (1.5% Full)
(.text + .data + .bootloader)

Data:          0 bytes (0.0% Full)
(.data + .bss + .noinit)

Build succeeded with 0 Warnings...

Also alles vollkommen in Ordnung.

Gruß
Frank

Autor: CAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich schäme mich! Ich hab nur bei data.. geguckt, weil mein Fenster so 
eingestellt war..

Aber mein eigentliches Problem: An PB1 (SCK) müßte ich doch jetzt mit 
dem Oszi was sehen, oder? Es tut sich nichts.. (permanent LOW, sieht 
aus, als wär es gar nicht als Ausgang beschaltet..)

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das war doch was mit SS? Es muss entweder OUT sein oder immer HIGH, 
ansonsten flutscht der SPI in Slave-Mode.

Johann

Autor: CAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verstehe es zwar nicht (ich aktiviere die SPI ja als Master), aber 
auch wenn ich SS als Ausgang definiere, ändert sich nichts.

Also ich hab folgende Zeile ergänzt

#define SSPLUS   0

und in der SPI_MasterInit geschrieben

DDR_SPI |= (1<<MOSI)|(1<<SCK)|(1<<SS)|(1<<SSPLUS);


es clockt einfach nicht..


Hat evtl. jemand ein funktionierendes Mini-Programm?

Autor: CAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
arrrrgh! Jetzt geht es. Es lag wirklich an diesem Pin (SS muß Ausgang 
sein) Ich hab außerdem wiedermal vergessen, daß man trotz "neues 
Projekt" immer noch den alten Hexfile zum Programmieren drinstehen hat 
bei AVR Studio.. *das nervt..*

Aber wo steht das mit dem SS Pin? (nur mal interessehalber)..

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Datenbatt -> SS Pin Functionality -> Master Mode:
When the SPI is configured as a master (MSTR in SPCR is set), the user
can determine the direction of the SS pin.

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. If the SS pin is driven low by peripheral circuitry when the SPI
is configured as a master with the SS pin defined as an input, the SPI
system interprets this as another master selecting the SPI as a slave and
starting to send data to it.

Autor: CAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah ja.. danke! Da hatte ich wohl bisher zufällig immer Glück.. :-)

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.