Hallo Leute,
um ein bestehendes ATMega 2561 Gerät zu erweitern, möchte ich per I2C Bus einen 2. ATMega 644 ankoppeln. Der ATMega 2561 hat einen I2CSoft Bus als Master, an den ich den ATMega 644 als TWI (NICHT I2CSoft) Slave im Handshake-Modus mit der Slave-Adresse 2 anbinde.
Wenn der Master den Slave per I2CStat(2) abfragt, meldet der sich auch brav. Einen Schreibbefehl vom Master mit I2COut(2,$AA); kann ich auch korrekt absetzen - es wird auch erkannt, ob der Slave bereit ist (je nach TWIsetRDY).
Soweit, so gut. Was nicht klappt, ist das Erkennen auf dem Slave, daß ein Kommando geschickt wurde. Weder TWIGetRxStat, noch TWIgetTXStat oder TWIgetRDY ändern ihren Status, auch TWIgetCMD liefert keinen Wert.
Was mache ich da auf dem Slave falsch??
Michael
[code]program VTest_644;
// This is a Test-Project for the I2C Slave Mode
//
{ $NOSHADOW} // auskommentieren, damit die Register ALLE gesichert werden.
{ $NOSAVE}
{ $WG} {global Warnings off}
{ $W+}
Device = mega644, VCC=5;
Define_Fuses
Override_Fuses;
LockBits0 = [];
FuseBits0 = [SUT1];
FuseBits1 = [SPIEN, EESAVE];
FuseBits2 = [BODLEVEL2];
ProgMode = SPI;
{ $BOOTRST $0000} {Reset Jump to $0000}
Import SysTick, BeepPort, RTclock, Watchdog, TWISlave, SerPort;
From System Import Float, Pipes;
Define
ProcClock = 14745600;
SysTick = 10; {msec}
StackSize = $080, iData;
FrameSize = $0200, iData;
Serport = 9600, Stop1, TimeOut;
SerPortDTR = PinB, 3, Negative;
SerPortDSR = PortD, 7, Negative;
RxBuffer = 16, iData;
TxBuffer = 16, iData;
RTClock = iData, DateTime;{Time, DateTime}
RTCsource = SysTick;
WatchDog = msec2000;
BeepPort = PortA,4;
TWIbuffer = 128, iData;
TWIaddr = 2;
// TWImode = Transparent; {Transparent or HandShake}
TWImode = Handshake; {Transparent or HandShake}
Implementation
{$EEPROM}
StructConst
{$IDATA}
{--------------------------------------------------------------}
{ Const Declarations }
const
gVersionStr : String = 'I2C Slave V1.x';
{--------------------------------------------------------------}
{ Type Declarations }
type
{--------------------------------------------------------------}
{ Var Declarations }
Var
RxBuff : array[0..254] of byte;
TxBuff : array[0..254] of byte;
RxPtr : Pointer;
TxPtr : Pointer;
{--------------------------------------------------------------}
{ Main Program }
{$IDATA}
Var
lLW : LongWord;
begin
InitPorts;
TWIsetGC(false);
TWIsetslaveAddr(2);
EnableInts;
TWISetRDY(True);
Writeln (SerOut, 'RESET');
WriteLn(SerOut, gVersionStr);
loop
WriteLn (SerOut, 'RxStat: '+BoolToStr(TWIgetRxStat));
WriteLn (SerOut, 'TxStat: '+BoolToStr(TWIgetTxStat));
WriteLn (SerOut, 'RdyStat: '+BoolToStr(TWIgetRdy));
WriteLn (SerOut, 'CMD: '+ByteToStr(TWIgetCMD));
mDelay(2000);
endloop;
end VTest_644.
[/code]
um ein bestehendes ATMega 2561 Gerät zu erweitern, möchte ich per I2C Bus einen 2. ATMega 644 ankoppeln. Der ATMega 2561 hat einen I2CSoft Bus als Master, an den ich den ATMega 644 als TWI (NICHT I2CSoft) Slave im Handshake-Modus mit der Slave-Adresse 2 anbinde.
Wenn der Master den Slave per I2CStat(2) abfragt, meldet der sich auch brav. Einen Schreibbefehl vom Master mit I2COut(2,$AA); kann ich auch korrekt absetzen - es wird auch erkannt, ob der Slave bereit ist (je nach TWIsetRDY).
Soweit, so gut. Was nicht klappt, ist das Erkennen auf dem Slave, daß ein Kommando geschickt wurde. Weder TWIGetRxStat, noch TWIgetTXStat oder TWIgetRDY ändern ihren Status, auch TWIgetCMD liefert keinen Wert.
Was mache ich da auf dem Slave falsch??
Michael
[code]program VTest_644;
// This is a Test-Project for the I2C Slave Mode
//
{ $NOSHADOW} // auskommentieren, damit die Register ALLE gesichert werden.
{ $NOSAVE}
{ $WG} {global Warnings off}
{ $W+}
Device = mega644, VCC=5;
Define_Fuses
Override_Fuses;
LockBits0 = [];
FuseBits0 = [SUT1];
FuseBits1 = [SPIEN, EESAVE];
FuseBits2 = [BODLEVEL2];
ProgMode = SPI;
{ $BOOTRST $0000} {Reset Jump to $0000}
Import SysTick, BeepPort, RTclock, Watchdog, TWISlave, SerPort;
From System Import Float, Pipes;
Define
ProcClock = 14745600;
SysTick = 10; {msec}
StackSize = $080, iData;
FrameSize = $0200, iData;
Serport = 9600, Stop1, TimeOut;
SerPortDTR = PinB, 3, Negative;
SerPortDSR = PortD, 7, Negative;
RxBuffer = 16, iData;
TxBuffer = 16, iData;
RTClock = iData, DateTime;{Time, DateTime}
RTCsource = SysTick;
WatchDog = msec2000;
BeepPort = PortA,4;
TWIbuffer = 128, iData;
TWIaddr = 2;
// TWImode = Transparent; {Transparent or HandShake}
TWImode = Handshake; {Transparent or HandShake}
Implementation
{$EEPROM}
StructConst
{$IDATA}
{--------------------------------------------------------------}
{ Const Declarations }
const
gVersionStr : String = 'I2C Slave V1.x';
{--------------------------------------------------------------}
{ Type Declarations }
type
{--------------------------------------------------------------}
{ Var Declarations }
Var
RxBuff : array[0..254] of byte;
TxBuff : array[0..254] of byte;
RxPtr : Pointer;
TxPtr : Pointer;
{--------------------------------------------------------------}
{ Main Program }
{$IDATA}
Var
lLW : LongWord;
begin
InitPorts;
TWIsetGC(false);
TWIsetslaveAddr(2);
EnableInts;
TWISetRDY(True);
Writeln (SerOut, 'RESET');
WriteLn(SerOut, gVersionStr);
loop
WriteLn (SerOut, 'RxStat: '+BoolToStr(TWIgetRxStat));
WriteLn (SerOut, 'TxStat: '+BoolToStr(TWIgetTxStat));
WriteLn (SerOut, 'RdyStat: '+BoolToStr(TWIgetRdy));
WriteLn (SerOut, 'CMD: '+ByteToStr(TWIgetCMD));
mDelay(2000);
endloop;
end VTest_644.
[/code]