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.
Hallo Tanja, du darfst MISO und MOSI nicht kreuzen, außerdem fehlt Slave Select. Jürgen
Stimmt MISO und MOSI kreuze ich demfall nicht. Braucht es den Slave select wirklich, denn bei meinem Board ist der Anschluss nicht rausgeführt ???
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
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.
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.
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.
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.