xMega und TWI / I2C

  • 1
  • 2
  • 3
  • Seite 3 von 3
miparo
Schreiberling
Avatar
Geschlecht:
Herkunft: Germany
Alter: 59
Beiträge: 987
Dabei seit: 09 / 2007
Betreff:

Re: xMega und TWI / I2C

 · 
Gepostet: 24.10.2013 - 19:01 Uhr  ·  #17
Hallo Thomas,
wenn ich das mal noch wüsste aber es könnte sein, da man ja nur selten LESEN muss .
In der Regel wird ja nur geschrieben.

Gruß
miparo
Thomas.AC
Benutzer
Avatar
Geschlecht: keine Angabe
Alter: 44
Beiträge: 308
Dabei seit: 07 / 2013
Betreff:

Re: xMega und TWI / I2C

 · 
Gepostet: 11.11.2013 - 12:21 Uhr  ·  #18
zur Info: zwischenzeitlich konnte ich den Lesezugriff über folgende Funktion realisieren.
Kritik ist Willkommen!

var twitimeout : SysTimer8;

{-------------------------------------------------------------------------------
TWICombinedRead
input parameters:
DEVADR : 7-bit I2C Device Address
subaddress : subaddress
pdata : location for the read data
bytesToRead : bytes to read
-------------------------------------------------------------------------------}
function twiCombinedRead (
DEVADR : byte;
subaddress : Word;
pData : pointer;
bytesToRead : byte
) : boolean;
begin


SetSysTimer(twitimeout,2); //

// Reset TWIE
TWIEMASTERCTRLA := $00;
TWIEMASTERCTRLA := $08;
TWIEMASTERSTATUS := $FD; // clear all flags, force bus state = idle;

// write I2C address Byte +RW = 0
TWIEMASTERADDR := DEVADR shl 1;
repeat
until Bit(TWIEMASTERSTATUS, 6) or isSysTimerZero(twitimeout); // wif?
if TWIEMASTERSTATUS <> $62 then // return, if incorrect STATUS
Return (false);
endif;

// write subaddress
TWIEMASTERDATA := HI(subaddress); // write highbyte subaddress
repeat
until Bit(TWIEMASTERSTATUS, 6) or isSysTimerZero(twitimeout); // wif?
if TWIEMASTERSTATUS <> $62 then // return, if incorrect STATUS
Return (false);
endif;
TWIEMASTERDATA := LO(subaddress); // write lowbyte subaddress
repeat
until Bit(TWIEMASTERSTATUS, 6) or isSysTimerZero(twitimeout); // wif
if TWIEMASTERSTATUS <> $62 then // return, if incorrect STATUS
Return (false);
endif;

// bytesToRead?
if bytesToRead = 0 then
TWIEMASTERCTRLC := $07; // stop
Return(true);
endif;

// read first byte (read access with repeated start condition)
TWIEMASTERADDR := (DEVADR shl 1) or $01; // write I2C address + R/W = 1
repeat
until Bit(TWIEMASTERSTATUS, 7) or isSysTimerZero(twitimeout); // rif?
if TWIEMASTERSTATUS <> $A2 then // return, if incorrect STATUS
Return (false);
endif;
pData^++ := TWIEMASTERDATA;
dec(bytesToRead);

// read next bytes
while bytesToRead > 0 do
TWIEMASTERCTRLC := $02; // ack + read more byte
repeat
until Bit(TWIEMASTERSTATUS, 7) or isSysTimerZero(twitimeout); // rif?
if TWIEMASTERSTATUS <> $A2 then // return, if incorrect STATUS
Return (false);
endif;
pData^++ := TWIEMASTERDATA;
dec(bytesToRead);
endwhile;

// send stop condition
TWIEMASTERCTRLC := $07;
Return(true);
end;
  • 1
  • 2
  • 3
  • Seite 3 von 3
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   51   65 · Page-Gen-Time: 0.021859s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI