Kód: Vybrat vše
#include <SPI.h>
#define csPIN 10
#define posPIN 9
#define negPIN 8
#define WREN 6
#define WRDI 4
#define RDSR 5
#define WRSR 1
#define READ 3
#define WRITE 2
#define EEPROMSIZE 512
int8_t intValueOfHexaKey(char c)
{
if ((c >= '0') && (c <= '9')) return c - '0';
if ((c >= 'A') && (c <= 'F')) return c - 'A' + 10;
return -1;
}
uint8_t readByteAt(uint8_t cs, uint16_t adr)
{
SPI.beginTransaction(SPISettings(20000000, MSBFIRST, SPI_MODE0));
digitalWrite(cs, LOW);
uint8_t b = highByte(adr);
b = b << 3;
b = b | READ;
SPI.transfer(b);
SPI.transfer(lowByte(adr));
b = SPI.transfer(0);
digitalWrite(cs, HIGH);
SPI.endTransaction();
return b;
}
//end
uint8_t writeByteAt(uint8_t cs, uint16_t adr, char d)
{
SPI.beginTransaction(SPISettings(20000000, MSBFIRST, SPI_MODE0));
digitalWrite(cs, LOW);
SPI.transfer(WREN);
digitalWrite(cs, HIGH);
delay(10);
digitalWrite(cs, LOW);
uint8_t a = highByte(adr);
a = a << 3;
a = a | WRITE;
SPI.transfer(a);
SPI.transfer(lowByte(adr));
a = SPI.transfer(d);
digitalWrite(cs, HIGH);
delay(15);
SPI.endTransaction();
return a;
}
//end
//setup
void setup()
{
Serial.begin(9600);
digitalWrite(csPIN, HIGH);
pinMode(csPIN, OUTPUT);
pinMode(posPIN, OUTPUT);
digitalWrite(posPIN, HIGH);
pinMode(negPIN, OUTPUT);
digitalWrite(negPIN, LOW);
SPI.begin();
Serial.setTimeout(7000);
}
//main loop
void loop()
{
if (Serial.available() > 0)
{
char command = Serial.read();
if (command == '1')
{
digitalWrite(posPIN, LOW);
digitalWrite(negPIN, HIGH);
delay(20);
char ch[30];
for (uint16_t i = 0; i < EEPROMSIZE; i++)
{
sprintf(ch, "%02X", readByteAt(csPIN, i));
Serial.print(ch);
}
digitalWrite(negPIN, LOW);
digitalWrite(posPIN, HIGH);
}
else if (command == '2')
{
digitalWrite(posPIN, LOW);
digitalWrite(negPIN, HIGH);
delay(5);
while(Serial.available() > 0){
Serial.read();
}
delay(50);
char dump[EEPROMSIZE];
char readData[EEPROMSIZE * 2];
Serial.readBytes(readData, EEPROMSIZE * 2);
for (int i = 0; i < EEPROMSIZE; i++)
{
dump[i] = intValueOfHexaKey(readData[i*2+1]) + 16 * intValueOfHexaKey(readData[i*2]);
Serial.print(dump[i]);
}
char ch[30];
for (int i = 0; i < EEPROMSIZE; i++)
{
sprintf(ch,"%02X",writeByteAt(csPIN,i,dump[i]));
}
delay(500);
digitalWrite(negPIN, LOW);
digitalWrite(posPIN, HIGH);
}
}
delay(10);
}