Едни проблеми ме утрепаха, като за капак и Windows-a ми искаше да активирам копието си съвместно с Microsoft... Само бели...
Та, ето го кода на Pascal:
--------------------------------
const
I2CMask = %00011000; I2CSlave = $A0; I2CRead = I2CSlave or $01;
{$IFDEF 04}
I2CRollOver = %0000000000001111; { 16 bytes for 24LC04 }
I2CRollOverNOT = %1111111111110000;
{$ELSE}
I2CRollOver = %0000000000000111; { 8 bytes for 24LC01 }
I2CRollOverNOT = %1111111111111000;
{$ENDIF}
var
I2Cbit, ByteToSend: byte DATA;
I2CAddr, I2CBegin: word DATA;
procedure PD;
begin
GA:=GA; GA:=GA; { Fictive. }
{$IFDEF CheckStack} if SP > MaxSP then MaxSP:=SP; {$ENDIF}
end;
procedure Start;
begin
Port_OR(P3, I2CMask); PD; { SCLSDA(1, 1); }
{ SDA:=true; SCL:=true; PD;}
SDA:=false; PD; PD; PD; PD; SCL:=false; PD;
end; { Start }
procedure StartInit;
begin
Port_OR(P3, I2CMask); PD; { SCLSDA(1, 1); }
while not SDA do
begin
SCL:=false; PD; SCL:=true; PD;
end;
SDA:=false; PD; PD; PD; PD; SCL:=false; PD;
end; { StartInit }
procedure Stop;
begin
Port_AND(P3, not I2CMask); PD; { SCLSDA(0, 0); }
{ SDA:=false; PD;}
SCL:=true; PD; PD; PD; PD; SDA:=true; PD;
end; { Stop }
procedure StopInit;
begin
Port_AND(P3, not I2CMask); PD; { SCLSDA(0, 0); }
SCL:=true; PD; PD; PD; PD; SDA:=true; PD;
end; { StopInit }
procedure OneCycle;
begin
SCL:=true; PD; PD; PD; PD; SCL:=false; PD;
end; { OneCycle }
procedure GetAck;
begin
{ Port_OR(P3, I2CMask); PD; { SCLSDA(1, 1); }
SDA:=true; PD; SCL:=true; PD; PD; PD; PD;
GA:=SDA;
SCL:=false; PD;
end; { GetAck }
procedure SendAck;
begin
{ Port_AND(P3, not I2CMask); PD; { SCLSDA(0, 0); }
SDA:=false; PD;
OneCycle;
end; { SendAck }
procedure NoAck;
begin
{ Port_OR(P3, I2CMask); PD; { SCLSDA(1, 1); }
SDA:=true; PD; SCL:=true; PD;
SCL:=false; PD;
end; { NoAck }
procedure SendByte;
begin
for I2Cbit:=1 to 8 do
begin
ACC:=ByteToSend; SDA:=ACC.7;
ByteToSend:=ByteToSend shl 1;
OneCycle;
end;
end; { SendByte }
const mo = 0 {3*48};
procedure SetI2CSlave;
begin
ByteToSend:=Hi(I2CAddr + mo) and %00000001;
ByteToSend:=I2CSlave or (ByteToSend shl 1);
SendByte;
GetAck;
end; { SetI2CSlave }
procedure SetI2CRead;
begin
ByteToSend:=Hi(I2CAddr + mo) and %00000001;
ByteToSend:=I2CRead or (ByteToSend shl 1);
SendByte;
GetAck;
end; { SetI2CRead }
procedure Load;
var i: byte XDATA;
begin
{ I2CAddr:=0;}
if I2CAddr > MaxBuffPerSave-1 then exit;
repeat
ResetWDT;
Start;
SetI2CSlave;
if not GA then
begin
ByteToSend:=Lo(I2CAddr +mo); SendByte;
GetAck;
if not GA then
begin
Start;
SetI2CRead;
end;
end;
if GA then
begin
Stop;
end;
until not GA;
for i:=I2CAddr to MaxBuffPerSave-1 do
begin
B:=0;
for I2Cbit:=1 to 8 do
begin
Port_OR(P3, I2CMask); { SCLSDA(1, 1); }
B:=B shl 1;
B:=B + ord(SDA);
SCL:=false; PD;
end;
if i = MaxBuffPerSave then NoAck
else SendAck;
Buff[i]:=B;
end;
Stop;
ResetWDT;
end; { Load }
procedure Save;
begin
{ I2CAddr:=$00;}
if I2CAddr > MaxBuffPerSave-1 then exit;
I2CBegin:=I2CAddr;
repeat
ResetWDT;
Start;
SetI2CSlave;
if not GA then
begin
ByteToSend:=Lo(I2CAddr +mo); SendByte;
GetAck;
if not GA then
begin
repeat
ByteToSend:=Buff[I2CAddr]; SendByte;
GetAck;
if not GA then inc(I2CAddr);
until (I2CAddr and I2CRollOver = %0000000000000000) or (I2CAddr >= MaxBuffPerSave) or GA;
if not GA then Stop
else if I2CBegin > (I2CAddr and I2CRollOverNOT) then I2CAddr:=I2CBegin
else I2CAddr:=I2CAddr and I2CRollOverNOT;
end;
end; { if not GA then }
until (I2CAddr >= MaxBuffPerSave);
ResetWDT;
HaveToSave:=false;
end; { Save }
----------------------------------------------------------------------------------------------------
Може нещо да съм изпуснал но бързо ще се разбере като се разгледа добре. Коментирания код на I2C примитивите е резултат от опитите да докарам всички скорости и времена на импулсите.
Инак Атмелските памети си работят така както и Микрочипските преди да ги развалят.
А и се сетих че за някой може да е интересен DSO-то който си купих. Малко е дървено откъм интерфейс но инак става:
http://www.dynoninstruments.com/index.html
Още веднъж благодаря на всички които взеха присърце терзанията ми. Много нерви щях да спестя ако се бях поразтърсил по-отрано и бях купил някакви други памети... но така разбрах че има и други доставчици на този свят
