softI2C oder TWI nur ein Byte ausgeben

  • 1
  • 2
  • Page 1 of 2
jomixl
Benutzer
Avatar
Gender:
Posts: 225
Registered: 02 / 2008
Subject:

softI2C oder TWI nur ein Byte ausgeben

 · 
Posted: 08.06.2021 - 11:23  ·  #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
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: softI2C oder TWI nur ein Byte ausgeben

 · 
Posted: 08.06.2021 - 13:51  ·  #2
Quote by 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
Gender:
Posts: 225
Registered: 02 / 2008
Subject:

Re: softI2C oder TWI nur ein Byte ausgeben

 · 
Posted: 08.06.2021 - 14:23  ·  #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
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: softI2C oder TWI nur ein Byte ausgeben

 · 
Posted: 08.06.2021 - 15:30  ·  #4
Quote by 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
Gender:
Posts: 225
Registered: 02 / 2008
Subject:

Re: softI2C oder TWI nur ein Byte ausgeben

 · 
Posted: 08.06.2021 - 15:44  ·  #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
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: softI2C oder TWI nur ein Byte ausgeben

 · 
Posted: 08.06.2021 - 16:56  ·  #6
Quote by 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
Attachments
Telegramm Write
Filename: 08-06-_2021_15-08-46.jpg
Filesize: 97.27 KB
Title: Telegramm Write
Information: Telegramm Write
Download counter: 121
jomixl
Benutzer
Avatar
Gender:
Posts: 225
Registered: 02 / 2008
Subject:

Re: softI2C oder TWI nur ein Byte ausgeben

 · 
Posted: 08.06.2021 - 17:58  ·  #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
Gender:
Location: Donauwörth
Age: 71
Posts: 256
Registered: 11 / 2009
Subject:

Re: softI2C oder TWI nur ein Byte ausgeben

 · 
Posted: 09.06.2021 - 06:57  ·  #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
  • 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: 15   142   157 · Page-Gen-Time: 0.032357s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI