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:
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:
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:
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
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;
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.
//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