softI2C oder TWI nur ein Byte ausgeben

  • 1
  • 2
  • Seite 1 von 2
jomixl
Benutzer
Avatar
Geschlecht:
Beiträge: 229
Dabei seit: 02 / 2008
Betreff:

softI2C oder TWI nur ein Byte ausgeben

 · 
Gepostet: 08.06.2021 - 11:23 Uhr  ·  #1
hallo zusammen,
ich versuche gerade ein paar Sensoren vom Typ TLI439D zu initialisieren.
Im Manuel steht das diese Sensoren per Software zu reseten sind und zwar mit folgender Sequenz:

SartCondition $ff StopCondition

Mein Problem ist jetzt:
wie kann ich mit AVRco nur ein Byte ausgeben?
Gibt es dazu undokumentierte Systemaufrufe oder muss ich das händisch machen?
Dann fällt wohl die TWI Variante aus.

Danke erstmal
Joachim
pvs-deck
PowerUser
Avatar
Geschlecht:
Alter: 54
Beiträge: 1343
Dabei seit: 02 / 2009
Betreff:

Re: softI2C oder TWI nur ein Byte ausgeben

 · 
Gepostet: 08.06.2021 - 13:51 Uhr  ·  #2
Zitat geschrieben von jomixl

hallo zusammen,
ich versuche gerade ein paar Sensoren vom Typ TLI439D zu initialisieren.
Im Manuel steht das diese Sensoren per Software zu reseten sind und zwar mit folgender Sequenz:

SartCondition $ff StopCondition

Mein Problem ist jetzt:
wie kann ich mit AVRco nur ein Byte ausgeben?
Gibt es dazu undokumentierte Systemaufrufe oder muss ich das händisch machen?
Dann fällt wohl die TWI Variante aus.

Danke erstmal
Joachim


Hallo,

ATMEGA oder XMEGA?

Brauchst Du keine Zieladresse bei den Sensoren?

Code
Function TWIout(SlaveAdr : byte; Command : byte|word [; Data]) : boolean; 
Function TWIoutTN(SlaveAdr : byte; Command : byte|word [; Data]) : boolean; // XMega


Ich finde diesen Typ TLI439D für das Datemblatt nicht. Kannst Du es mir mal senden oder den Link auf einen Datenblatt hier teilen.

Thorsten
jomixl
Benutzer
Avatar
Geschlecht:
Beiträge: 229
Dabei seit: 02 / 2008
Betreff:

Re: softI2C oder TWI nur ein Byte ausgeben

 · 
Gepostet: 08.06.2021 - 14:23 Uhr  ·  #3
hallo Thorsten,
mir ist leider ein Zahlendreher unterlaufen ...
Die Sensoren heißen TLI493D-A2B6 und sind von Infineon

https://www.infineon.com/dgdl/…4bb3673c53

auf Seite 21 im Usermanual wird der Resetvorgang beschrieben. Allerdings finde ich nirgends etwas darüber wie das mit mehreren Sensoren funktionieren soll.

Gruß joachim
pvs-deck
PowerUser
Avatar
Geschlecht:
Alter: 54
Beiträge: 1343
Dabei seit: 02 / 2009
Betreff:

Re: softI2C oder TWI nur ein Byte ausgeben

 · 
Gepostet: 08.06.2021 - 15:30 Uhr  ·  #4
Zitat geschrieben von jomixl

hallo Thorsten,
mir ist leider ein Zahlendreher unterlaufen ...
Die Sensoren heißen TLI493D-A2B6 und sind von Infineon

https://www.infineon.com/dgdl/…4bb3673c53

auf Seite 21 im Usermanual wird der Resetvorgang beschrieben. Allerdings finde ich nirgends etwas darüber wie das mit mehreren Sensoren funktionieren soll.

Gruß joachim


Hallo,

Code
Function TWIout(SlaveAdr : byte; Command : byte|word [; Data]) : boolean; 
Function TWIoutTN(SlaveAdr : byte; Command : byte|word [; Data]) : boolean; // XMega


Das Data ist optional, wenn Du nur ein Byte senden willst, lass Data einfach weg.

Wenn ich es richtig im Datenblatt sehe, z.b. beim ATMEGA
Code
// Resetvorgang 
TWIout( [SlaveAdr], $FF);
TWIout( [SlaveAdr], $FF);
TWIout( [SlaveAdr], $00);
TWIout( [SlaveAdr], $00);

Nach einen Delay 30µs kannst Du die Einstellungen senden.

Das Start und Stop wird vom AVRco Treiber automatisch gemacht.

Die I2C Adressen kannst Du via Software einstellen, wenn Du mehrere Sensoren am selben Bus hast.

Thorsten
jomixl
Benutzer
Avatar
Geschlecht:
Beiträge: 229
Dabei seit: 02 / 2008
Betreff:

Re: softI2C oder TWI nur ein Byte ausgeben

 · 
Gepostet: 08.06.2021 - 15:44 Uhr  ·  #5
hallo Thorsten,
ich befürchte das ist nicht ganz richtig, im UM steht eindeutig dass der Software Reset so ausschaut:
(S = Start, P = Stop)

S $FF P
S $FF P
$ $00 P
S $00 P

ich bräuchte also sowas wie TWIoit($ff)

So wie ich das UM verstehe erfolgt der Reset dann wohl bei allen vorhandenen Sensoren .......
Ist schon etwas eigenartig.

Gruß Joachim
pvs-deck
PowerUser
Avatar
Geschlecht:
Alter: 54
Beiträge: 1343
Dabei seit: 02 / 2009
Betreff:

Re: softI2C oder TWI nur ein Byte ausgeben

 · 
Gepostet: 08.06.2021 - 16:56 Uhr  ·  #6
Zitat geschrieben von jomixl

hallo Thorsten,
ich befürchte das ist nicht ganz richtig, im UM steht eindeutig dass der Software Reset so ausschaut:
(S = Start, P = Stop)

S $FF P
S $FF P
$ $00 P
S $00 P

ich bräuchte also sowas wie TWIoit($ff)

So wie ich das UM verstehe erfolgt der Reset dann wohl bei allen vorhandenen Sensoren .......
Ist schon etwas eigenartig.

Gruß Joachim


Hallo Joachim,

nein, glaube mir das stimmt so, das kannst Du auch ganz einfach mit einem Oszilloskop, selbst anschauen.

Die Start- / Stop-Condition, wird automatisch vom Treiber gemacht. Das sind Pausen auf der SDA.Leitung.

Die Adresse vom I2c Baustein musst Du immer verwenden, bei allen Deinen Write-CMDs. Wie soll der Sensor sonst wissen, dass er gemeint ist? Wenn es wirklich so wäre, würde er jeden Sensor an diesem Bus Rückstellen. Das kann ich mir nicht vorstellen. Klar gibt es für einige I2C Bausteine sogenannte Gemeinsame-Adressem ( ich meine die meisten haben 127 und 255), damit kann man dann alle diese Bausteine Rücksetzen oder inits machen.

Anbei das Telegrammbild aus Deinem Datenblatt.

Thorsten
Der an diesem Beitrag angefügte Anhang ist entweder nur im eingeloggten Zustand sichtbar oder die Berechtigung Deiner Benutzergruppe ist nicht ausreichend.
jomixl
Benutzer
Avatar
Geschlecht:
Beiträge: 229
Dabei seit: 02 / 2008
Betreff:

Re: softI2C oder TWI nur ein Byte ausgeben

 · 
Gepostet: 08.06.2021 - 17:58 Uhr  ·  #7
hallo Thorsten,
ich würde dir gerne glauben, manches wäre damit ja auch einfacher, aber mit dem Softwarereset ist es so wie ich es verstanden habe etwas anders.
Im UM ist es an zwei Stellen so geschrieben wie ich es geschildert habe. Vielleicht weiß ich morgen mehr ....
Zunächst mal vielen Dank für deine Mühe,

Gruß Joachim
golf
Benutzer
Avatar
Geschlecht:
Herkunft: Donauwörth
Alter: 72
Beiträge: 266
Dabei seit: 11 / 2009
Betreff:

Re: softI2C oder TWI nur ein Byte ausgeben

 · 
Gepostet: 09.06.2021 - 06:57 Uhr  ·  #8
Hallo Joachim,
ich würde das einfach selbst per Bitbang erledigen. Ich habe das selbst mal gemacht, als ich mehrere I2C-Ports gebraucht habe wegen Adresskonflikten.

so in der Art:

procedure SoftI2C1start;
begin
SSCL1:= true; udelay_1(5); //SSCL1[@PortC,0]: bit;
SSDA1:= false; udelay_1(5); //SSDA1[@PortC,1]: bit;
end;

procedure SoftI2C1writebyte(data: byte);
var
i: byte;
begin

bitz:=7; // 8 relevante Bits werden gesendet
repeat
SSCL1:= false; udelay_1(3); //
SSDA1:= bit(data,(bitz)); udelay_1(5);
SSCL1:= true; udelay_1(5);
dec (bitz);
until bitz=255;

// (ACK Phase)
SSCL1:= false; udelay_1(3); //
SSDA1:= true; udelay_1(5);
SSCL1:= true; udelay_1(5); //
SoftI2C1_Ack:= SI2C1ack; //SI2C1ack[@PinC,1]: bit;
SSCL1:= false; udelay_1(5); //

end;

procedure SoftI2C1stop;
begin
SSDA1:= false; udelay_1(5);
SSCL1:= true; udelay_1(3);
SSDA1:= true; udelay_1(5);
end;

golf
  • 1
  • 2
  • Seite 1 von 2
Gewählte Zitate für Mehrfachzitierung:   0

Registrierte in diesem Topic

Aktuell kein registrierter in diesem Bereich

Die Statistik zeigt, wer in den letzten 5 Minuten online war. Erneuerung alle 90 Sekunden.
MySQL Queries: 15 · Cache Hits: 14   141   155 · Page-Gen-Time: 0.044117s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI