Hallo,
Zitat Zitat von oderlachs Beitrag anzeigen
ich verstehe nicht wie dem Slave beigebracht werdenb soll, das er Daten zu Senden hat.
Im Allgemeinen wird der SS Pin dazu benutzt. Im AVR-Slave ist das ein Input und wird durch den Master-SS auf LOW gezogen. Dadurch wird die SPI HW im AVR-Slave aktiviert und kann Daten empfangen. Damit der Slave auch was Sinnvolles außer einem Nullbyte senden kann, muß ins Senderegister was hineingeschrieben werden, bevor der Master Daten sendet.

Hat der Slave ein Byte vollständig vom Master empfangen, setzt er sein SPIF Flag. Gleichzeitig mit Empfang eines Bytes vom Master hat er sein Byte zum Master geschickt.

Das SPIF kann und wird als Indikator benutzt, daß das emfangene Byte im SPDR (SPI Datenregister) zum Abholen bereit steht und dort ein weiteres Byte zum Senden abgelegt werden kann.

Das SPDR hat eine Doppelfunktion. Liest man es, bekommt man das empfangene Byte. Beschreibt man es, wird das Byte gesendet bzw. auf der Slaveseite zum Senden bereitgestellt, da ja von dort erst mit Empfang des Mastertaktes tatsächlich gesendet wird.


...wie das mit dem Empfang vom Slave im Master(Atmega32) vor sich geht. Das SPDR wird ja zum Senden beschrieben wie auch beim Empfang dann ausgelesen....Das verwirrt mich ein wenig.
Wie oben erwähnt, hat das SPDR eine Doppelfunktion. Wird es im Master beschrieben, wird der Mastertakt gestartet und das Byte gesendet. Der Slave schickt durch den Takt gleichzeitig sein Byte zum Master. Ist das Byte vom Master vollständig rausgeschickt, setzt der Master sein SPIF-Flag. Nun kann der Master das vom Slave empfangene Byte, das ja parallel zum Senden empfangen wurde, im SPDR Register abholen und sofort das nächste Byte zum Senden ins SPDR schreiben.

Eventuell geht sogar erst Schreiben und dann erst das empfangene Byte lesen. Man muß aber aufpassen, daß das empfangene Byte nicht vom nächsten Empfang überschrieben wird (durch Schreiben ins SPDR sendet der Master und gleichzeitig sendet der Slave zurück) Das empfangene Byte muß aus dem SPDR gelesen werden bevor das nächste Byte, das ja seriell eintrudelt, vollständig vom Slave eingetroffen ist.

Gruß
Searcher