⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at45d0xx.inc

📁 AT45dbxx data-flash memory routines in asm51
💻 INC
📖 第 1 页 / 共 2 页
字号:
;  +------------------------------------------------------------------------------+
;  | 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 + -