Forum: Mikrocontroller und Digitale Elektronik SPI Anschluss und Programmierung


von Tanja H. (hoefme)


Angehängte Dateien:

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.

von Jürgen S. (starblue) Benutzerseite


Lesenswert?

Hallo Tanja,

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

Jürgen

von Tanja H. (hoefme)


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 ???

von Peter D. (peda)


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

von Tanja H. (hoefme)


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.

von Andreas K. (a-k)


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.

von Rudolph R. (rudolph)


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.

von Ralph (Gast)


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.

von Tanja H. (hoefme)


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?

von Steffen A. (stigmer)


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

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.