Turbo51
Модули обслуживания памяти
AT25
unit at25;
{$O-}
{$xdata}
{$idata}
interface
procedure AtWrite;
procedure ATREAD;
procedure Read640;
procedure Write640;
PROCEDURE READ640P(numr:byte);
PROCEDURE WRITE640P(numw:byte);
//var adrbyte:boolean; //флаг выставляется, если адрес не будет превышать 255
implementation
uses declare,ports;
PROCEDURE ATWRCOM;forward;
PROCEDURE ATRDB;forward;
PROCEDURE WREN;forward;
PROCEDURE RDSR;forward;
var countbyte:byte;
//================================================
procedure delayat;assembler;
asm
nop
nop
nop
nop
nop
nop
nop
nop
end;
//------------------------------------------------
PROCEDURE ATWREN;ASSEMBLER;
ASM
//ПОДПРОГРАММА ПЕРЕДАЧИ СИГНАЛА РАЗРЕШЕНИЯ ЗАПИСИ
MOV A,#00000110B //КОМАНДА РАЗРЕШЕНИЯ ЗАПИСИ
//ПОДПРОГРАММА ПЕРЕДАЧИ КОМАНДЫ
//(КОД КОМАНДЫ НАХОДИТСЯ В АККУМУЛЯТОРЕ)
LCALL ATWRCOM
END;
//===============================================
PROCEDURE ATWRCOM;ASSEMBLER;
LABEL ATWREN0;
ASM
CLR FLASHCLK
CLR FLASHCS
lcall delayat
MOV R2,#8 //НАДО ПЕРЕДАТЬ 8 БИТ
ATWREN0: RLC A //ВЫДВИЖЕНИЕ СТАРШЕГО БИТА В БИТ ПЕРЕНОСА
MOV FLASHOUT,C //ПЕРЕДАЧА БИТА В ЛИНИЮ
lcall delayat
SETB FLASHCLK //ФИКСАЦИЯ БИТА
lcall delayat
CLR FLASHCLK //ДЛЯ СЛЕДУЮЩЕГО
lcall delayat
DJNZ R2,ATWREN0 //ЦИКЛ
END;
//-----------------------------------------------
PROCEDURE ATWRDI;ASSEMBLER;
ASM
//ПОДПРОГРАММА ПЕРЕДАЧИ СИГНАЛА ЗАПРЕЩЕНИЯ ЗАПИСИ
MOV A,#00000100B //КОМАНДА ЗАПРЕЩЕНИЯ ЗАПИСИ
LCALL ATWRCOM
END;
//-----------------------------------------------
PROCEDURE ATRSR;ASSEMBLER;
ASM
//ПОДПРОГРАММА ЧТЕНИЯ БАЙТА СТАТУСА
//ПОСЛЕ ПРИЕМА БАЙТ СТАТУСА НАХОДИТСЯ В АККУМУЛЯТОРЕ
MOV A,#00000101B //КОМАНДА ЧТЕНИЯ СТАТУСА
LCALL ATWRCOM //ПЕРЕДАЧА КОМАНДЫ
LCALL ATRDB
END;
//===============================================
PROCEDURE ATRDB;ASSEMBLER;
LABEL ATRSR0;
ASM
//ПОДПРОГРАММА ЧТЕНИЯ БАЙТА
MOV R2,#8 //НАДО ПРИНЯТЬ 8 БИТ
ATRSR0: SETB FLASHCLK //УСТАНОВКА 1 В ЛИНИИ CLK
lcall delayat
MOV C,FLASHIN //ПРИЕМ БИТА ДАННЫХ
RLC A //ВДВИЖЕНИЕ БИТА В МЛАДШИЙ БИТ АККУМУЛЯТОРА
lcall delayat
CLR FLASHCLK
lcall delayat
DJNZ R2,ATRSR0 //ЦИКЛ
END;
//-----------------------------------------------
//ПОДПРОГРАММА ПЕРЕДАЧИ АДРЕСА
//В R3 ДОЛЖЕН СОДЕРЖАТЬСЯ КОД КОМАНДЫ,
//АДРЕС В R0:R1
PROCEDURE ATWRITA;ASSEMBLER;
LABEL ATWRITA0;
ASM
MOV A,R3
LCALL ATWRCOM //ПЕРЕДАЧА КОМАНДЫ
mov r2,#8
//jb adrbyte,ATWRITA0
MOV R2,#16 //АДРЕС СОСТОИТ ИЗ 16 БИТ
ATWRITA0:
MOV A,R1 //НАЧАЛО ЦИКЛА ПЕРЕДАЧИ АДРЕСА
RLC A
MOV R1,A
MOV A,R0
RLC A //ВЫДВИЖЕНИЕ СТАРШЕГО БИТА АККУМУЛЯТОРА
MOV R0,A
MOV FLASHOUT,C
lcall delayat
SETB FLASHCLK //ФИКСАЦИЯ ДАННЫХ НА ЛИНИИ
lcall delayat
CLR FLASHCLK
lcall delayat
DJNZ R2,ATWRITA0 //ЦИКЛ
END;
//------------------------------------------------
//ПОДПРОГРАММА ЗАПИСИ БАЙТА.
//В РЕГИСТРЕ В СОДЕРЖИТСЯ КОД
//В РЕГИСТРАХ R0:R1 - АДРЕС
PROCEDURE ATWRITE;ASSEMBLER;
LABEL ATWRITE0;
ASM
LCALL WREN
MOV R3,#00000010B //КОД КОМАНДЫ ЗАПИСИ
LCALL ATWRITA //ПЕРЕДАЧА АДРЕСА
MOV A,B
LCALL ATWRCOM //ПЕРЕДАЧА БАЙТА
SETB FLASHCS
ATWRITE0: LCALL RDSR
JB ACC.0,ATWRITE0
END;
//------------------------------------------------
//ПОДПРОГРАММА ЧТЕНИЯ БАЙТА.
//В РЕГИСТРАХ R0:R1 СОДЕРЖИТСЯ АДРЕС
//СЧИТАННЫЙ БАЙТ РАСПОЛАГАЕТСЯ В АККУМУЛЯТОРЕ
PROCEDURE ATREAD;ASSEMBLER;
ASM
MOV R3,#00000011B //КОД КОМАНДЫ ЧТЕНИЯ
LCALL ATWRITA //ПЕРЕДАЧА АДРЕСА
LCALL ATRDB //ПРИЕМ БАЙТА
SETB FLASHCS
END;
//------------------------------------------------
PROCEDURE WREN;ASSEMBLER;
ASM
LCALL ATWREN
SETB FLASHCS
END;
//------------------------------------------------
PROCEDURE RDSR;ASSEMBLER;
ASM
LCALL ATRSR
SETB FLASHCS
END;
//===============================================
PROCEDURE READ640;ASSEMBLER;
label read640_0;
ASM
MOV R0,ADR640+1
jnb adrbyte,read640_0
mov r0,#0
read640_0:
MOV R1,ADR640
LCALL ATREAD
MOV DATA640,A
END;
//===============================================
PROCEDURE WRITE640;ASSEMBLER;
label write640_0;
ASM
MOV R0,ADR640+1
jnb adrbyte,write640_0
mov r0,#0
write640_0:
MOV R1,ADR640
MOV B,DATA640
LCALL ATWRITE;
END;
//================================================
//------------------------------------------------
//ПОДПРОГРАММА ЗАПИСИ БАЙТА.
//ЗАПИСЫВАЕМЫЕ БАЙТЫ РАЗМЕЩАЮТСЯ В БУФЕРЕ.
//В РЕГИСТРАХ R5:R6 - АДРЕС
PROCEDURE ATWRITEP(nw:byte);
begin
WREN;
ar3:=%00000010; //КОД КОМАНДЫ ЗАПИСИ
ATWRITA;
for countbyte:=0 to nw-1 do
begin
ar0:=sn[countbyte];
acc:=ar0;
ATWRCOM;
end;
flashcs:=true;
end;
//------------------------------------------------
//ПОДПРОГРАММА ЧТЕНИЯ БАЙТА.
//В РЕГИСТРАХ R5:R6 СОДЕРЖИТСЯ АДРЕС
//СЧИТАННЫЕ БАЙТЫ РАЗМЕЩАЮТСЯ В БУФЕРЕ
PROCEDURE ATREADP(nr:byte);
begin
ar3:=%00000011; //КОД КОМАНДЫ ЧТЕНИЯ
ATWRITA; //ПЕРЕДАЧА АДРЕСА
for countbyte:=0 to nr-1 do
begin
atrdb;
sn[countbyte]:=ar0;
end;
flashcs:=true;
end;
//================================================
PROCEDURE READ640P(numr:byte);
begin
if adrbyte then
ar0:=0
else
ar0:=hi(adr640);
ar1:=lo(adr640);
ATREADP(numr);
end;
//================================================
PROCEDURE WRITE640P(numw:byte);
begin
if adrbyte then
ar0:=0
else
ar0:=hi(adr640);
ar1:=lo(adr640);
ATWRITEP(numw);
end;
//================================================
end.
AT24
unit at24;
{$O-}
{$xdata}
{$idata}
interface
procedure ReadByteAt24;
procedure WriteByteAt24;
procedure WritePageAt24(numwr:byte);
procedure ReadPageAt24(numrd:byte);
const adrat24=%10100000;
var
adrpage24:byte;
adr24:word;
flagdelay24:boolean;
//constdelay24:word; //для LP - 1000
constdel24h:byte; //константы задержки для записи в ПЗУ
constdel24m:byte; //для 24МГц обычного исполнения 5 мс
constdel24l:byte; //соответствует l=100 m=100 h=1
countbyte:byte;
implementation
uses declare,i2c;
//===============================================
procedure delay24;
label d24_0,d24_1,d24_2;
begin
asm
mov r4,constdel24h
d24_2: mov r2,constdel24m
d24_0: mov r3,constdel24l
d24_1: djnz r3,d24_1
djnz r2,d24_0
djnz r4,d24_2
end;
end;
//===============================================
//процедура старта записи - передача адреса AT24 и
//адреса ячейки памяти
procedure StartWriteAt24;
begin
acc:=adrpage24 shl 1;
acc:=acc+adrat24;
cy:=false;
i2cadr;
//if i2cfans then exit;
acc:=hi(adr24);
i2cwb;
i2cans;
acc:=lo(adr24);
i2cwb;
i2cans;
end;
//===============================================
//процедура старта чтения - передача адреса AT24
//и получение ответа
procedure StartReadAt24;
begin
acc:=adrpage24 shl 1;
acc:=acc+adrat24;
cy:=true;
i2cadr;
end;
//===============================================
procedure OutAdr24;assembler;
label oa24,oa240;
asm
clr ferr
mov a,adrpage24
clr c
rlc a
orl A,#10100000B
clr C
LCALL I2CADR
JC oa24
//jb FlagI2C_2,oa240
jb adrbyte,oa240
MOV A,ADR24+1
LCALL I2CWB
LCALL I2CANS
JC oa24
oa240:
MOV A,ADR24
LCALL I2CWB
LCALL I2CANS
JC oa24
ret
oa24: setb ferr
ret
end;
//===============================================
//процедура записи байта в AT24 через адрес AT24
procedure WriteByteAt24;
begin
outadr24;
if ferr then exit;
acc:=data640;
I2CWB;
I2CANS;
I2CSTOP;
if flagdelay24 then delay24;
end;
//===============================================
//процедура чтения байта из AT24 через адрес AT24
procedure ReadByteAt24;
begin
outadr24;
if ferr then exit;
asm
mov a,adrpage24
clr c
rlc a
orl A,#10100000B
setb c
end;
I2CADR;
I2CRB;
data640:=acc;
I2CSTOP;
end;
//===============================================
procedure WritePageAt24(numwr:byte);
begin
outadr24;
if ferr then exit;
for countbyte:=0 to numwr-1 do
begin
ar0:=bufferpage[countbyte];
acc:=ar0;
I2CWB;
I2CANS;
end;
I2CSTOP;
if flagdelay24 then delay24;
end;
//===============================================
procedure ReadPageAt24(numrd:byte);
begin
outadr24;
if ferr then exit;
asm
mov a,adrpage24
clr c
rlc a
orl A,#10100000B
SETB C
LCALL I2CADR
end;
for countbyte:=0 to numrd-1 do
begin
I2CRB;
ar0:=acc;
bufferpage[countbyte]:=ar0;
if countbyte<>numrd-1 then I2CANSM;
end;
i2cnoansm;
I2CSTOP;
end;
//===============================================
end.
AT25_01
unit at2501;
{$O-}
{$xdata}
{$idata}
interface
procedure AtWrite;
procedure ATREAD;
procedure Read6401;
procedure Write6401;
PROCEDURE READ6401P(numr:byte);
PROCEDURE WRITE6401P(numw:byte);
//var adrbyte:boolean; //флаг выставляется, если адрес не будет превышать 255
implementation
uses declare,ports;
PROCEDURE ATWRCOM1;forward;
PROCEDURE ATRDB1;forward;
PROCEDURE WREN1;forward;
PROCEDURE RDSR1;forward;
var countbyte:byte;
//================================================
procedure delayat1;assembler;
asm
nop
nop
nop
nop
nop
nop
nop
nop
end;
//------------------------------------------------
PROCEDURE ATWREN1;ASSEMBLER;
ASM
//ПОДПРОГРАММА ПЕРЕДАЧИ СИГНАЛА РАЗРЕШЕНИЯ ЗАПИСИ
MOV A,#00000110B //КОМАНДА РАЗРЕШЕНИЯ ЗАПИСИ
//ПОДПРОГРАММА ПЕРЕДАЧИ КОМАНДЫ
//(КОД КОМАНДЫ НАХОДИТСЯ В АККУМУЛЯТОРЕ)
LCALL ATWRCOM1
END;
//===============================================
PROCEDURE ATWRCOM1;ASSEMBLER;
LABEL ATWREN0;
ASM
CLR FLASHCLK6401
CLR FLASHCS6401
lcall delayat1
MOV R2,#8 //НАДО ПЕРЕДАТЬ 8 БИТ
ATWREN0: RLC A //ВЫДВИЖЕНИЕ СТАРШЕГО БИТА В БИТ ПЕРЕНОСА
MOV FLASHOUT6401,C //ПЕРЕДАЧА БИТА В ЛИНИЮ
lcall delayat1
SETB FLASHCLK6401 //ФИКСАЦИЯ БИТА
lcall delayat1
CLR FLASHCLK6401 //ДЛЯ СЛЕДУЮЩЕГО
lcall delayat1
DJNZ R2,ATWREN01 //ЦИКЛ
END;
//-----------------------------------------------
PROCEDURE ATWRDI1;ASSEMBLER;
ASM
//ПОДПРОГРАММА ПЕРЕДАЧИ СИГНАЛА ЗАПРЕЩЕНИЯ ЗАПИСИ
MOV A,#00000100B //КОМАНДА ЗАПРЕЩЕНИЯ ЗАПИСИ
LCALL ATWRCOM1
END;
//-----------------------------------------------
PROCEDURE ATRSR1;ASSEMBLER;
ASM
//ПОДПРОГРАММА ЧТЕНИЯ БАЙТА СТАТУСА
//ПОСЛЕ ПРИЕМА БАЙТ СТАТУСА НАХОДИТСЯ В АККУМУЛЯТОРЕ
MOV A,#00000101B //КОМАНДА ЧТЕНИЯ СТАТУСА
LCALL ATWRCOM1 //ПЕРЕДАЧА КОМАНДЫ
LCALL ATRDB1
END;
//===============================================
PROCEDURE ATRDB1;ASSEMBLER;
LABEL ATRSR0;
ASM
//ПОДПРОГРАММА ЧТЕНИЯ БАЙТА
MOV R2,#8 //НАДО ПРИНЯТЬ 8 БИТ
ATRSR0: SETB FLASHCLK6401 //УСТАНОВКА 1 В ЛИНИИ CLK
lcall delayat1
MOV C,FLASHIN6401 //ПРИЕМ БИТА ДАННЫХ
RLC A //ВДВИЖЕНИЕ БИТА В МЛАДШИЙ БИТ АККУМУЛЯТОРА
lcall delayat1
CLR FLASHCLK6401
lcall delayat1
DJNZ R2,ATRSR0 //ЦИКЛ
END;
//-----------------------------------------------
//ПОДПРОГРАММА ПЕРЕДАЧИ АДРЕСА
//В R3 ДОЛЖЕН СОДЕРЖАТЬСЯ КОД КОМАНДЫ,
//АДРЕС В R0:R1
PROCEDURE ATWRITA1;ASSEMBLER;
LABEL ATWRITA0;
ASM
MOV A,R3
LCALL ATWRCOM1 //ПЕРЕДАЧА КОМАНДЫ
mov r2,#8
ATWRITA0:
MOV A,R1 //НАЧАЛО ЦИКЛА ПЕРЕДАЧИ АДРЕСА
RLC A
MOV R1,A
{MOV A,R0
RLC A //ВЫДВИЖЕНИЕ СТАРШЕГО БИТА АККУМУЛЯТОРА
MOV R0,A}
MOV FLASHOUT6401,C
lcall delayat1
SETB FLASHCLK6401 //ФИКСАЦИЯ ДАННЫХ НА ЛИНИИ
lcall delayat1
CLR FLASHCLK6401
lcall delayat1
DJNZ R2,ATWRITA0 //ЦИКЛ
END;
//------------------------------------------------
//ПОДПРОГРАММА ЗАПИСИ БАЙТА.
//В РЕГИСТРЕ В СОДЕРЖИТСЯ КОД
//В РЕГИСТРАХ R0:R1 - АДРЕС
PROCEDURE ATWRITE1;ASSEMBLER;
LABEL ATWRITE0;
ASM
LCALL WREN1
MOV R3,#00000010B //КОД КОМАНДЫ ЗАПИСИ
LCALL ATWRITA1 //ПЕРЕДАЧА АДРЕСА
MOV A,B
LCALL ATWRCOM1 //ПЕРЕДАЧА БАЙТА
SETB FLASHCS6401
ATWRITE0: LCALL RDSR1
JB ACC.0,ATWRITE0
END;
//------------------------------------------------
//ПОДПРОГРАММА ЧТЕНИЯ БАЙТА.
//В РЕГИСТРАХ R0:R1 СОДЕРЖИТСЯ АДРЕС
//СЧИТАННЫЙ БАЙТ РАСПОЛАГАЕТСЯ В АККУМУЛЯТОРЕ
PROCEDURE ATREAD1;ASSEMBLER;
ASM
MOV R3,#00000011B //КОД КОМАНДЫ ЧТЕНИЯ
LCALL ATWRITA1 //ПЕРЕДАЧА АДРЕСА
LCALL ATRDB1 //ПРИЕМ БАЙТА
SETB FLASHCS6401
END;
//------------------------------------------------
PROCEDURE WREN1;ASSEMBLER;
ASM
LCALL ATWREN1
SETB FLASHCS6401
END;
//------------------------------------------------
PROCEDURE RDSR1;ASSEMBLER;
ASM
LCALL ATRSR1
SETB FLASHCS6401
END;
//===============================================
PROCEDURE READ6401;ASSEMBLER;
label read640_0;
ASM
//mov r0,#0
read640_0:
MOV R1,ADR640
LCALL ATREAD1
MOV DATA640,A
END;
//===============================================
PROCEDURE WRITE6401;ASSEMBLER;
label write640_0;
ASM
//mov r0,#0
write640_0:
MOV R1,ADR640
MOV B,DATA640
LCALL ATWRITE1
END;
//================================================
//------------------------------------------------
//ПОДПРОГРАММА ЗАПИСИ БАЙТА.
//ЗАПИСЫВАЕМЫЕ БАЙТЫ РАЗМЕЩАЮТСЯ В БУФЕРЕ.
//В РЕГИСТРАХ R5:R6 - АДРЕС
PROCEDURE ATWRITEP1(nw:byte);
begin
WREN1;
ar3:=%00000010; //КОД КОМАНДЫ ЗАПИСИ
ATWRITA1;
for countbyte:=0 to nw-1 do
begin
ar0:=sn[countbyte];
acc:=ar0;
ATWRCOM1;
end;
flashcs6401:=true;
end;
//------------------------------------------------
//ПОДПРОГРАММА ЧТЕНИЯ БАЙТА.
//В РЕГИСТРАХ R5:R6 СОДЕРЖИТСЯ АДРЕС
//СЧИТАННЫЕ БАЙТЫ РАЗМЕЩАЮТСЯ В БУФЕРЕ
PROCEDURE ATREADP1(nr:byte);
begin
ar3:=%00000011; //КОД КОМАНДЫ ЧТЕНИЯ
ATWRITA1; //ПЕРЕДАЧА АДРЕСА
for countbyte:=0 to nr-1 do
begin
atrdb1;
sn[countbyte]:=ar0;
end;
flashcs6401:=true;
end;
//================================================
PROCEDURE READ6401P(numr:byte);
begin
//ar0:=0
ar1:=lo(adr640);
ATREADP1(numr);
end;
//================================================
PROCEDURE WRITE6401P(numw:byte);
begin
//AR0:=0;
ar1:=lo(adr640);
ATWRITEP1(numw);
end;
//================================================
end.
AT25_256
unit at25256;
{$O-}
{$xdata}
{$idata}
interface
procedure AtWrite256;
procedure ATREAD256;
procedure Read256;
procedure Write256;
PROCEDURE READ256P(numr:byte);
PROCEDURE WRITE256P(numw:byte);
//var adrbyte:boolean; //флаг выставляется, если адрес не будет превышать 255
implementation
uses declare,ports;
PROCEDURE ATWRCOM256;forward;
PROCEDURE ATRDB256;forward;
PROCEDURE WREN256;forward;
PROCEDURE RDSR256;forward;
var countbyte:byte;
//================================================
procedure delayat256;assembler;
asm
nop
nop
nop
nop
nop
nop
nop
nop
end;
//------------------------------------------------
PROCEDURE ATWREN256;ASSEMBLER;
ASM
//ПОДПРОГРАММА ПЕРЕДАЧИ СИГНАЛА РАЗРЕШЕНИЯ ЗАПИСИ
MOV A,#00000110B //КОМАНДА РАЗРЕШЕНИЯ ЗАПИСИ
//ПОДПРОГРАММА ПЕРЕДАЧИ КОМАНДЫ
//(КОД КОМАНДЫ НАХОДИТСЯ В АККУМУЛЯТОРЕ)
LCALL ATWRCOM256
END;
//===============================================
PROCEDURE ATWRCOM256;ASSEMBLER;
LABEL ATWREN0;
ASM
CLR FLASHCLKB
CLR FLASHCSB
lcall delayat256
MOV R2,#8 //НАДО ПЕРЕДАТЬ 8 БИТ
ATWREN0: RLC A //ВЫДВИЖЕНИЕ СТАРШЕГО БИТА В БИТ ПЕРЕНОСА
MOV FLASHOUTB,C //ПЕРЕДАЧА БИТА В ЛИНИЮ
lcall delayat256
SETB FLASHCLKB //ФИКСАЦИЯ БИТА
lcall delayat256
CLR FLASHCLKB //ДЛЯ СЛЕДУЮЩЕГО
lcall delayat256
DJNZ R2,ATWREN0 //ЦИКЛ
END;
//-----------------------------------------------
PROCEDURE ATWRDI256;ASSEMBLER;
ASM
//ПОДПРОГРАММА ПЕРЕДАЧИ СИГНАЛА ЗАПРЕЩЕНИЯ ЗАПИСИ
MOV A,#00000100B //КОМАНДА ЗАПРЕЩЕНИЯ ЗАПИСИ
LCALL ATWRCOM256
END;
//-----------------------------------------------
PROCEDURE ATRSR256;ASSEMBLER;
ASM
//ПОДПРОГРАММА ЧТЕНИЯ БАЙТА СТАТУСА
//ПОСЛЕ ПРИЕМА БАЙТ СТАТУСА НАХОДИТСЯ В АККУМУЛЯТОРЕ
MOV A,#00000101B //КОМАНДА ЧТЕНИЯ СТАТУСА
LCALL ATWRCOM256 //ПЕРЕДАЧА КОМАНДЫ
LCALL ATRDB256
END;
//===============================================
PROCEDURE ATRDB256;ASSEMBLER;
LABEL ATRSR0;
ASM
//ПОДПРОГРАММА ЧТЕНИЯ БАЙТА
MOV R2,#8 //НАДО ПРИНЯТЬ 8 БИТ
ATRSR0: SETB FLASHCLKB //УСТАНОВКА 1 В ЛИНИИ CLK
lcall delayat256
MOV C,FLASHINB //ПРИЕМ БИТА ДАННЫХ
RLC A //ВДВИЖЕНИЕ БИТА В МЛАДШИЙ БИТ АККУМУЛЯТОРА
lcall delayat256
CLR FLASHCLKB
lcall delayat256
DJNZ R2,ATRSR0 //ЦИКЛ
END;
//-----------------------------------------------
//ПОДПРОГРАММА ПЕРЕДАЧИ АДРЕСА
//В R3 ДОЛЖЕН СОДЕРЖАТЬСЯ КОД КОМАНДЫ,
//АДРЕС В R0:R1
PROCEDURE ATWRITA256;ASSEMBLER;
LABEL ATWRITA0;
ASM
MOV A,R3
LCALL ATWRCOM256 //ПЕРЕДАЧА КОМАНДЫ
mov r2,#8
//jb adrbyte,ATWRITA0
MOV R2,#16 //АДРЕС СОСТОИТ ИЗ 16 БИТ
ATWRITA0:
MOV A,R1 //НАЧАЛО ЦИКЛА ПЕРЕДАЧИ АДРЕСА
RLC A
MOV R1,A
MOV A,R0
RLC A //ВЫДВИЖЕНИЕ СТАРШЕГО БИТА АККУМУЛЯТОРА
MOV R0,A
MOV FLASHOUTB,C
lcall delayat256
SETB FLASHCLKB //ФИКСАЦИЯ ДАННЫХ НА ЛИНИИ
lcall delayat256
CLR FLASHCLKB
lcall delayat256
DJNZ R2,ATWRITA0 //ЦИКЛ
END;
//------------------------------------------------
//ПОДПРОГРАММА ЗАПИСИ БАЙТА.
//В РЕГИСТРЕ В СОДЕРЖИТСЯ КОД
//В РЕГИСТРАХ R0:R1 - АДРЕС
PROCEDURE ATWRITE256;ASSEMBLER;
LABEL ATWRITE0;
ASM
LCALL WREN256
MOV R3,#00000010B //КОД КОМАНДЫ ЗАПИСИ
LCALL ATWRITA256 //ПЕРЕДАЧА АДРЕСА
MOV A,B
LCALL ATWRCOM256 //ПЕРЕДАЧА БАЙТА
SETB FLASHCSB
ATWRITE0: LCALL RDSR256
JB ACC.0,ATWRITE0
END;
//------------------------------------------------
//ПОДПРОГРАММА ЧТЕНИЯ БАЙТА.
//В РЕГИСТРАХ R0:R1 СОДЕРЖИТСЯ АДРЕС
//СЧИТАННЫЙ БАЙТ РАСПОЛАГАЕТСЯ В АККУМУЛЯТОРЕ
PROCEDURE ATREAD256;ASSEMBLER;
ASM
MOV R3,#00000011B //КОД КОМАНДЫ ЧТЕНИЯ
LCALL ATWRITA256 //ПЕРЕДАЧА АДРЕСА
LCALL ATRDB256 //ПРИЕМ БАЙТА
SETB FLASHCSB
END;
//------------------------------------------------
PROCEDURE WREN256;ASSEMBLER;
ASM
LCALL ATWREN256
SETB FLASHCSB
END;
//------------------------------------------------
PROCEDURE RDSR256;ASSEMBLER;
ASM
LCALL ATRSR256
SETB FLASHCSB
END;
//===============================================
PROCEDURE READ256;ASSEMBLER;
label read256_0;
ASM
MOV R0,ADR256+1
jnb adrbyte,read256_0
mov r0,#0
read256_0:
MOV R1,ADR256
LCALL ATREAD256
MOV DATA640,A
END;
//===============================================
PROCEDURE WRITE256;ASSEMBLER;
label write256_0;
ASM
MOV R0,ADR256+1
jnb adrbyte,write256_0
mov r0,#0
write256_0:
MOV R1,ADR256
MOV B,DATA640
LCALL ATWRITE256
END;
//================================================
//------------------------------------------------
//ПОДПРОГРАММА ЗАПИСИ БАЙТА.
//ЗАПИСЫВАЕМЫЕ БАЙТЫ РАЗМЕЩАЮТСЯ В БУФЕРЕ.
//В РЕГИСТРАХ R5:R6 - АДРЕС
PROCEDURE ATWRITEP256(nw:byte);
begin
WREN256;
ar3:=%00000010; //КОД КОМАНДЫ ЗАПИСИ
ATWRITA256;
for countbyte:=0 to nw-1 do
begin
ar0:=sn[countbyte];
acc:=ar0;
ATWRCOM256;
end;
flashcsB:=true;
end;
//------------------------------------------------
//ПОДПРОГРАММА ЧТЕНИЯ БАЙТА.
//В РЕГИСТРАХ R5:R6 СОДЕРЖИТСЯ АДРЕС
//СЧИТАННЫЕ БАЙТЫ РАЗМЕЩАЮТСЯ В БУФЕРЕ
PROCEDURE ATREADP256(nr:byte);
begin
ar3:=%00000011; //КОД КОМАНДЫ ЧТЕНИЯ
ATWRITA256; //ПЕРЕДАЧА АДРЕСА
for countbyte:=0 to nr-1 do
begin
atrdb256;
sn[countbyte]:=ar0;
end;
flashcsB:=true;
end;
//================================================
PROCEDURE READ256P(numr:byte);
begin
if adrbyte then
ar0:=0
else
ar0:=hi(ADR256);
ar1:=lo(ADR256);
ATREADP256(numr);
end;
//================================================
PROCEDURE WRITE256P(numw:byte);
begin
if adrbyte then
ar0:=0
else
ar0:=hi(ADR256);
ar1:=lo(ADR256);
ATWRITEP256(numw);
end;
//================================================
end.
AT26
//Модуль для работы с FLASH-памятью данных
//AT26C081 объемом 1 Мбайт.
unit at26;
{$O-}
interface
var data26:byte;
adr26:longint;
//clk26:boolean absolute $80;
//cs26 :boolean absolute $80;
//in26 :boolean absolute $80;
//out26:boolean absolute $80;
procedure Init26(command:byte;adr:longint);
procedure read26byte(cont,first:boolean);
procedure From26To522(num:longint);
procedure WrEn26;
procedure WrDis26;
procedure ReadStatus26;
procedure Erase26;
procedure Write26Byte;
procedure Unprotect26;
procedure InitWritePage;
procedure Transfer;
procedure EndWrite;
implementation
uses ports,declare;
//===============================================
//Процедура вывода команды и адреса
procedure Init26(command:byte;adr:longint);assembler;
label l0,l1,l2,l3;
asm
clr cs26 //разрешение микросхемы
mov r2,#8
mov a,command
l0:
rlc a
mov out26,c //вывод кода операции
setb clk26
nop
nop
clr clk26
djnz r2,l0
mov a,adr+2
mov r2,#8
l1:
rlc a
mov out26,c //вывод старшего байта адреса
setb clk26
nop
nop
clr clk26
djnz r2,l1
mov a,adr+1
mov r2,#8
l2:
rlc a
mov out26,c //вывод среднего байта адреса
setb clk26
nop
nop
clr clk26
djnz r2,l2
mov a,adr
mov r2,#8
l3:
rlc a
mov out26,c //вывод младшего байта адреса
setb clk26
nop
nop
clr clk26
djnz r2,l3
end;
//===============================================
//процедура чтения байта или байтов из памяти
//если установлен бит CONT, вывод адреса и закрытие
//микросхемы не производится, то есть процедура
//работает в режиме поточного чтения
procedure read26byte(cont,first:boolean);
label l0;
begin
if (not cont) or (first) then init26(3,adr26); //вывод адреса, если первый или одиночный байт
asm
//---------------------------
mov r2,#8
l0:
mov c,in26
rlc a
setb clk26
nop
nop
clr clk26
djnz r2,l0
end;
//---------------------------
if (not cont) and (not first) then cs26:=true; //закрытие микросхемы, если одиночный байт
data26:=acc;
end;
//===============================================
procedure From26To522(num:longint);
label l0,l1,l2,l3,l4,l5;
begin
init26(3,adr26);
fchannel:=true;
vall:=0;
asm
l2:cpl fchannel
jb fchannel,l3
mov a,#00100010b
sjmp l4
l3:mov a,#00100001b
l4:
CLR CS522
MOV R2,#8
l0: CLR CLK522
RLC A
MOV DI522,C
SETB CLK522
DJNZ R2,l0
mov r2,#8
l1:
clr clk522
mov c,in26
mov di522,c
setb clk26;
setb clk522
clr clk26
djnz r2,l1
setb cs522
inc vall
mov a,vall
jnz l5
inc vall+1
mov a,vall+1
jnz l5
inc vall+2
l5:cpl p3.2
{
Nop
Nop
Nop
Nop
Nop
Nop
Nop
Nop
Nop
Nop
Nop
Nop
Nop
Nop
Nop
Nop
Nop
Nop
Nop
Nop
Nop
Nop
Nop
Nop
Nop
Nop
Nop
//Nop
//Nop
//Nop
//Nop
//Nop
//Nop
}
mov a,vall+2
cjne a,num+2,l2
mov a,vall+1
cjne a,num+1,l2
mov a,vall
cjne a,num,l2
end;
//---------------------------
cs26:=true;
//clk26:=false;
end;
//===============================================
procedure WrEn26;assembler;
label l0;
asm
clr cs26
mov r2,#8
mov a,#6
l0:
rlc a
mov out26,c
setb clk26
nop
nop
clr clk26
djnz r2,l0
setb cs26
end;
//===============================================
procedure WrDis26;assembler;
label l0;
asm
clr cs26
mov r2,#8
mov a,#4
l0:
rlc a
mov out26,c
setb clk26
nop
nop
clr clk26
djnz r2,l0
setb cs26
end;
//===============================================
procedure Unprotect26;assembler;
label l1,l2;
asm
lcall wren26
clr cs26
mov r2,#8
mov a,#1
l1:
rlc a
mov out26,c
setb clk26
nop
nop
clr clk26
djnz r2,l1
mov r2,#8
mov a,#0
l2:
rlc a
mov out26,c
setb clk26
nop
nop
clr clk26
djnz r2,l2
setb cs26
lcall wren26
end;
//===============================================
procedure ReadStatus26;assembler;
label l0,l1;
asm
clr cs26
mov r2,#8
mov a,#5
l0:
rlc a
mov out26,c
setb clk26
nop
nop
clr clk26
djnz r2,l0
mov r2,#8
l1:
mov c,in26
rlc a
setb clk26
nop
nop
clr clk26
djnz r2,l1
setb cs26
end;
//===============================================
procedure Erase26;
label l0;
begin
wren26;
asm
clr cs26
mov r2,#8
mov a,#60H
l0:
rlc a
mov out26,c
setb clk26
nop
nop
clr clk26
djnz r2,l0
end;
cs26:=true;
acc:=$ff;
while acc.0 do readstatus26;
//cs26:=true;
end;
//===============================================
procedure Write26Byte;
label l0;
begin
wren26;
readstatus26;
p1.6:=acc.1;
init26(2,adr26);
asm
mov r2,#8
mov a,data26
l0:
rlc a
mov out26,c
setb clk26
nop
nop
clr clk26
djnz r2,l0
end;
cs26:=true;
//acc:=1;
//while acc.0 do readstatus26;
end;
//===============================================
//===============================================
procedure InitWritePage;
label l0,l1;
begin
wren26;
readstatus26;
p1.6:=acc.1;
init26(2,adr26);
asm
mov r3,#32
mov r0,#paket+4
l1: mov a,@r0
mov r2,#8
//mov a,data26
l0: rlc a
mov out26,c
setb clk26
clr clk26
djnz r2,l0
inc r0
djnz r3,l1
end;
end;
//===============================================
procedure Transfer;assembler;
label l0,l1;
asm
mov r3,#32
mov r0,#paket+4
l1: mov a,@r0
mov r2,#8
//mov a,data26
l0: rlc a
mov out26,c
setb clk26
clr clk26
djnz r2,l0
inc r0
djnz r3,l1
end;
//===============================================
procedure EndWrite;
begin
cs26:=true;
end;
//===============================================
end.
{Обмен
Запись в память
1. исходное состояние CLK - 0
2. выставляется на линии бит
3. по фронту CLK он фиксируется в памяти
4. по срезу CLK бит сдвигается во внутреннем регистре памяти
5. далее все повторяется
Чтение
1. по срезу CLK память выставляет бит на линию
2. после этого МС считывает данные с линии и помещает в аккумулятор
3. затем следует фронт CLK
4. затем все повторяется}