mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI Anschluss und Programmierung


Autor: Tanja Hofmann (hoefme)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Versuche eine Kommunikation zwischen 2 Atmega128 via SPI herzustellen. 
Nun meine erste Frage ist:

>> Kann ich einfach die zwei Atmega128 gemäss Bild verbinden?




Die zweite Frage:

>> Möchte einfach über den Master Daten zum Slave senden. Kann ich den Master und 
Slave gemäss Datenblatt beispiel initalisieren?

//----------------------------------------------------
//Master----------------------------------------------

void SPI_MasterInit(void)
{
/* Set MOSI and SCK output, all others input */
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
/* 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)))
;
}


//----------------------------------------------------
//Slave-----------------------------------------------

void SPI_SlaveInit(void)
{
/* Set MISO output, all others input */
DDR_SPI = (1<<DD_MISO);
/* Enable SPI */
SPCR = (1<<SPE);
}
char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1<<SPIF)))
;
/* Return data register */
return SPDR;
}




Respektive müsst jetzt im Main Progamm über den Master was senden und 
den Slave via Polling überprüfen, gehts so oder?


Besten dank für eure Hilfe.

Autor: Jürgen S. (starblue) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Tanja,

du darfst MISO und MOSI nicht kreuzen, außerdem fehlt Slave Select.

Jürgen

Autor: Tanja Hofmann (hoefme)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt MISO und MOSI kreuze ich demfall nicht. Braucht es den Slave 
select wirklich, denn bei meinem Board ist der Anschluss nicht 
rausgeführt ???

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tanja Hofmann wrote:
> Stimmt MISO und MOSI kreuze ich demfall nicht. Braucht es den Slave
> select wirklich, denn bei meinem Board ist der Anschluss nicht
> rausgeführt ???

Ja, sonst weiß der Slave ja nicht, wann ein Byte aufhört und das nächste 
beginnt.


Peter

Autor: Tanja Hofmann (hoefme)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin jetzt verwirrt....... was heisst das jetzt konkret? Braucht man den 
SS (Slave Select) zwingen um daten vom master zu empfangen oder geht es 
auch ohne SS?

Danke für die anwtort.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn der Slave eine Slave-Select Leitung hat, dann muss man die 
bedienen, sonst fühlt er sich nicht angesprochen.

Wenn der Slave keine Slave-Select Leitung hat, dann funktioniert es 
offensichtlich auch ohne und man muss die nicht vorhandene Leitung auch 
nicht bedienen.

Autor: Rudolph R. (rudolph)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Select brauchst Du bei SPI immer für jeden angeschlossenen Slave.
Edit: nun ja, kommt vermutlich auf den Slave drauf an, wenn es nur einen 
einzigen Slave gibt.

Welchen Pin am Master man dafür benutzt ist egal.
Am Slave macht der spezielle SS-Pin die Sache ein wenig einfacher.

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Slaveselect ist zwingend wenn mehr als ein Slave angeschlossen ist.
Mit nur einem Slave hängt es von der SPI implementierung der hardware 
ab, ob der SS benötigt wird oder nicht ( Konfigurationseinstellungen in 
den Registern).
Falls der SS beim ATMEGA benötugt wird, sollte es reichen den PIN fest 
auf HIGH oder LOW zu legen ( im Datenblatt nachsehen ob High oder Low 
aktiv).

Ob ein Byte komplett übertragen ist wird nicht am SS erkannt sondern an 
der Anzahl der Takte.
Es wird im Register die Anzahl der zu übertragenden BIT eingestellt. 
Sobald diese Anzahl erreicht ist, ist das Byte vollständig.
Damit ist es auch möglich Daten mit zb 5 bit zu übertragen. Dies wird 
jedoch nicht unbedingt von allen µC unterstützt ==> Datenblatt lesen.

Autor: Tanja Hofmann (hoefme)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe noch ein Problem mit dem Master bei der SPI. Zwar wenn ich den 
Master folgendermassen initalisiere ergibt sich beim SPI_SCK kein 
Rechtecksignal. Habe auch versucht den SS auf 0 oder 1 zu setzten ändert 
jedoch nichts.

Hier mein Code:

//----------------------------------------------------------------
#include <avr/io.h>

void spi_master_init(void)
{

  DDRB |= 0x07;    // SS,SCK and MOSI output
  PORTB &= 0xFE;  // SS=0
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0);    // init SPI
}


int main(void)
{
  spi_master_init();
  sei();

  while(1);
  return(0);
}

//------------------------------------------------------------------

Weiss jemand an was das liegt, denn eigentlich müsste ich auf dem 
Ausgang: SCK einen Rechteck gemäss SPCR einstellungen Messen. Das heisst 
bei mir fosc/4. (7372800Hz/4) Müsst demfall eine Frequenz von 1,8Mhz 
messen nicht oder mache ich eine total falsche Überlegeung?

Autor: Steffen A. (stigmer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

was macht diese "sei()" Funktion?

Wenn ich es richtig erinnere, wird der Clock Ausgang nur dann und 
automatisch getrieben, wenn auch tatsächlich eine Übertragung 
stattfindet. Ich kenne es so, dass man Daten ins SPI-Datenregister 
schreibt um den Sendevorgang auszulösen.

Mein Vorschlag: Deine Initialisierung sieht OK aus, also einfach ein 
paar Bits in einer Endlosschleife ins Datenregister schreiben (quasi 
Dauersenden, da kommt die Clock in Wallung) und dann hoffentlich am Clk 
Ausgang lustige Rechtecke messen.

Gruß
Steffen

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.