///////////////////////////////////////////////////////////////////////// //// ПРИМЕР ПОДПРОГРАММ ДЛЯ РАБОТЫ С МИКРОСХЕМАМИ NAND-FLASH ПАМЯТИ //// //// SAMSUNG K95608X0D ver 1.0 //// //// author:V.Andreev //// //// http://variate.narod.ru //// //// e-mail:ne-rad@mail.ru //// //// compiler:CCS PCWH 4.013 //// ///////////////////////////////////////////////////////////////////////// //// автор не несет ответственности за возможный /// //// и/или принесенный ущерб и т.п. /// #use fast_io (d) #define CHIP_ENABLE PIN_B4 #define READ_ENABLE PIN_E0 #define WRITE_ENABLE PIN_B2 #define RB_OUT PIN_B3 #define CLE PIN_E1 #define ALE PIN_B5 #define I_O port_d //////////////////////////////////// // чтение ID // // K9F5608R0D 35h // // K9F5608B0D 75h // // K9F5608U0D 75h // //////////////////////////////////// void READ_ID(BYTE* id) { output_high(CHIP_ENABLE); output_high(WRITE_ENABLE); output_high(READ_ENABLE); output_low(CLE); output_low(ALE); set_tris_d (0x00); // команда на чтение ID =0x90 output_d (0x90); output_low(CHIP_ENABLE); output_high(CLE); output_low(WRITE_ENABLE); output_high(WRITE_ENABLE); output_low(CLE); // адрес =0x00 output_d (0x00); output_high(ALE); output_low(WRITE_ENABLE); output_high(WRITE_ENABLE); output_low(ALE); set_tris_d (0xFF); // чтение ID MarkerCode(ECh)_DeviceCode(id) output_low(READ_ENABLE); id[0] = input_d(); output_high(READ_ENABLE); output_low(READ_ENABLE); id[1]= input_d(); output_high(READ_ENABLE); output_high(CHIP_ENABLE); } ///////////////////////////////////////////////////// /// 0 block erase /// ///////////////////////////////////////////////////// void block_erase(void){ output_high(CHIP_ENABLE); output_high(WRITE_ENABLE); output_high(READ_ENABLE); output_low(CLE); output_low(ALE); set_tris_d (0x00); // 1 команда очистки =0x60 output_d (0x60); output_low(CHIP_ENABLE); output_high(CLE); output_low(WRITE_ENABLE); output_high(WRITE_ENABLE); output_low(CLE); // адрес output_d (0x00); output_high(ALE); output_low(WRITE_ENABLE); // 2 cycle output_high(WRITE_ENABLE); output_low(WRITE_ENABLE); // 3 cycle output_high(WRITE_ENABLE); output_low(ALE); // 2 команда очистки =0xD0 output_d (0xD0); output_low(CHIP_ENABLE); output_high(CLE); output_low(WRITE_ENABLE); output_high(WRITE_ENABLE); output_low(CLE); while(!input(RB_OUT)); // проверка занятости flash output_high(CHIP_ENABLE); } ///////////////////////////////////////////////////// /// чтение статуса /// ///////////////////////////////////////////////////// void read_status(BYTE* data) { output_high(CHIP_ENABLE); output_low(CLE); output_low(ALE); output_high(WRITE_ENABLE); output_high(READ_ENABLE); set_tris_d (0x00); // команда на чтение статуса =0x70 output_d (0x70); output_low(CHIP_ENABLE); output_high(CLE); output_low(WRITE_ENABLE); delay_cycles(5); output_high(WRITE_ENABLE); output_low(CLE); // чтение статуса set_tris_d (0xFF); output_low(READ_ENABLE); data[0] = input_d(); output_high(READ_ENABLE); output_high(CHIP_ENABLE); } ///////////////////////////////////////////////////// /// запись 0й страницы /// ///////////////////////////////////////////////////// void write_flash_0_page(BYTE* data, int16 size) { int16 i; output_high(CHIP_ENABLE); output_high(WRITE_ENABLE); output_high(READ_ENABLE); output_low(CLE); output_low(ALE); set_tris_d (0x00); // команда записи =0x80 output_d (0x80); output_low(CHIP_ENABLE); output_high(CLE); output_low(WRITE_ENABLE); output_high(WRITE_ENABLE); output_low(CLE); // адрес 0x00 output_d (0x00); output_high(ALE); output_low(WRITE_ENABLE); // 1 cycle output_high(WRITE_ENABLE); output_low(WRITE_ENABLE); // 2 cycle output_high(WRITE_ENABLE); output_low(WRITE_ENABLE); // 3 cycle output_high(WRITE_ENABLE); output_low(ALE); // Send a data byte for(i=0; i