Verbindung mehrerer Controler

Welche Schnittstelle: I2C oder SPI?

Gerrit
 
Avatar
 
Subject:

Verbindung mehrerer Controler

 · 
Posted: 14.09.2012 - 15:36  ·  #1
Moinsen!

Ich bin grade dabei, mehrere ATmega (32er, 16er und 8er) miteinander zu Verbinden. Dabei pollt ein Master die Slaves und soll mit diesen Daten austauschen, teilweise im Abstand von ein bis zwei Millisekunden. Die dabei jeweils übertragenen Datenmengen belaufen sich auf max. 128 Byte pro Übertragung, meist jedoch deutlich darunter (16 bis 32 Byte).

Zunächst wollte ich eigentlich alles über die I2C-Schnittstelle (also sowohl I2C als auch TWI im AVRco) abdecken, habe aber feststellen müssen, daß die Treiber (obwohl im Transparent-Modus betrieben) teilweise doch erhebliche Latenzen aufweisen und das auf dem I2C-Bus das permanente Pollen irgendwie zu Komplikationen führt.

Das Senden des Masters an die Slaves läuft dabei wie folgt:
Code

I2CLoop := 127;
Repeat 
  sDelay(30);
Until TwiOut(....) Or Not DecToLim(I2CLoop,0);
If I2CLoop > 0 Then
  //senden erfolgreich
Else
  //senden fehlgeschlagen
EndIf;


Dennoch erhalte ich (auch bei längeren Verzögerungen) Fehlerrückgaben (I2CLoop = 0).

Die Slaves schreiben ihre Daten direkt in den TwiTxBuffer und gehen dabei wie folgt vor:
Code
I2CLoop := 127;
Repeat 
Until TwiSetBusy(True) Or Not DecToLim(I2Cloop,0);
If I2CLoop>0 Then
  //Schnittstelle wurde gesperrt

  TwiTxBuffer[0] := Test; //<- nur Beispiel
  TwiSetBusy(False);
Else
  //Nicht schreiben, da Schnittstelle nicht gesperrt!
End If;


Dennoch hakelt das Ganze und ich erhalte teilweise unplausible Werte.

Ich hab mich dann auch mal mit dem SPInet-Treiber beschäftigt. Das Senden vom Master zu Slave klappt schon recht vielversprechend. Ich habe (derzeit) jedoch noch Probleme mit der Datenabfrage aus dem Slave (das will noch nicht).

Dazu habe ich mal eine grundsätzliche Frage: In dem Moment, wo ich mit SPIout beim Slave in den Ausgangspuffer schreibe (und sei es nur ein Byte) müßte der Master ja bei einer Abfrage die Antwort erhalten, daß ein Frame zur Abholung bereit steht. Nun handelt es sich bei den abzufragenden Daten jedoch um Datenstrukturen und ich habe keine direkte Möglichkeit des Treibers gefunden, die Schnittstelle des Slave solange zu sperren, bis die Übertragung in den Ausgangpuffer vollständig erfolgt ist. Nach dem Durcharbeiten der Doku bin ich aber zu der folgenden Idee gelangt:

Code
_SpiTxInp := 0;  // Anzeigen, daß keine Daten vorhanden...

//Jetzt Daten in den Ausgang schaufeln
//hier mal zur Verdeutlichung ineffektiv
//mit For/Next
For N:= 0 To xxx Do
  SpiTxBuffer[N] := SrcArr[N];
EndFor;

//Jetzt den Ausgang "freigeben"
_SpiTxOutP := 0;
_SpiTxInp:= xxx;

//Daten können jetzt vom Master abgeholt werden.


Hat da jemand Erfahrungen ob das so gehen würde oder muß ich da Seiteneffekte im Treiber befurchten, da ich damit ja dessen Schreib- und Leseroutinen umgehe.

Ich freu mich Antworten und sag schon mal im Vorwege artig "danke" ;)

Viele Grüße

G. Kuhlendahl
chefe
Benutzer
Avatar
Gender: n/a
Age: 50
Posts: 5
Registered: 07 / 2010
Subject:

Re: Verbindung mehrerer Controler

 · 
Posted: 15.09.2012 - 23:18  ·  #2
Hi Gerrit,

I2C and SPI networks don´t fit well for packet mode transfers.
I suggest you use the SLIP network.

ch
Gerrit
 
Avatar
 
Subject:

Re: Verbindung mehrerer Controler

 · 
Posted: 18.09.2012 - 20:04  ·  #3
Hi Chefe!

Thanks for your reply.

SLIP network will not fit to the pcbs (they're allready produced - but only a smal number of units). At the moment I've changed some connections between the controlers so I'm using only two instead of four - but it's only a temporary solution.

It seems to me that most of the I2C-problems occurred coupling more than two µC by I2C and using the AVRco I2C-ports (even in transparent mode) but not if you're using I2C-ICs. I'll have a closer look to that issue in two weeks.

Best regards

Gerrit
chefe
Benutzer
Avatar
Gender: n/a
Age: 50
Posts: 5
Registered: 07 / 2010
Subject:

Re: Verbindung mehrerer Controler

 · 
Posted: 19.09.2012 - 19:55  ·  #4
Hi Gerrit,
the SPI and TWI slaves must respond with lightspeed otherwise data can be lost. These slaves must run with interrupts. If another interrupt is active at this time the slave responds too late and its answer is faulty. So with packet transfers data losses are pre-programmed.
ch
mc-electronic
Benutzer
Avatar
Gender: n/a
Location: Sauerland NRW
Posts: 372
Registered: 03 / 2008
Subject:

Re: Verbindung mehrerer Controler

 · 
Posted: 20.09.2012 - 08:37  ·  #5
Hi,

I am running one I2C Master with the I2CSoft driver together with several (up to eight) 8) ATMega Slaves on an I2C Dasy Chain. The slaves use the TWI-driver in Handshake mode. This works, but the slaves sometimes hold the SCL line on permanent LO to indicate transmission errors, thus disabling the I2C Bus. So, I check for the SCL status in a 500µsec Timer1CompA Interrupt on the slave and reset the line by TWIsetReady(True); to prevent bus deadlocks. Not very nice, but effective.

And yes, everything Chefe wrote, is true. Especially the lightspeed on the slaves. It is good, to program the data transmission protocol fault tolerant.

If I could do this again, I would use a serial bus with interrupt driven buffers, i.e. RS485. Rolf had recommended this.

However, you can get it working, if you check for the bus hangers.

Cheers, Michael
rene
 
Avatar
 
Subject:

Re: Verbindung mehrerer Controler

 · 
Posted: 30.09.2012 - 23:50  ·  #6
RS485 on a single board is overkill and too expensive. Either the RS485 chips are cheap, such as a DS75176 and it takes 40mA each, or it takes very little and costs a lot more. I favour the RS422, but the priciple is the same. I recently implemented a poor man's RS422 on single pcb. There is one master, that can always send. It's TX is connected to the RX of the two slaves. Each slave has a 74sz125 single tristate buffer on it's Tx.Both buffers are connected to the Rx of the master. Upon the protocol a slave decides when to enable the Tristatebuffer and send it's data to the master.

Rene
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Verbindung mehrerer Controler

 · 
Posted: 01.10.2012 - 00:46  ·  #7
Rene,

es geht on-board noch einfacher, auch ohne tri-state Treiber.
Den Tx im UART im idle Zustand abschalten. Nur beim Senden freigeben.

rolf
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   122   136 · Page-Gen-Time: 0.028201s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI