Kopplung von 2 ATMega per I2CSoft Master und TWI Slave

  • 1
  • 2
  • Page 1 of 2
mc-electronic
Benutzer
Avatar
Gender: n/a
Location: Sauerland NRW
Posts: 372
Registered: 03 / 2008
Subject:

Kopplung von 2 ATMega per I2CSoft Master und TWI Slave

 · 
Posted: 23.03.2012 - 11:59  ·  #1
Hallo Leute,

um ein bestehendes ATMega 2561 Gerät zu erweitern, möchte ich per I2C Bus einen 2. ATMega 644 ankoppeln. Der ATMega 2561 hat einen I2CSoft Bus als Master, an den ich den ATMega 644 als TWI (NICHT I2CSoft) Slave im Handshake-Modus mit der Slave-Adresse 2 anbinde.

Wenn der Master den Slave per I2CStat(2) abfragt, meldet der sich auch brav. Einen Schreibbefehl vom Master mit I2COut(2,$AA); kann ich auch korrekt absetzen - es wird auch erkannt, ob der Slave bereit ist (je nach TWIsetRDY).

Soweit, so gut. Was nicht klappt, ist das Erkennen auf dem Slave, daß ein Kommando geschickt wurde. Weder TWIGetRxStat, noch TWIgetTXStat oder TWIgetRDY ändern ihren Status, auch TWIgetCMD liefert keinen Wert.

Was mache ich da auf dem Slave falsch??

Michael

[code]program VTest_644;
// This is a Test-Project for the I2C Slave Mode
//
{ $NOSHADOW} // auskommentieren, damit die Register ALLE gesichert werden.
{ $NOSAVE}
{ $WG}                     {global Warnings off}
{ $W+}

Device = mega644, VCC=5;

Define_Fuses            
  Override_Fuses;       
  LockBits0      = [];
  FuseBits0      = [SUT1];
  FuseBits1      = [SPIEN, EESAVE];
  FuseBits2      = [BODLEVEL2];
  ProgMode       = SPI;

{ $BOOTRST $0000}         {Reset Jump to $0000}

Import SysTick, BeepPort, RTclock, Watchdog, TWISlave, SerPort;

From System Import Float, Pipes;

Define
  ProcClock      = 14745600; 
  SysTick        = 10;             {msec}
  StackSize      = $080, iData;
  FrameSize      = $0200, iData;
  
  Serport        = 9600, Stop1, TimeOut;
  SerPortDTR     = PinB, 3, Negative;
  SerPortDSR     = PortD, 7, Negative;

  RxBuffer       = 16, iData;
  TxBuffer       = 16, iData;

  RTClock        = iData, DateTime;{Time, DateTime}
  RTCsource      = SysTick;

  WatchDog       = msec2000;
  BeepPort       = PortA,4;

  TWIbuffer   = 128, iData;
  TWIaddr     = 2;
//  TWImode     = Transparent;    {Transparent or HandShake}
  TWImode     = Handshake;    {Transparent or HandShake}

Implementation
{$EEPROM}
StructConst

{$IDATA}
{--------------------------------------------------------------}
{ Const Declarations }
const
   gVersionStr    : String = 'I2C Slave V1.x';
{--------------------------------------------------------------}
{ Type Declarations }
type

{--------------------------------------------------------------}
{ Var Declarations }
Var
   RxBuff         : array[0..254] of byte;
   TxBuff         : array[0..254] of byte;
   RxPtr          : Pointer;
   TxPtr          : Pointer;
{--------------------------------------------------------------}

{ Main Program }
{$IDATA}
Var
   lLW : LongWord;
begin
   InitPorts;

   TWIsetGC(false);
   TWIsetslaveAddr(2);
   EnableInts;
   TWISetRDY(True);

   Writeln (SerOut, 'RESET');
   WriteLn(SerOut, gVersionStr);

   loop
      WriteLn (SerOut, 'RxStat: '+BoolToStr(TWIgetRxStat));
      WriteLn (SerOut, 'TxStat: '+BoolToStr(TWIgetTxStat));
      WriteLn (SerOut, 'RdyStat: '+BoolToStr(TWIgetRdy));
      WriteLn (SerOut, 'CMD: '+ByteToStr(TWIgetCMD));

      mDelay(2000);

   endloop;
end VTest_644.
[/code]
mc-electronic
Benutzer
Avatar
Gender: n/a
Location: Sauerland NRW
Posts: 372
Registered: 03 / 2008
Subject:

Re: Kopplung von 2 ATMega per I2CSoft Master und TWI Slave

 · 
Posted: 23.03.2012 - 17:43  ·  #2
Hallo Leute,

bin ein Stück weiter gekommen. Das Problem liegt auf dem Master-Atmega: Dort schicke ich die Daten wie folgt ab:
...
If I2CStat(2) Then
I2COut(2,1,123); // 123 kommt auf dem Slave in RxBuffer[1] nicht an
EndIf;

Dann kommt auf dem Slave nichts an. Wenn ich jedoch die I2CStat(2) Abfrage weglasse, geht es. Es geht auch, wenn ich I2CStat(2) zweimal abfrage.

...
//If I2CStat(2) Then
I2COut(2,1,123); // So geht es
//EndIf;

oder
...
If I2CStat(2) And I2CStat(2) Then
I2COut(2,1,123); // So geht es auch!!
EndIf;

Besonders den letzteren Fall verstehe ich nicht.

Irgendwer eine Idee, was das Problem sein könnte???

Michael
golf
Benutzer
Avatar
Gender:
Location: Donauwörth
Age: 71
Posts: 256
Registered: 11 / 2009
Subject:

Re: Kopplung von 2 ATMega per I2CSoft Master und TWI Slave

 · 
Posted: 23.03.2012 - 18:13  ·  #3
Hallo Michael,
Idee habe ich auch keine, aber ich selbst nutze immer nur I2COut (ohne I2CStat ) zum TWI-Slave und hatte bisher keine Probleme damit.

golf
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2133
Registered: 03 / 2003
Subject:

Re: Kopplung von 2 ATMega per I2CSoft Master und TWI Slave

 · 
Posted: 26.03.2012 - 11:51  ·  #4
Hallo Michael,

ich habe zwei Mega32 per TWIMaster/Slave verbunden und keine Probleme. Allerdings habe ich die Verbindung mit Handshake nie zum laufen gebracht. Nur Transparent.

gruss
Harry
mc-electronic
Benutzer
Avatar
Gender: n/a
Location: Sauerland NRW
Posts: 372
Registered: 03 / 2008
Subject:

Re: Kopplung von 2 ATMega per I2CSoft Master und TWI Slave

 · 
Posted: 26.03.2012 - 13:13  ·  #5
Hallo Harry / Golf,

inzwischen bin ich ein bischen weiter: Das Problem scheint der I2CStat auf dem Master zu sein. Die Kommunikation läuft, wenn

1. kein I2CStat auf dem Master benutzt wird - oder wenn -
2. I2CStat 2 x hintereinander aufgerufen wird (siehe mein Beispiel oben) - oder wenn -
3. I2CStat 1 x aufgerufen wird, danach ein I2COut an das Gerät ohne Daten erfolgt und dann ein erneuter Output mit den Daten folgt.

Dann läuft die Kommunikation sauber. Wenn ich I2CStat nur 1 x aufrufe, hängt sich der ganze I2C Bus am Master früher oder später auf, es ist auch zu den anderen Chips am I2C Bus des Master keine Kommunikation mehr möglich.

Mir erscheint Lösung 2 noch am erfolgversprechendsten, da ich dann wenigstens den Status des TWISlave abfragen kann. Seltsam ist das Verhalten schon. Das Einsetzen von Delays (hatte Gunter früher mal vorgeschlagen) hat auch nicht geholfen.

Michael
mc-electronic
Benutzer
Avatar
Gender: n/a
Location: Sauerland NRW
Posts: 372
Registered: 03 / 2008
Subject:

Re: Kopplung von 2 ATMega per I2CSoft Master und TWI Slave

 · 
Posted: 26.03.2012 - 15:02  ·  #6
@ Rolf:

Mit den oben genannten Work-Arounds läuft jetzt die I2C/TWI Kommunikation in beide Richtungen. Ein letztes Problem ist das Zurücklesen von Strings durch den Master. Das Handbuch sagt hierzu, daß das LängenByte des zu sendenden Strings die Anzahl der gelesenen Bytes steuert. So funktioniert das bei mir aber nicht, ich muß auf dem Master in ein festes Array einlesen, das geht. Der Input mit einem String dagegen gibt bei I2CInp ein False zurück - funktioniert also nicht.

Habe ich einen Fehler gemacht oder muß ich sonst noch etwas beachten? Oder klappt das Lesen der Strings mit dem Längenbyte doch nicht so wie im Handbuch angegeben?

Michael

Beispiel:
[code]
Var
   lStr1 : String[50]; 
   lStr1Arr[@lStr1] : Array[0..50] Of Char;
Begin
... // Hier Anforderung der Daten per I2COut..., dann:

 If I2CInp(SlaveAdr,lStr1) Then     // geht nicht!! Gibt Inp NOK zurück
  WriteLn(SerOut, lStr1+' - Inp OK ');
Else
  WriteLn(SerOut,'Inp NOK ');
EndIf;

// So dagegen geht es, allerdings werden dann wohl immer 50 Byte gelesen..

If I2CInp(2,lStr1Arr) Then
  WriteLn(SerOut, lStr1+' - Inp OK ');
Else
  WriteLn(SerOut,'Inp NOK ');
EndIf;
[/code]
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Kopplung von 2 ATMega per I2CSoft Master und TWI Slave

 · 
Posted: 26.03.2012 - 17:59  ·  #7
Hallo Michael,

sorry, ich habe mit dem I2C/TWI Master/Slave System seit Jahren nicht mehr gearbeitet. Ich muss gestehen ich habe keine Ahnung mehr davon. Sie wissen jetzt schon mehr darüber als ich :'(

Ich bevorzuge allemal das UART SLIP System mit RS485 gegenüber dem I2C/TWI. Ist viel schneller, sicherer und flexibler. Auf kurze Entfernung (wenige cm) kann man hier auch auf jeglichen Treiber (RS485/RS232) verzichten.

rolf
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2133
Registered: 03 / 2003
Subject:

Re: Kopplung von 2 ATMega per I2CSoft Master und TWI Slave

 · 
Posted: 26.03.2012 - 21:24  ·  #8
Hallo Michael,

hier mal mein Code - vielleicht hilft dir das was (ich habe mich übrigens geirrt: ich arbeite mit dem TWINet) :

Master:
Code

        TWInode        = $01;
        TWIpresc       = TWI_BR100;
        TWIframe       = 16,iData;
        TWInetMode     = Master;

Const
  TWIslv          : Byte = $10;

Var
  TWIState          : tTWInetState;

Function WriteTWIData(Size:Byte):Boolean;
  Var WriteOK  : Boolean;
  Begin
    WriteOK:=false;
    Repeat
      TWIState:=GetTWIslaveStat(TWIslv);
      If [TWIrxEmpty] in TWIState
        then
          WriteOK:=TWItxFrame(TWIslv,Size);
        EndIf;
      Until WriteOK=true;
      sDelay(10);
    Return(WriteOK);
  End WriteTWIData;


Slave:
Code

  TWInode        = $10;                     { Adresse                          }
  TWIpresc       = TWI_BR100;               { Speed                            }
  TWIframe       = 16, iData;               { Datenframe                       }
  TWInetMode     = Slave;                   { Modus                            }

Procedure Main;
  Begin
    If TWIrxStatReg=$FF
      then
        ComIn;
        TWIrxClear;
      Endif;
    If TWIrxStatReg in [$80..$FE]
      then
        Inc(ErrorCounter);
        gDrawString(114,5,1,1,TxtRot0,IntToStr(ErrorCounter:5));
        TWIrxClear;
      EndIf;

  End Main;


Die Funktion ComIn verarbeitet dann die übertragenen Daten.

Soweit ich mich erinnern kann hatte ich damals Probleme und bin deswegen auf den TWINet gegangen. Übertragung über bis 3m langes USB-Kabel mit bis zu 400 kHz. Bisher sind mir keine Probleme gemeldet worden. Ich steuere damit ein grafisches LCD mit eigenem µC mit einem anderen µC an.

gruss
Harry
  • 1
  • 2
  • Page 1 of 2
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   135   149 · Page-Gen-Time: 0.031269s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI