xMega und TWI / I2C

  • 1
  • 2
  • 3
  • Page 1 of 3
tramike
 
Avatar
 
Subject:

xMega und TWI / I2C

 · 
Posted: 06.12.2011 - 02:44  ·  #1
Hallo allerseits!

Ich habe etwas Pech mit meiner Schaltung. Ich habe 2 Temperatursensoren LM73 und ein Accelerometer MMA8451Q an einem TWI_C eines XMEGA256A3.

Leider kann ich mit dem TWI_C die LM73 nur 8bit lesen, bei 16bit kommt immer "False". Soweit ich gesehen habe, haben LM7x Probleme mit dem TWI, also nehme ich den I2C.

Nun habe ich aber das Phänomen, dass der MMA8451Q nur via TWI_C überhaupt antwortet, mit dem I2C antwortet er nicht mal auf ein "hallo". Keine Ahnung wieso. Geschwindigkeitsprobleme kann ich ausschliessen, ob schnell oder langsam es bleibt so in allen Varianten. Auch elektrisch sieht das Signal gut aus, Die Pullups haben 4k7 Ohm.

Soweit so mühsam. Nun beginnt aber des eigentliche Problem.
Um die Register des MMA8451Q zu lesen, muss (nach der Device-Adresse) zuerst die Register-Adresse geschrieben werden und dann (ohne Stop-Condition!) mit einer Repeated Start Condition das Register gelesen werden. Im Datenblatt ist das detailliert beschrieben und es steht explizit:

Quote
The MMA8451Q expects repeated STARTs to be used to randomly read from specific registers.

(Solche Details liest man erst, wenn alles fixfertig gelötet ist...)

So wie ich das verstanden habe, kann weder TWI_n noch I2C repeated STARTs auslösen bzw. eine Operation ohne STOP condition durchführen.

Hat irgend jemand Ideen?
Ich fürchte ich muss selber eine Implementierung direkt mit den TWI-Registern machen. Ist das mit vernüntigem Aufwand ohne Assembler machbar? Hat jemand Erfahrungen damit?

Danke und Gruss,
Mike
tramike
 
Avatar
 
Subject:

Re: xMega und TWI / I2C

 · 
Posted: 18.03.2012 - 15:58  ·  #2
Hallo allerseits,

leider hat sich das Problem noch nicht gelöst.
Gibt es bei TWI_n und/oder I2C Treiber für xMega in naher Zukunft weitere Möglichkeiten bzw. mehr Flexibilität, so dass z.B. mit LM7x kommuniziert werden kann oder mit repeated STARTs gearbeitet werden kann?

Besten Dank und Gruss,
Mike
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2133
Registered: 03 / 2003
Subject:

Re: xMega und TWI / I2C

 · 
Posted: 18.03.2012 - 19:35  ·  #3
Hi Mike,

ich hab in letzter Zeit 2 Schaltungen mit dem LM73 aufgebaut. Bei der einen funktionierte der LM mit dem TWIMaster ohne Probleme und bei der anderen hab ich nach ein paar Tagen den LM raus geschmissen und eine OP-Schaltung mit PT1000 an einen analogen Eingang gehängt, da ich alle 2...3 Messungen keine Temperatur messen konnte. Allerdings ist in der Schaltung ein Mega644 drin. Woran das gelegen hat weiß ich bis heute noch nicht. Evtl. war der LM zu nahe (max 10mm Leiterbahn) am µC ?

Ohne Nachkommastellen:
Code

Procedure Messung;                     { LM73 auslesen}
  Var LoTemp, HiTemp : Byte;
      NegValue       : Boolean;
      LMStatus       : Boolean;
  Begin
    TWIOut(LM73Adr,$00);               { Register 0 }
    LMStatus:=TWIInp(LM73Adr,HiTemp,LoTemp);
    If (HiTemp and $80) = $80          { negativ ?}
      then
        NegValue:=true;
        HiTemp:=not HiTemp;
      else
        NegValue:=false;
      EndIf;
    AirTemp:=((Integer(HiTemp)*256)+Integer(LoTemp)) SHR 7;
    If NegValue=true
      then
        AirTemp:=AirTemp*(-1);
      EndIf;
    If LMStatus=false                  { Reset wenn LM73 nicht auslesbar}
      then
        System_Reset;
      EndIf;
  End Messung;


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

Re: xMega und TWI / I2C

 · 
Posted: 19.03.2012 - 18:00  ·  #4
Hallo Mike,

es ist leider nicht ohne weiteres möglich die TWIs/I2Cs auf das etwas exotische Format umzustellen. Ein riesen Aufwand der mindestens momentan nicht machbar ist. Sorry.

rolf
tramike
 
Avatar
 
Subject:

Re: xMega und TWI / I2C

 · 
Posted: 20.05.2012 - 23:56  ·  #5
Hallo allerseits,

die Sache ist noch nicht ausgestanden.

wenn ich TWIInpC() auf einem XMega verwende, fallen mir zwei Dinge auf:
  • Es wird nie eine Stop-Condition gesendet.
  • Lese ich ein Word (=2 Bytes), dann werden zwei einzelne Byte-Lese-Operationen auf dem Bus durchgeführt.

Es wird also 2x eine Start-Condition gesendet und 2x die Adresse. ...und wie gesagt nie eine Stop-Condition. Richtig wäre 1x Start-Condition, 1x Adresse senden, 2x Byte empfangen, Stop-Condition.

Beispiel-Code:

Code
Program Test;
Device = XMega256A3U, VCC=3.3;

Import SysTick, Heap, XMegaSupport, SerPortE0, TWI_C;

From System Import Float, Processes, Tasks, Pipes;

Define
  OSCtype        = extXTAL=16000000, PLLmul=8, prescA=1, prescB=2, prescC=1;

  StackSize      = $0800, iData;
  FrameSize      = $0800, iData;
  SysTick        = 10;                {msec}

  TWIprescC      = TWI_BR100;

  SerPortE0      = 57600, Stop1, timeout;
  RxBufferE0     = 250, iData;
  TxBufferE0     = 250, iData;

  Heap           = iData;
  Scheduler      = 10, 10, iData;
  TaskStack      = $0020, iData;
  TaskFrame      = $0010;

Implementation
{$IDATA}
Const
  I2CAddrTemp1: Byte = $49;
Var
  I2CWVal: Word;
Begin
  Start_Processes($87);
  Loop
    WriteLn(SerOutE0, '------------');
    If TWIstatC(I2CAddrTemp1) Then
      TWIOutC(I2CAddrTemp1,$00);
      TWIInpC(I2CAddrTemp1,I2CWVal);
      WriteLn(SerOutE0, 'I2C $00: '+IntToHex(I2CWVal));
    Else
      WriteLn(SerOutE0,'I2C NotOK');
    EndIf;
    Sleep(self, 50);
  Endloop;
End Test.


Als Resultat erhalte ich 2x dasselbe (Lo) Byte vom Temperatur-Sensor, statt den 16-Bit wert.
Zudem ist der Bus "verklemmt"; weil nach dem Lesen nie eine Stop-Condition kommt. sind die Bausteine "verwirrt".

Der Output des I2C-Analyzer ist im Anhang.

@Harry: Ich nehme an, Du hast den LM73 nicht mit einem xMega gelesen.
Das kann unmöglich funktioniert haben...

Danke für jede Hinweise,
Gruss,
Mike
Attachments
TWI_C
Filename: TWIC.JPG
Filesize: 36.67 KB
Title: TWI_C
Download counter: 206
tramike
 
Avatar
 
Subject:

Re: xMega und TWI / I2C

 · 
Posted: 21.05.2012 - 01:22  ·  #6
...und hier gleich noch der passende Fehler:

Code

SYSTEM.TWIRECVBYTEC:
                      
[...]
SYSTEM._L0078:
                      LDS      _ACCA, TWICMASTERDATA
                      ST Z+,   _ACCA
                      SBIW     _ABBLO, 1
                      BREQ     SYSTEM._L0079
                      LDI      _ACCA, 02h // Befehl zum Daten lesen
                      STS      TWIMASTERCTRLC, _ACCB 
// => sollte wohl _ACCA sein, statt _ACCB?
                      RJMP     SYSTEM.TWIRECVBYTEC
SYSTEM._L0079:
                      LDI      _ACCA, 07h // NACK und STOP
                      STS      TWIMASTERCTRLC, _ACCB 
// => sollte wohl _ACCA sein, statt _ACCB?
                      LDI      _ACCA, 050
SYSTEM._L0080:
                      DEC      _ACCA
                      BRNE     SYSTEM._L0080:
                      LDI      _ACCA, 0FFh
                      RET



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

Re: xMega und TWI / I2C

 · 
Posted: 21.05.2012 - 13:49  ·  #7
Hallo Mike,

danke für die Infos. Es ist mir absolut schleierhaft weshalb meine Tests trotzdem funktioniert haben.
Ich schicke einen Patch via PM zum testen.

rolf
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: xMega und TWI / I2C

 · 
Posted: 23.10.2013 - 11:45  ·  #8
Hallo,
ich möchte mit einem XMega (I2C Master) aus einem Chip mit I2C Schnittstelle lesen.
Das Lesen aus dem Chip (I2C Slave) ist jedoch nur mit einem "Repeated Start" möglich:

Read Format:
Start | Chipaddress Write | Ack by Slave| Subaddress High | Ack by Slave| Subaddress Low | Ack vom Slave | Repeated Start | Chipaddress Read | Ack by Slave | Byte1 by Slave| Ack by Master |Byte2 by Slave| Ack vom Master | Byte3 | Stop |

Werden die TWI Treiber in Zukunft das Lesen in dieser Form unterstützen?

Werden TWI Slave Modes beim XMEGA in Zukunft unterstützt? Wenn ja, wann?

Gruß
Thomas
  • 1
  • 2
  • 3
  • Page 1 of 3
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: 16 · Cache Hits: 15   137   152 · Page-Gen-Time: 0.038625s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI