// PIN DESCRIPTION
// +----+---------+----------------------------------+-----------------------+
// | | | | Arduino Output |
// | # | SYMBOL | PIN NAME +------------+----------+
// | | | | [Voh, Vol] | [Vhv] |
// +----+---------+----------------------------------+------------+----------+
// | 01 | CE# | Chip Enable Output | D7 (PD7) | -- |
// +----+---------+----------------------------------+------------+----------+
// | 02 | WE# | Write Enable Output | D6 (PD6) | -- |
// +----+---------+----------------------------------+------------+----------+
// | 03 | OE# | Output Enable Output | D8 (PB0) | A0 (PC0) |
// +----+---------+----------------------------------+------------+----------+
// | 04 | RESET# | Hardware Reset Pin, Active Low | D9 (PB1) | A1 (PC1) |
// +----+---------+----------------------------------+------------+----------+
// | 05 | BYTE# | Word/Byte Selection Output | D5 (PD5) | -- |
// +----+---------+----------------------------------+------------+----------+
// | 06 | WP#/ACC | Hardware Write Protect/ | D10 (PB2) | A2 (PC2) |
// | | | Programming Acceleration Output | | |
// +----+---------+----------------------------------+------------+----------+
// | 07 | RY/BY# | Ready/Busy Input | D4 (PD4) | -- |
// +----+---------+----------------------------------+------------+----------+
// | 08 | A9 | | | A3 (PC3) |
// +----+---------+----------------------------------+------------+----------+
// | 09 | A6 | | | -- |
// +----+---------+----------------------------------+------------+----------+
// | 10 | A1 | | | -- |
// +----+---------+----------------------------------+------------+----------+
// | 11 | A0 | | | -- |
// +----+---------+----------------------------------+------------+----------+
// NOTE: Voh = 0.7*Vcc ~ Vcc+0.3, Vol = -0.5V ~ 0.8V, Vhv = 9.5V ~ 10.5V.
// Vcc = +2.7V to 3.6V
//
#define NBYTE 5 // OUTPUT. BYTE#. Word/Byte Selection/
#define NWE 6 // OUTPUT. WE#. Write Enable. (D6)
#define NCE 7 // OUTPUT. CE#. Chip Enable.
#define NOE 8 // OUTPUT. OE#. Output Enable.
#define NRESET 9 // OUTPUT. RESET#. Hardware Reset Pin, Active Low
#define NWP 10 // OUTPUT. WP#. Hardware Write Protect/Programming Acceleration.
#define NOE_Vhv A0 //(14)
#define NRESET_Vhv A1 //(15)
#define NWP_Vhv A2 //(16)
#define A9_Vhv A3 // A3 = 17 = PC3
#define ARDUINO_PIN_TO_AVR_PORT(P) ((P < 8) ? PIND : ((P < 14) ? PINB : PINC))
#define ARDUINO_PIN_TO_AVR_PIN(P) ((P < 8) ? (P) : ((P < 14) ? (P - 8) : (P - 14)))
#define NBY 2 // INPUT. RDY/BY#. Ready/Busy#.
#define BUSY 0 // Interupt BUSY
#define DEVICE_RESET 0
#define STANDBY_MODE 1
#define OUTPUT_DISABLE 2
#define READ_MODE 3
#define WRITE 4 // NOTE 1, 3
#define ACCELERATE_PROGRAM 5
#define TEMPORARY_SECTOR_GROUP_UNPROTECT 6 // NOTE 2
#define SECTOR_GROUP_PROTECT 7 // NOTE 2
#define CHIP_UNPROTECT 8
#define SECTOR_LOCK_STATUS_VERIFICATION 9 //Sector unprotected code:00h. Sector protected code:01h.
#define READ_SILICON_ID_MANUFACTURER_CODE 10
#define READ_SILICON_ID_MX29LV640ET 11
#define READ_SILICON_ID_MX29LV640EB 12
#define READ_INDICATOR_BIT_FOR_SECURITY_SECTOR 13 // Factory locked code: 88h. Factory unlocked code: 08h.
#define NOP 255
byte setMode(byte mode);
byte deviceMode = 0;
byte counter = 0;
uint64_t time_1 = 0;
uint64_t time_2 = 0;
uint64_t time_3 = 0;
//byte flags = 255;
//boolean ready = true;
void setup() {
Serial.begin(115200);
pinMode(NBY, INPUT_PULLUP); // RY/BY#. Device ready flag.
pinMode(NBYTE, OUTPUT); // BYTE#. Word/Byte Selection.
pinMode(NWE, OUTPUT); // WE#. Write Enable flag.
pinMode(NCE, OUTPUT); // CE#. Chip Enable flag.
pinMode(NOE, OUTPUT); // OE#. Output Enable flag.
pinMode(NRESET, OUTPUT); // RESET#. Hardware Reset Pin, Active Low
pinMode(NWP, OUTPUT); // WP#. Hardware Write Protect/Programming Acceleration.
pinMode(NOE_Vhv, OUTPUT); // OE#. High voltage.
pinMode(NRESET_Vhv, OUTPUT); // RESET#. High voltage.
pinMode(NWP_Vhv, OUTPUT); // WP#. High voltage.
pinMode(A9_Vhv, OUTPUT); // A9. High voltage.
}
void loop() {
Serial.print("deviceMode = ");
Serial.println(deviceMode);
Serial.println(setMode(deviceMode));
delay(500);
// deviceMode = (deviceMode + 1) % 15;
deviceMode = deviceMode + 1;
deviceMode = (deviceMode < 14) ? deviceMode : 255;
//time_1 = micros();
//time_3 = micros();
//time_3 = micros();
//time_2 = micros();
//Serial.println(int(time_2 - time_1));
}
byte setMode(byte mode) {
// Serial.println();
if (bitRead(ARDUINO_PIN_TO_AVR_PORT(NBY), (ARDUINO_PIN_TO_AVR_PIN(NBY))) & mode != DEVICE_RESET) {
return 255;
}
switch (mode) {
case DEVICE_RESET: //0
Serial.println("DEVICE_RESET");
return 0;
case STANDBY_MODE: //1
Serial.println("STANDBY_MODE");
return 0;
case OUTPUT_DISABLE: //2
Serial.println("OUTPUT_DISABLE");
return 0;
case READ_MODE: //3
Serial.println("READ_MODE");
return 0;
case WRITE: //4
Serial.println("WRITE");
return 0;
case ACCELERATE_PROGRAM: //5
Serial.println("ACCELERATE_PROGRAM");
return 0;
case TEMPORARY_SECTOR_GROUP_UNPROTECT: //6
Serial.println("TEMPORARY_SECTOR_GROUP_UNPROTECT");
return 0;
case SECTOR_GROUP_PROTECT: //7
Serial.println("SECTOR_GROUP_PROTECT");
return 0;
case CHIP_UNPROTECT: //8
Serial.println("CHIP_UNPROTECT");
return 0;
case SECTOR_LOCK_STATUS_VERIFICATION: //9
Serial.println("SECTOR_LOCK_STATUS_VERIFICATION");
return 0;
case READ_SILICON_ID_MANUFACTURER_CODE: //10
Serial.println("READ_SILICON_ID_MANUFACTURER_CODE");
return 0;
case READ_SILICON_ID_MX29LV640ET: //11
Serial.println("READ_SILICON_ID_MX29LV640ET");
return 0;
case READ_SILICON_ID_MX29LV640EB: //12
Serial.println("READ_SILICON_ID_MX29LV640EB");
return 0;
case READ_INDICATOR_BIT_FOR_SECURITY_SECTOR: //13
Serial.println("READ_INDICATOR_BIT_FOR_SECURITY_SECTOR");
return 0;
case NOP: //255
default:
Serial.println("NOP");
_NOP();
return 0;
}
}