Рабочая процедура записи Tiny2313. Разберетесь при желании ;>
fHexManager - содержит массив данных для записи (загруженный Hex) :
Код
procedure TDuplexDataChannel.UploadHexToATTiny2313;
var
i : integer;
D1, D2, D3, D4 : Byte;
ACurrentPage : Integer;
APageEnabled : Boolean;
APageDone : Boolean;
function GetWordAddress( Address: integer): byte;
begin
Result := (Address shr 1) and $0F;
end;
function GetPageASelector( Address: integer):byte;
begin
Result := Address shr 9;
end;
function GetPageBSelector( Address: integer):byte;
begin
Result := (Address shr 1) and $ff;
end;
function GetPageNumber( Address: Integer):Integer;
begin
Result := Address div 32;
end;
function IsPageEnabled( NumberOfPage : Integer):boolean;
var
i : Integer;
begin
Result := false;
for i := NumberOfPage * 32 to (NumberOfPage * 32) + 31 do
if fHexManager.Cell_Enabled( i ) then
Result := True
end;
begin
fBytesWrote := 0;
if fNeedErase then
begin // Стираем чип
WriteByte( $AC );
WriteByte( $80 );
WriteByte( 0 );
WriteByte( 0 );
sleep( 1000 );
end;
ACurrentPage := -1;
APageDone := True;
for i := 0 to $7FF do
begin
if fHexManager.Cell_Enabled(i) then
D4 := fHexManager.RHex( i )
else
D4 := $FF;
if ACurrentPage <> GetPageNumber( i ) then
// Необходимо выбрать страницу
begin
if not APageDone then // finalizing write
begin
Sleep(10);
WriteByte($4C); // Writing Memory Page
WriteByte( GetPageASelector( i-32 ) );
WriteByte( GetPageBSelector( i-32 ) );
WriteByte( 0 );
fCurrentData := '4C ' +
IntToHex( GetPageASelector( i-32 ), 2) + ' ' +
IntToHex( GetPageBSelector( i-32 ), 2) + ' ' +
IntToHex( 0, 2);
SendMessage( fOwnerHandle, WM_DAILYDATA, 0,0);
Sleep(100);
APageDone := True
end;
ACurrentPage := GetPageNumber( i );
APageEnabled := IsPageEnabled( GetPageNumber(i) );
if APageEnabled or (not APageDone) then
APageDone := False
end;
if APageEnabled then
begin // Пишем ячейку
// fCurrentAddress := IntToHex( i, 4 );
//D4 := fHexManager.RHex( i );
D1 := $40 or ($8 * (i and 1));
D2 := 0;
D3 := GetWordAddress( i );
fCurrentAddress := IntToHex( i, 4 );
fCurrentData := IntToHex( D1, 2) + ' ' +
IntToHex( D2, 2) + ' ' +
IntToHex( D3, 2) + ' ' +
IntToHex( D4, 2);
WriteByte( D1 );
WriteByte( D2 );
WriteByte( D3 );
WriteByte( D4 );
inc( fBytesWrote );
Sleep(5);
SendMessage( fOwnerHandle, WM_DAILYDATA, 0,0);
end
end;
WriteFuses(tn2313);
WriteLocks(tn2313);
end;