Awesome that code worked! I incorporated the general idea into my design.
Here's the problem now, writing is being a pain. I have proved that I can read and write to the status register, but the actual execution of my write isn't being committed.
"Single Loop Print Log"
w // Entering Write statement
// Enable Write
Status Register=0x02 // Inital Status Register Result
Status Register=0x02 // Enable Write Latch
Status Register=0x8C // Turn on all bits in Status Register (write santity check)
Status Register=0x8E // Enable Write Latch
Status Register=0x00 // Turn off block protection bits and WPEN (Write-Protect Enable)
// Turn Enable Write Latch back on
Now Writing
Status Register=0x02 // Pre Write Check
Status Register=0x02 // Post Write Check <- This should be 0x00 after a write??
r0x1110: 0x00 // Read result
I'm not sure if I'm missing something or if the timing is just off.
The only Write Protection should be the hardware pin and control register bit. Both should be configured properly.
This is per the datasheet. I still need to scope out what is actually being sent.

TWC (Internal Write) is rated for 5ms. I'm waiting for at least 10ms.
Latest Code
#include <SPI.h>
#define WP 8
#define HOLD 9
#define SCK 13
#define MOSI 11
#define MISO 12
#define CS 10
#define READ 0x03 // Read data from memory array beginning at selected address
#define WRITE 0x02 // Write data to memory array at beginning of selected address
#define WREN 0x06 // Set the write enable latch (enable write operations)
#define WRDI 0x04 // Reset the write enable latch (disable write operations)
#define RDSR 0x05 // Read Status register
#define WRSR 0x01 // Write STATUS register
uint8_t b;
uint8_t data[256];
double SPI_Speed = 10000;
char ch[30];
uint8_t counter = 0;
uint8_t readStatusRegister(boolean verbose=false) {
SPI.beginTransaction(SPISettings(SPI_Speed,MSBFIRST,SPI_MODE0));
digitalWrite(CS, LOW); // Select EEPROM Chip
SPI.transfer(0b00000101);
b = SPI.transfer(0xFF);
digitalWrite(CS,HIGH);
SPI.endTransaction();
delay(10);
if (verbose) {
sprintf(ch, "\nStatus Register=0x%02X", readStatusRegister());
Serial.print(ch);
}
return b;
}
void writeEnable() {
digitalWrite(WP, HIGH); // Turn off WP
readStatusRegister(true);
SPI.beginTransaction(SPISettings(SPI_Speed,MSBFIRST,SPI_MODE0));
digitalWrite(CS, LOW); // Write Enable latch
SPI.transfer(WREN);
digitalWrite(CS, HIGH);
SPI.endTransaction();
readStatusRegister(true); // 0x02 WEL should be high
SPI.beginTransaction(SPISettings(SPI_Speed,MSBFIRST,SPI_MODE0)); // Write to status register
digitalWrite(CS, LOW); // Write to status register
SPI.transfer(WRSR);
SPI.transfer(0xFF); // Leave all address open to change
digitalWrite(CS, HIGH);
SPI.endTransaction();
readStatusRegister(true); // 0x8C All bits high except WIP and WEL
SPI.beginTransaction(SPISettings(SPI_Speed,MSBFIRST,SPI_MODE0));
digitalWrite(CS, LOW); // Write Enable latch
SPI.transfer(WREN);
digitalWrite(CS, HIGH);
SPI.endTransaction();
readStatusRegister(true); // 0x8E All bits high except WIP
SPI.beginTransaction(SPISettings(SPI_Speed,MSBFIRST,SPI_MODE0)); // Write to status register
digitalWrite(CS, LOW); // Write to status register
SPI.transfer(WRSR);
SPI.transfer(0x00); // Leave all address open to change
digitalWrite(CS, HIGH);
SPI.endTransaction();
readStatusRegister(true); // Effective Clear
SPI.beginTransaction(SPISettings(SPI_Speed,MSBFIRST,SPI_MODE0));
digitalWrite(CS, LOW); // Write Enable latch
SPI.transfer(WREN);
digitalWrite(CS, HIGH);
SPI.endTransaction();
}
void writeDisable() {
SPI.beginTransaction(SPISettings(SPI_Speed,MSBFIRST,SPI_MODE0));
digitalWrite(CS, LOW); // Reset the enable latch
SPI.transfer(WRSR);
SPI.transfer(0x8C); // Prevent writes
digitalWrite(CS,HIGH);
SPI.endTransaction();
SPI.beginTransaction(SPISettings(SPI_Speed,MSBFIRST,SPI_MODE0));
digitalWrite(CS, LOW); // Reset the enable latch
SPI.transfer(WRDI);
digitalWrite(CS,HIGH);
SPI.endTransaction();
digitalWrite(WP, LOW);
delay(10);
}
void writeData(uint16_t address, uint8_t value) {
writeEnable();
Serial.print("\nNow Writing ");
readStatusRegister(true);
SPI.beginTransaction(SPISettings(SPI_Speed,MSBFIRST,SPI_MODE0));
digitalWrite(CS, LOW); // Select EEPROM Chip
SPI.transfer(WRITE); // WRITE command
SPI.transfer(address); // Specify address
SPI.transfer(0xCC);
digitalWrite(CS, HIGH); // Disable EEPROM Chip
SPI.endTransaction();
readStatusRegister(true);
delay(10); // wait for TWS (internal write)
//writeDisable();
}
uint8_t readData(uint16_t address) {
SPI.beginTransaction(SPISettings(SPI_Speed,MSBFIRST,SPI_MODE0));
digitalWrite(CS, LOW); // Select EEPROM Chip
SPI.transfer(READ); // READ command
SPI.transfer(address >> 3); // Specify address
b = SPI.transfer(0xFF); // Value at address
digitalWrite(CS, HIGH); // Disable EEPROM Chip
SPI.endTransaction();
return b;
}
void setup() {
// put your setup code here, to run once:
Serial.begin(19200);
pinMode(HOLD, OUTPUT);
pinMode(CS, OUTPUT);
pinMode(WP, OUTPUT);
digitalWrite(WP, LOW); // Disable Write
digitalWrite(HOLD, HIGH); // Run active - Do not hold
digitalWrite(CS, LOW); // A High-Low Transistion required
digitalWrite(CS, HIGH); // prior to operation
digitalWrite(CS, LOW); // A High-Low Transistion required
SPI.begin();
readStatusRegister(true);
digitalWrite(WP, HIGH); // Enable Write
writeDisable(); // Disable Software Write
readStatusRegister(true);
writeEnable(); // Enable Software Write
digitalWrite(WP, LOW); // Disable Hardware Write
readStatusRegister(true);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.print("\nr");
data[0] = readData(0x1111); // Read data at 0x1111
Serial.print("0x1110: ");
sprintf(ch," 0x%02X",data[0]); // Print values within page
Serial.print(ch);
Serial.print("\nw");
delay(1000);
writeData(0x1111, 0xCC); // Write 0xCC to address 0x1111
delay(1000);
}```