Hallo Harry,
Sende und Empfangspuffer sind in der Unit wie folgt angelegt.
Code
twis_receivedData : array[0..TWIS_RECEIVE_BUFFER_SIZE-1] of byte;
twis_txData : array[0..TWIS_SEND_BUFFER_SIZE-1] of byte;
Im Array twis_receivedData stehen die vom Master gesendeten Daten und
im twis_txData stehen die Daten, die der Master beim Slave abholt.
In der "main.pas" ist ein kleiner Fehler. Die Applikation muss die Antwort ins Array twis_txData schreiben. Unten eine korrigierte App.
Empfangen:
Der Empfang wird mit der Funktion TWISdrv_StartReceive gestartet.
Die Applikation muss dann die Funktion TWISdrv_rxComplete pollen bis der Rückgabewert größer 0 ist. Ein Rückgabewert größer Null bedeutet, dass das Slave Daten vom Master empfangen hat und der Empfang weiterer Daten gestoppt ist. Jetzt hat die Applikation Zeit, die Daten aus dem Array twis_receivedData zu verarbeiten. Anschließend muss die Applikation den Empfang wieder mit der Funktion TWISdrv_StartReceive in Gang setzten.
Senden:
Das Slave schreibt die Daten in das Array twis_txData und ruft dann die Funktion TWISdrv_Transmit auf.
Die Applikation kann mit der Funktion TWISdrv_TxComplete durch Pollen festzustellen, ob die Daten abgeholt wurden. Ich benutze diese Funktion in meiner Firmware allerdings nicht.
Viel Erfolg!
Code
program gateway;
Device = xmega128A1U, VCC = 3.3;
Define_Fuses
Override_Fuses;
progFuses = true;
FuseBits1 = [WDPER0, WDPER1, WDPER2]; // watchdog = 2s
FuseBits4 = [WDLOCK];
FuseBits5 = [BODLEVEL1, BODLEVEL2, BODACT0]; // 2.8V
Import;
Define
OSCtype = extXTAL=8000000, PLLmul=4, prescA=1, prescB=1, prescC=1, faildet;
StackSize = 256, iData;
FrameSize = 256, iData;
{$DEFINE TWIS_BUFSIZE_128} // rx buffer size for twi
uses xTwiSlaveC;
Implementation
{$IDATA}
const
TWI_ADDR : byte = $33;
{-------------------------------------------------------------------------------
ControlInterface
-------------------------------------------------------------------------------}
procedure ControlInterface;
var
rxCount : byte;
response_size : byte;
begin
rxCount := TWISdrv_rxComplete();
if rxCount > 0 then
// Note: TWI receiver is stopped now, master will receive NACKS until
// TWISdrv_StartReceive is called
twis_txData[0] := twis_receivedData[0];
response_size := 1; // response command only
if (response_size > 0) then
TWISdrv_Transmit(response_size);
endif;
TWISdrv_StartReceive(); // enable receiving
endif;
end;
{-------------------------------------------------------------------------------
Main Program
-------------------------------------------------------------------------------}
begin
EnableInts($87);
TWISdrv_Init(TWI_ADDR, nil);
TWISdrv_StartReceive(); // first start of I2C Slave receiver
loop
asm: WDR; // reset watchdog which is enabled by fuses
ControlInterface;
endloop;
end.