Правда это было написано для работы с нандами с 2-кб страницей. Но они отличаются незначительно.
;************************************************
; КОНТАКТЫ NAND FLASH
;************************************************
;************************************************
; КОМАНДЫ ДЛЯ NAND FLASH
;************************************************
READ1_CMD EQU 00H;
READ2_CMD EQU 01H;
READ3_CMD EQU 50H;
WRITE_CMD EQU 80H;
WRITE_CNFRM_CMD EQU 10H;
ERASE_CMD EQU 60H;
ERASE_CNFRM_CMD EQU 0D0H;
RESET_CMD EQU 0FFH;
READID_CMD EQU 90H;
READSTATUS_CMD EQU 70H;
;*************************************************
; КОНСТАНТЫ ДЛЯ NAND FLASH
;*************************************************
BYTES EQU 2112 ; КОЛИЧЕСТВО БАЙТ НА СТРАНИЦЕ
NBLOCK EQU 1024 ; КОЛИЧЕСТВО БЛОКОВ В МИКРОСХЕМЕ
MAX_WR EQU BYTES/SIZE_WR ; КОЛИЧЕСТВО БАЙТ НА СТРАНИЦЕ
MAX_RD EQU BYTES/SIZE_RD-4 ; КОЛИЧЕСТВО БАЙТ НА СТРАНИЦЕ
SIZE_WR EQU 0008 ; КОЛИЧЕСТВО БАЙТ ДЛЯ ДОЗАПИСИ
SIZE_RD EQU 0001 ; КОЛИЧЕСТВО БАЙТ ДЛЯ ДОЧТЕНИЯ
;********************************************************************
; ОПРЕДЕЛЕНИЯ ПОРТОВ ДЛЯ УПРАВЛЕНИЯ КАРТОЧКОЙ
;********************************************************************
CARD_CONTROL EQU P5OUT;
CARD_CONTROLS EQU P5SEL; АЛЬТЕРНАТИВНЫЕ ФУНКЦИИ
CARD_CONTROLD EQU P5DIR; НАПРАВЛЕНИЕ
NAND_out EQU P4OUT;
NAND_in EQU P4IN;
NAND_dir EQU P4DIR;
NAND_sel EQU P4SEL;
BUSY_port equ P5IN;
NAND_contr equ P5OUT;
;*************************************************
; МАКРОСЫ ДЛЯ NAND FLASH
;*************************************************
data_to_NAND macro
mov.b #0ffh, &NAND_dir;
ENDM
data_from_NAND macro
clr.b &NAND_dir;
ENDM
control_NAND macro
bis.b #RE+CE+CLE+ALE+WE, &P5DIR ; Указанные ноги на выход не подключено USB
mov.b #0ffh, &P4DIR ; Указанные ноги на выход
endm
nocontrol_NAND macro
bic.b #RE+CE+CLE+ALE+WE, &P5DIR ; Указанные ноги на вход - не мешать AVR
mov.b #00h, &P4DIR ; Указанные ноги на вход
endm
HIGH_CE macro
BIS.B #CE, &CARD_CONTROL;
ENDM
LOW_CE macro
BIC.B #CE, &CARD_CONTROL;
ENDM
HIGH_CLE macro
BIS.B #CLE, &CARD_CONTROL;
ENDM
LOW_CLE macro
BIC.B #CLE, &CARD_CONTROL;
ENDM
HIGH_ALE macro
BIS.B #ALE, &CARD_CONTROL;
ENDM
LOW_ALE macro
BIC.B #ALE, &CARD_CONTROL;
ENDM
HIGH_WE macro
BIS.B #WE, &CARD_CONTROL;
ENDM
LOW_WE macro
BIC.B #WE, &CARD_CONTROL;
ENDM
HIGH_RE macro
BIS.B #RE, &CARD_CONTROL;
ENDM
LOW_RE macro
BIC.B #RE, &CARD_CONTROL;
ENDM
HIGH_WP macro
BIS.B #WP, &CARD_CONTROL;
ENDM
LOW_WP macro
BIC.B #WP, &CARD_CONTROL;
ENDM
STROB_WE macro
BIC.B #WE, &CARD_CONTROL;
nop
BIS.B #WE, &CARD_CONTROL;
ENDM
;***********************************************************************
; Стирание блока NAND
;***********************************************************************
Erase_blok
mov.b #0ffH, &NAND_dir ; ПОРТ НА запись
HIGH_RE
LOW_CE
HIGH_CLE
LOW_ALE
mov.b #ERASE_CMD, &NAND_out
STROB_WE
LOW_CLE
HIGH_ALE
if K9K1
mov.b &Adress2, &NAND_out ; Этот байт передаеться только в K9K1G08!!!
STROB_WE
endif
mov.b &Adress3, &NAND_out ;
STROB_WE
mov.b &Adress4, &NAND_out ;
STROB_WE
if K9K2
mov.b &Adress5, &NAND_out ; Этот байт используеться только в K9F2G08!!!
STROB_WE
endif
LOW_ALE
HIGH_CLE
mov.b #ERASE_CNFRM_CMD, &NAND_out;
STROB_WE
LOW_CLE
ERASE_BUSY1
bit.b #RBUSY, &BUSY_port
jnc ERASE_BUSY1
HIGH_CE
ret ;
;****************************************************************************
; Стирание всей памяти NAND
;****************************************************************************
Erase_all
clr.b &Adress1 ; Очистить адреса
clr.b &Adress2 ; Очистить адреса
clr.b &Adress3 ; Очистить адреса
clr.b &Adress4 ; Очистить адреса
clr.b &Adress5 ; Очистить адреса
clr R15 ; Счетчик битых блоков
mov #Bad_table, R13 ;
Ea_loop
call #Erase_blok ; Стираем
call #Status_NAND ; Проверка - блок битый?
bit.b #BIT0, R10 ; Проверка бита 0
jnc Ea1_loop
inc R15 ; Увеличить счетчик битых блоков
call #Save_bad_block ; Сохраняем битый блок
mov R15, &Cnt_bad ; Сохраняем число битых блоков
Ea1_loop
if K9F1
add #64, &Adress3 ; Увеличение блока на 1
jnc Ea_loop ; Проверка - не вышли за пределы?
ret ;
endif
if K9K2
add #64, &Adress3 ; Увеличиваем блок на 1
adc.b &Adress5 ;
cmp.b #2, &Adress5 ; Проверка - все стерли?
jne Ea_loop ; Цикл
ret ;
endif
;***********************************************************************
; Чтение статуса устройства
;***********************************************************************
Status_NAND
HIGH_RE ;
LOW_CE ;
HIGH_CLE ;
LOW_ALE ;
mov.b #70h, &NAND_out ;
STROB_WE ;
LOW_CLE ;
mov.b #00H, &NAND_dir ; ПОРТ НА ЧТЕНИЕ
LOW_RE ;
mov.b &NAND_in, R10 ;
HIGH_RE ;
HIGH_CE ;
mov.b #0ffH, &NAND_dir ; ПОРТ НА запись
ret ;