Hallo AVR-Gemeinde,
ich habe da zwei Fragen, ich muss eine Kommunikation zwischen zwei
Atmega88 Mikrocontrollern realisieren, unter C. Die USART Schnittstellen
der beiden Atmega88 werden bereits verwendet (senden permanent Daten).
Ich hab schon mal geschaut, da würde sich die I2C Schnittstelle
wahrscheinlich empfählen.
Meine Fragen dazu sind:
Wie sollte ich die Master/Slave Einstellung machen, oder welche
Einstellung muss man durchführen?
Laufen USART und I2C parallel oder sequentiell ab? Da der Datenfluss bei
USART nicht unterbrochen werden darf
Vielleicht könnte mir dabei jemand helfen?
Danke im Voraus
Gruß Bobo
> Ich hab schon mal geschaut, da würde sich die I2C Schnittstelle> wahrscheinlich empfählen.
Nimm SPI.
> Laufen USART und I2C parallel oder sequentiell ab?
Der UART und die TWI-Interface (SPI, I2C) sind Hardwarekomponenten, da
läuft alles unabhängig von der Software. Nur das jeweils nächste Datum
(= Einzahl von Daten) muß in das entsprechende Senderegister eingetragen
werden.
BTW: kommt
> empfählen
von Pfahl?
Lothar Miller schrieb:
>> Ich hab schon mal geschaut, da würde sich die I2C Schnittstelle>> wahrscheinlich empfählen.> Nimm SPI.
Nimm auf keinen Fall SPI!
Die AVRs haben nur ein arme-Leute SPI ohne Sendepuffer.
D.h. Du wirst Dir die Haare raufen und trotzdem Bytes verlieren.
Das I2C ist ideal, da es ein Handshake über SCL macht, Datenverluste
sind daher ausgeschlossen. Der Bus wartet immer auf den langsamsten
Teilnehmer.
Das Multimaster-I2C hat beim AVR leider einen Bug, daher mach den einen
zum Master und den anderen zum Slave.
Das I2C sollte zumindest beim Slave als Interrupt gemacht werden.
Peter
> Die AVRs haben nur ein arme-Leute SPI ohne Sendepuffer.
Schade, eigentlich :-(
Aber das wird durch den fehlenden Empfangspuffer mehr als ausgeglichen
;-)
Aus dem 88er Datenblatt:
The system is single buffered in the transmit direction and double
buffered in the receive direction.
This means that bytes to be transmitted cannot be written to the SPI
Data Register before
the entire shift cycle is completed. When receiving data, however, a
received character must be
read from the SPI Data Register before the next character has been
completely shifted in. Otherwise,
the first byte is lost.
Peter Dannegger schrieb:
> Das Multimaster-I2C hat beim AVR leider einen Bug, daher mach den einen> zum Master und den anderen zum Slave.> Das I2C sollte zumindest beim Slave als Interrupt gemacht werden.
Hast du hähere Informationen darüber? In den ATmega88-Errata findet sich
nix darüber.
Gerade der Multimaster-Mode ist nämlich sehr interessant für Netzwerke:
Jeder µC ist Master (Client) und kann was an einen anderen Teilnehmer
senden, der daruch zum Slave (Server) wird um den Request zu
beantworten.
Johann
Johann L. schrieb:
> Hast du hähere Informationen darüber? In den ATmega88-Errata findet sich> nix darüber.http://www.robotroom.com/Atmel-AVR-TWI-I2C-Multi-Master-Problem.html> Gerade der Multimaster-Mode ist nämlich sehr interessant für Netzwerke:
Stimmt.
Ich hatte sowas mal mit Philips-MCs aufgebaut und es hat einwandfrei
funktioniert. Aber als Philips zu NXP wurde, hat man viele 8051-er
abgekündigt und dann hab ich auf AVRs umgestellt.
Hat ziemlich lange gedauert, eh die Software wieder lief.
Peter
Oder nen Mega 164/324/644P nehmen, da kann man die beiden UARTs auch
wahlweise im SPI Mode betreiben und hat dann Sende- und Empfangsbuffer.
Sind ja auch nicht wesentlich teurer, machen aber das timing bei vielen
Int Quellen wesentlich entspannter.
Mikki Merten schrieb:
> Oder nen Mega 164/324/644P nehmen, da kann man die beiden UARTs auch> wahlweise im SPI Mode betreiben und hat dann Sende- und Empfangsbuffer.
Das nützt bloß nix, die UART kann kein Slave-SPI.
Und der Slave ist es ja, der genau nur einen halben SCK-Takt Zeit hat,
um das nächste Byte in das Schieberegister zu schreiben.
Peter
Stimmt, leider können die UART nur SPI Master. Da hat man wohl nicht
ganz bis zu Ende gedacht, selbst beim Xmega mit gibt`s beim UART nur SPI
Master Mode.
Mikki Merten schrieb:
> selbst beim Xmega mit gibt`s beim UART nur SPI> Master Mode.
Ich hätte jetzt gedacht, der XMEGA hat DMA?
Da sollte es doch möglich sein, im SPI-Slave z.B. 100 Byte Sendepuffer
anzulegen und der DMA packt dann das nächste Byte sofort ins
Senderegister, sobald ein Byte fertig ist.
D.h. der Master kann die 100 Byte ohne Delay abholen, bzw. neue 100 Byte
zum Slave senden.
Man muß sich dann nur noch ein Protokoll ausdenken, damit der Slave
vorher weiß, wieviel Byte er für den DMA vorbereiten muß.
Im einfachsten Fall eine konstante Paketlänge, z.B. 16 Byte.
Peter
Danke schon mal für eure ganzen Beiträge. Das Problem ist das ich den
Atmega88 verwenden muss und die Pins RXD und TXD werden permanent
angesteuert, also fallen die schonmal weg. Ich muss nun parallel zu den
empfangen daten über die USART noch andere Daten empfangen können und
darum die Frage ob das über die I2C Schnittstelle geht???
Lg
Eine eigene Frage?
Dieser Thread ist über 17 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.