ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
6 мая
156113 Топик полностью
Aдикм (09.05.2009 00:57, просмотров: 206) ответил foster на MSP430F149 и NAND128W3A, Не получается полностью стереть флешку
Правда это было написано для работы с нандами с 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 ;