📄 at45d0xx.inc
字号:
; +------------------------------------------------------------------------------+
; | Rotinas para ler e escrever na Serial Data Flash AT45D0xxA via interface SPI |
;-=| Autor: Bruno Marcio Diogo Venancio - EMAIL: bruno.marcio@bol.com.br |=-
; | Microcontrolador : AT89S8252 Data:20/09/03 v1.0 |
; | |
; | ESTAS ROTINAS PODEM SER LIVREMENTE DISTRIBUIDAS,DESDE QUE NAO ALTERE O CODIGO|
; | E QUE SEJA CITADO O NOME DO AUTOR. |
; +------------------------------------------------------------------------------+
;----{ Comandos e definicoes de bits do AT45D081A }--------------------
;-| Read commands |--
STSR EQU 57H ; Status register
;WRSR EQU
MMPR EQU 52H ; Main memory page read
B1RD EQU 54H ; Buffer 1 read
B2RD EQU 56H ; Buffer 1 read
CARD EQU 68H ; Continuous array read
;-| Write commands |--
B1WR EQU 84H ; Buffer 1 write
B2WR EQU 87H ; Buffer 2 write
PAER EQU 81H ; Page Erase
BLER EQU 50H ; Block erase
MP2B1 EQU 82H ; Main memory page program through buffer 1
MP2B2 EQU 85H ; Main memory page program through buffer 2
B1MPE EQU 83H ; Buffer1 to memory page program with built-in erase
B2MPE EQU 86H ; Buffer2 to memory page program with built-in erase
B1MP EQU 88H ; Buffer1 to memory page program without built-in erase
B2MP EQU 89H ; Buffer2 to memory page program without built-in erase
;-| Additional Commands |--
MPB1T EQU 53H ; Main Memory Page to Buffer 1 Transfer
MPB2T EQU 55H ; Main Memory Page to Buffer 2 Transfer
MPB1C EQU 60H ; Main Memory Page to Buffer 1 comapare
MPB2C EQU 61H ; Main Memory Page to Buffer 2 comapare
APRB1 EQU 58H ; Auto Page Rewrite through buffer 1
APRB2 EQU 59H ; Auto Page Rewrite through buffer 2
;-| Pinos da interface SPI no AT89S82XX
CS_ BIT P1.4 ; chip select
MOSI BIT P1.5 ;
MISO BIT P1.6
SCK BIT P1.7
;------------------------------------------------------------------------------------
;-| Rotina de inicializacao interface SPI no AT89s82XX
_SPI_INI:
setb CS_
setb MISO
setb MOSI
setb SCK
mov SPCR,#01011100B ; Inicializa o Master SPI, interrupcao
; desabilitada,pino habilitado,MSB primeiro,
; polaridade 1, fase 1 e clock rate /4
ret
;+------------------------------------------------------------------------------+
;| Rotina: Envia/recebe dados pela porta SPI |
;| - Byte enviado assim como e' recebido |
;| - Envio/recebimento simultaneo |
;| - Espera pelo envio/recebimento seja completado antes de sair |
;| Entrada/saida: dado no Acc para enviar, retorna dado recebido tambem em Acc |
;+------------------------------------------------------------------------------+
_AT45_MASTER_IO:
mov SPDR,a ; Carrega dado de saida
MASTER_BBB:
mov a,SPSR ; pega o status
anl a,#SPIF
jz MASTER_BBB
mov a,SPDR ; Ler dado de entrada
ret
;+---------------------------------------------------------------------------------+
;| Rotina: Recebe status da Flash data |
;| Saida : A |
;| |
;| Formato do byte de status: |
;| +---------+------+------+------+------+------+------+------+ |
;| |Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 | |
;| |RDY/~BUSY| COMP | 1 | 0 | 0 | 0 | X | X | |
;| +---------+------+------+------+------+------+------+------+ |
;| |
;| Descricao dos bits: |
;| - RDY/~BUSY -> Quando em 0,dispositivo ocupado , quando em 1 esta livre |
;| - Operacoes que envolvem bit 6 e 7 : MAIN MEMORY PAGE TO BUFFER TRANSFER, |
;| MAIN MEMORY PAGE TO BUFFER COMPARE, BUFFER TO MAIN MEMORY PAGE PROGRAM WITH |
;| BUILT-IN ERASE, PAGE ERASE, BLOCK ERASE, MAIN MEMROY PAGE PROGRAM , AUTO PAGE |
;| REWRITE e BUFFER TO MAIN MEMORY PAGE PROGRAM WITHOUT BUILT-IN ERASE. |
;| - Bit 3,4 e 5 : Densidade da Flash |
;| Tabela dos modelos: |
;| |
;| +------------------------+ |
;| |Bit 5 4 3 2 Densidade | |
;| | | |
;| | 0 0 1 1 1M | |
;| | 0 1 0 1 2M | |
;| | 0 1 1 1 4M | |
;| | 1 0 0 1 8M | |
;| | 1 0 1 1 16M | |
;| | 1 1 0 1 32M | |
;| | 1 1 1 1 64M | |
;| | 0 1 0 0 128M | |
;| | 0 1 1 0 256M | |
;| | 1 0 0 0 512M | |
;| +------------------------+ |
;| |
;| - Bits X,X : Reservado para uso futuro |
;+---------------------------------------------------------------------------------+
_AT45_GET_STATUS:
push ACC
clr CS_ ; Habilita a Data-Flash
mov a,#57H
call _AT45_MASTER_IO
AT45_VERI_LOOP:
call _AT45_MASTER_IO
mov a,SPDR
jnb ACC.7,AT45_VERI_LOOP
setb CS_ ; Desabilita a Data-Flash
pop ACC
ret
;+-------------------------------------------------------------------------------+
;| Rotina: MAIN MEMORY PAGE READ |
;| Entradas: DPTR -> Numero da pagina (0 a 4095) , BUFFER_BYTE -> 0 a 255 |
;| Saida: Dado no ACC |
;| Funcao : Permite a leitura diretamente das 4096 paginas na memoria principal |
;| sem precisar usar os buffers e deixando os dados dos buffers intactos|
;+-------------------------------------------------------------------------------+
_AT45_MAIN_PAGE_READ:
push DPH ; salva DPTR
push DPL
mov a,DPH ; Filtra dptr para ir somente ate 4095
anl a,#00001111B
mov DPH,a
clr C ; adequa o dptr da forma exigida pelo AT45cXX
mov a,DPL
rlc a
mov DPL,a
mov a,DPH
rlc a
mov DPH,a
;-
clr CS_ ; Habilita a Data-Flash
mov a,#52H ; Comando MAIN MEMORY PAGE READ
call _AT45_MASTER_IO
mov a,DPH
call _AT45_MASTER_IO ; Manda parte alta da pagina
mov a,DPL
call _AT45_MASTER_IO ; Manda parte baixa da pagina
mov a,BUFFER_BYTE ; Manda byte buffer
call _AT45_MASTER_IO
call _AT45_MASTER_IO ; 4 Bytes irrelevantes,mas requeridos
call _AT45_MASTER_IO ;
call _AT45_MASTER_IO ;
call _AT45_MASTER_IO ;
call _AT45_MASTER_IO ; Dado no ACC
SETB CS_
pop DPL ; Recupera DPTR
pop DPH
ret
;+--------------------------------------------------------+
;| Rotina: BUFFER 1 READ |
;| Entradas: BUFFER_BYTE -> 0 a 255 |
;| Saida: Dado no Acc |
;| Funcao : Le diretamente no Buffer 1 de 256 bytes |
;+--------------------------------------------------------+
_READ_BUFFER1:
clr CS_ ; Habilita a Data-Flash
mov a,#54H ; Comando:
call _AT45_MASTER_IO ; BUFFER 1 READ
mov a,#0
call _AT45_MASTER_IO ; Byte irrelevante
mov a,#0
call _AT45_MASTER_IO ; Byte irrelevante
mov a,BUFFER_BYTE ; Endereco do byte
call _AT45_MASTER_IO
call _AT45_MASTER_IO ; Byte irrelevante
call _AT45_MASTER_IO ; Pega o byte lido e coloca em A
setb CS_ ; Desabilita a Data-Flash
ret
;+--------------------------------------------------------+
;| Rotina: BUFFER 2 READ |
;| Entradas: BUFFER_BYTE -> 0 a 255 |
;| Saida: Dado no Acc |
;| Funcao : Le diretamente no Buffer 2 de 256 bytes |
;+--------------------------------------------------------+
_READ_BUFFER2:
clr CS_ ; Habilita a Data-Flash
mov a,#56H ; Comando:
call _AT45_MASTER_IO ; BUFFER 2 READ
mov a,#0
call _AT45_MASTER_IO ; Byte irrelevante
mov a,#0
call _AT45_MASTER_IO ; Byte irrelevante
mov a,BUFFER_BYTE ; Endereco do byte
call _AT45_MASTER_IO
call _AT45_MASTER_IO ; Byte irrelevante
call _AT45_MASTER_IO ; Pega o byte lido e coloca em A
setb CS_ ; Desabilita a Data-Flash
ret
;+-------------------------------------------------------------------------------+
;| Rotina: MAIN MEMORY PAGE PROGRAM THROUGH BUFFER 1 e 2 |
;| Entradas: DPTR -> Numero da pagina (0 a 4095) , BUFFER_BYTE -> 0 a 255 |
;| Dado a ser gravado no ACC |
;| Funcao : Permite a escrita diretamente das 4096 paginas na memoria principal |
;| passando pelos buffers 1 ou 2 |
;+-------------------------------------------------------------------------------+
_AT45_MAIN_PAGE_WRITE_B1:
push DPL
push DPH
push acc ; Guarda dado
mov a,DPH ; Filtra dptr para ir somente ate 4095
anl a,#00001111B
mov DPH,a
clr C ; adequa o dptr da forma exigida pelo AT45cXX
mov a,DPL
rlc a
mov DPL,a
mov a,DPH
rlc a
mov DPH,a
;-
clr CS_ ; Habilita a Data-Flash
mov a,#82H ; Comando:
call _AT45_MASTER_IO ; MAIN MEMORY PAGE PROGRAM THROUGH BUFFER 1
mov a,DPH
call _AT45_MASTER_IO ; Manda parte alta da pagina
mov a,DPL
call _AT45_MASTER_IO ; Manda parte baixa da pagina
mov a,BUFFER_BYTE ; Manda byte buffer
call _AT45_MASTER_IO
pop acc ; Recupera dado
call _AT45_MASTER_IO ; grava na memoria
setb CS_ ; Desabilita a Data-Flash
call _AT45_GET_STATUS ; Verifica se esta pronto
pop DPH
pop DPL
ret
;+-----------------------------------------------------------+
;| Esta rotina faz o mesmo que a acima, porem com o buffer 2 |
;+-----------------------------------------------------------+
_AT45_MAIN_PAGE_WRITE_B2:
push DPL
push DPH
push acc
mov a,DPH ; Filtra dptr para ir somente ate 4095
anl a,#00001111B
mov DPH,a
clr C ; adequa o dptr da forma exigida pelo AT45cXX
mov a,DPL
rlc a
mov DPL,a
mov a,DPH
rlc a
mov DPH,a
;-
clr CS_ ; Habilita a Data-Flash
mov a,#85H ; Comando:
call _AT45_MASTER_IO ; MAIN MEMORY PAGE PROGRAM THROUGH BUFFER 2
mov a,DPH
call _AT45_MASTER_IO ; Manda parte alta da pagina
mov a,DPL
call _AT45_MASTER_IO ; Manda parte baixa da pagina
mov a,BUFFER_BYTE ; Manda byte buffer
call _AT45_MASTER_IO
pop acc ; Recupera dado
call _AT45_MASTER_IO ; grava na memoria
setb CS_ ; Desabilita a Data-Flash
call _AT45_GET_STATUS ; Verifica se esta pronto
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -