Komunikační rutina pro paměť EEPROM typu 93C46
V praxi práce s jednočipovými mikrokontroléry je často velmi výhodné
použít k uchování dat sériovou EEPROM. Již skoro desetiletí existuje na
trhu sériová eeprom 93c46 kterou vyrábí řada výrobců pod nejrůznějšími
prvotními označeními. Dnes je sice již častější použití rozhraní I2C od
formy Philips, ale 93c46 kompatibilní sériové eeprom mají stále své
nezanedbatelné místo a trhu.
Dále popsaná rutina je univerzální komunikace s 93c46 pro x51
kompatibilní procesory. Na začátku programu je podrobný popis
pro nastavení potřebných konstant.
;Stazeno z www.HW.cz
; Autorem tohoto SW je Zdenek Janis Medusa@brajan.cz
; Unit na komunikaci s EEPROM AT93C46
;
;*****************************************************************************
; Dle hardware nastav:
;
; CS - vyber obvodu
EE_CS BIT P2.4
;
; SK - hidinovy vstup
EE_SK BIT P2.3
;
; DI - data input
EE_DI BIT P2.2
;
; DO - data output
EE_DO BIT P2.1
;
; ORG - organizace 16/8bit
EE_ORG BIT P2.0
;
;*****************************************************************************
;
; Inicializace EEPROMky
EE_Init: ; Inicializace EEPROM pro 8bitovou komunikaci
clr EE_CS ; CS
clr EE_ORG ; 8bitova organizace
clr EE_DI ; IN EEPROM
clr EE_SK ; CLK
setb EE_DO ; OUT EEPROM
ret
;*****************************************************************************
; Cteni jednoho bajtu z EEPROMky
; OC: 110
EE_Read: ; v R0 adresa, v A vysledek cteni
; Uloz registry
push 000h ; R0
acall EE_StartBit ; Posli Start Bit
; Zaslani operacniho codu do EEPROM (110)
setb C
acall EE_WrBit
acall EE_WrBit
clr C
acall EE_WrBit
; Zaslani adresy, A6, A5, A4, A3, A2, A1, A0
mov A, R0 ; A:= Adresa bunky pro zapis do EEPROM
rl A ; Posun o jeden bit do leva (7bit neni potreba)
mov R0, #007d ; Pocet odesilanych bitu pro adresu
EE_ReAdd: ;
rlc A ; presun bit do C
acall EE_WrBit ; a posli jej EEPROM
djnz R0, EE_ReAdd ; Posilej dalsi bit
; cteni dat z EEPROMky
clr A
mov R0, #009d ; Pocet prijmanych bitu
EE_ReDat: ;
acall EE_ReBit
rlc A ; Test bitu
djnz R0, EE_ReDat ; Posilej dalsi bit
; Ukonci proceduru cteni
acall EE_StopBit ; Posli Stop Bit
; Obnov registry
pop 000h ; R0
ret
;*****************************************************************************
; Zapis jeden bajt do EEPROMky
; OC: 101
EE_Write: ; v R0 adresa, v A data pro zapis
; Uloz registry
push ACC ; A
push 000h ; R0
acall EE_StartBit ; Posli Start Bit
; Zaslani operacniho codu do EEPROM (101)
setb C
acall EE_WrBit
clr C
acall EE_WrBit
setb C
acall EE_WrBit
; Zaslani adresy, A6, A5, A4, A3, A2, A1, A0
push ACC ; Uloz data pro EEPROM
mov A, R0 ; A:= Adresa bunky pro zapis do EEPROM
rl A ; Posun o jeden bit do leva (7bit neni potreba)
mov R0, #007d ; Pocet odesilanych bitu pro adresu
EE_WrAdd: ;
rlc A ; presun bit do C
acall EE_WrBit ; a posli jej EEPROM
djnz R0, EE_WrAdd ; Posilej dalsi bit
; Zaslani dat EEPROMce
pop ACC ; Obnov data pro EEPROM
mov R0, #008d ; Pocet odesilanych bitu pro data
EE_WrDat: ;
rlc A ; Test bitu
acall EE_WrBit
djnz R0, EE_WrDat ; Posilej dalsi bit
; Cekej na dokonceni internich operaci zapisu EEPROMky
acall EE_Done ;
acall EE_StopBit ; Posli Stop Bit
; Obnov registry
pop 000h ; R0
pop ACC ; A
ret
;*****************************************************************************
; Smazani jedne bunky (vyplni ji $FF)
; OC: 111
EE_Erase: ; v R0 adresa mazane bunky v EEPROM
; Uloz registry
push ACC ; A
push 000h ; R0
acall EE_StartBit ; Posli Start Bit
; Zaslani operacniho codu do EEPROM (111)
setb C
acall EE_WrBit
acall EE_WrBit
acall EE_WrBit
; Zaslani adresy, A6, A5, A4, A3, A2, A1, A0
mov A, R0 ; A:= Adresa bunky pro smazani
rl A ; Posun o jeden bit do leva (7bit neni potreba)
mov R0, #007d ; Pocet odesilanych bitu pro adresu
EE_ErAdd: ;
rlc A ; presun bit do C
acall EE_WrBit ; a posli jej EEPROM
djnz R0, EE_ErAdd ; Posilej dalsi bit
; Cekej na dokonceni internich operaci zapisu EEPROMky
acall EE_Done ;
acall EE_StopBit ; Posli Stop Bit
; Obnov registry
pop 000h ; R0
pop ACC ; A
ret
;*****************************************************************************
; Povoleni zapisovych a mazacich operaci
; OC: 100,11
EE_EWEN: ; Write enable must precede all programming.
; Start bit
acall EE_StartBit
; Operacni code (100)
setb C
acall EE_WrBit
clr C
acall EE_WrBit
acall EE_WrBit
; Pod Operacni code (11)
setb C
acall EE_WrBit
acall EE_WrBit
; Zbytek - libovolne hodnoty: 5x (00000)
clr C
acall EE_WrBit
acall EE_WrBit
acall EE_WrBit
acall EE_WrBit
acall EE_WrBit
; Stop bit
acall EE_StopBit
ret
;*****************************************************************************
; Zakaz mazacich a zapisovych operaci
; OC: 100,00
EE_EWDS: ; Disable all programming instuctions.
; Start bit
acall EE_StartBit
; Operacni code (100)
setb C
acall EE_WrBit
clr C
acall EE_WrBit
acall EE_WrBit
; Pod Operacni code (00)
clr C
acall EE_WrBit
acall EE_WrBit
; Zbytek - libovolne hodnoty: 5x (00000)
clr C
acall EE_WrBit
acall EE_WrBit
acall EE_WrBit
acall EE_WrBit
acall EE_WrBit
; Stop bit
acall EE_StopBit
ret
;*****************************************************************************
; Smaz celou pamet EEPROM
; OC: 100,10
EE_ERAL: ; Erases all memory locatons.
; Start bit
acall EE_StartBit
; Operacni code (100)
setb C
acall EE_WrBit
clr C
acall EE_WrBit
acall EE_WrBit
; Pod Operacni code (10)
setb C
acall EE_WrBit
clr C
acall EE_WrBit
; Zbytek - libovolne hodnoty: 5x (00000)
clr C
acall EE_WrBit
acall EE_WrBit
acall EE_WrBit
acall EE_WrBit
acall EE_WrBit
; Cekej na dokonceni internich operaci mazani EEPROMky
acall EE_Done
acall EE_StopBit ; Stop Bit
ret
;*****************************************************************************
; Zapis do vsech budek EEPROM
; OC: 100,01
EE_WRAL: ; v A zapisovana data
; Uloz registry
push ACC ; A
push 000h ; R0
; Start bit
acall EE_StartBit
; Operacni code (100)
setb C
acall EE_WrBit
clr C
acall EE_WrBit
acall EE_WrBit
; Pod Operacni code (01)
clr C
acall EE_WrBit
setb C
acall EE_WrBit
; Zbytek - libovolne hodnoty: 5x (00000)
clr C
acall EE_WrBit
acall EE_WrBit
acall EE_WrBit
acall EE_WrBit
acall EE_WrBit
mov R0, #008d ; Pocet odesilanych bitu pro data
EE_WaDat: ;
rlc A ; Test bitu
acall EE_WrBit
djnz R0, EE_WaDat ; Posilej dalsi bit
; Cekej na dokonceni internich operaci zapisu EEPROMky
acall EE_Done
acall EE_StopBit ; Stop Bit
; Obnov registry
pop 000h ; R0
pop ACC ; A
ret
;*****************************************************************************
;*****************************************************************************
EE_StartBit: ; Aktivace zbernice EEPROM
setb EE_DO ; Tento pin priprav na cteni
clr EE_SK ; Hodiny low
clr EE_DI ; Data input low
setb EE_CS ; Aktivuj EEPROM
ret
EE_StopBit: ; Deaktivace zbernice EEPROM
clr EE_CS ; Deaktivace EEPROM
clr EE_DI ; Definuj hodnoty pro EEPROM
clr EE_SK ; ...
setb EE_DO ; ...
ret
EE_WrBit: ; Zapis bitu dle C(arry) do EEPROM
clr EE_SK ; Nuluj hodiny
mov EE_DI, C; Nastav DI:= C
setb EE_SK ; Prejdi u hodin na Log. 1.
nop
clr EE_SK ; Dokonci hodinovy impuls
clr EE_DI ; Nastav standartni hodnoty
ret
EE_ReBit: ; Cteni bitu z EEPROM, vysledek v C(arry)...
setb EE_DO ; Pin pro cteni
clr EE_DI ; Data pro EEPROM nejsou potreba
clr EE_SK ; Nuluj hodiny
mov C, EE_DO; Nacti bit
setb EE_SK ; Nabezna hrana hodin
nop
clr EE_SK ; Sestupna hrana hodin
ret
EE_Done: ; Ceka na dokonceni vnitrni operace EEPROM
setb EE_DO ; Pin na cteni
clr EE_DI ; Data nejsou potreba...
clr EE_SK ; Hodiny na Log. 0.
clr EE_CS ; Sestupna hrana - EEPROM chceck status
nop
setb EE_CS ; Zacatek EEPROM chceck status
EE_Check:
nop
jnb EE_DO, EE_Check ; Cekej na Log. 1
nop
ret
;Stazeno z www.HW.cz
;Autorem tohoto SW je Zdenek Janis Medusa@brajan.cz
Tato rutina je vyzkoušena a je opravdu plně funkční.
|
|
© DH servis 2002 - |