#include <EEPROM.h>
//#define EPSIZE 252
#define EPSIZE 252
#define Red PA0
#define Blue PA1
//EEPROM(254Word)の定義
struct EPROM{
uint32_t crc32; // CRC
uint16_t data[EPSIZE]; // User Data
};
int readEPROM(EPROM* hoge) {
uint16 AddressWrite = 0x10;
uint16 Status;
uint16 Data;
uint32_t crc32;
Status = EEPROM.read(AddressWrite++, &Data);
Serial.print("read crc(0)=");
Serial.print(Data, HEX);
Serial.print(" : Status : ");
Serial.println(Status, HEX);
if (Status != 0) return Status;
crc32 = Data << 16;
Status = EEPROM.read(AddressWrite++, &Data);
Serial.print("read crc(1)=");
Serial.print(Data, HEX);
Serial.print(" : Status : ");
Serial.println(Status, HEX);
if (Status != 0) return Status;
crc32 = crc32 + Data;
hoge->crc32 = crc32;
for(int i=0;i<EPSIZE;i++) {
Status = EEPROM.read(AddressWrite,
&Data);
Serial.print("EEPROM.read(0x");
Serial.print(AddressWrite, HEX);
Serial.print(", &..) = 0x");
Serial.print(Data, HEX);
Serial.print(" : Status : ");
Serial.println(Status, HEX);
if (Status != 0) return Status;
hoge->data[i] = Data;
AddressWrite++;
}
return 0;
}
int writeEPROM(EPROM* hoge) {
uint16 AddressWrite = 0x10;
uint16 Status;
uint16 Data;
uint32_t crc32;
Serial.println("[writeEPROM]");
crc32 = hoge->crc32;
Data = (crc32 >> 16) & 0xffff;
Status = EEPROM.write(AddressWrite++, Data);
Serial.print("write crc(0)=");
Serial.print(Data, HEX);
Serial.print(" : Status : ");
Serial.println(Status, HEX);
if (Status != 0) return Status;
Data = crc32 & 0xffff;
Status = EEPROM.write(AddressWrite++, Data);
Serial.print("write crc(0)=");
Serial.print(Data, HEX);
Serial.print(" : Status : ");
Serial.println(Status, HEX);
if (Status != 0) return Status;
for(int i=0;i<EPSIZE;i++) {
Data = hoge->data[i];
Status = EEPROM.write(AddressWrite,
Data);
Serial.print("EEPROM.write(0x");
Serial.print(AddressWrite, HEX);
Serial.print(", &..) = 0x");
Serial.print(Data, HEX);
Serial.print(" : Status : ");
Serial.println(Status, HEX);
if (Status != 0) return Status;
AddressWrite++;
}
return 0;
}
// Calculate CRC
uint32_t calculateCRC32(const uint8_t *data, size_t
length)
{
uint32_t crc = 0xffffffff;
while (length--) {
uint8_t c = *data++;
for (uint32_t i = 0x80; i > 0; i
>>= 1) {
bool bit = crc &
0x80000000;
if (c & i) {
bit = !bit;
}
crc <<= 1;
if (bit) {
crc ^=
0x04c11db7;
}
}
}
return crc;
}
void setup() {
struct EPROM romData;
delay(1000);
Serial.begin(9600);
pinMode(Blue,OUTPUT);
pinMode(Red,OUTPUT);
digitalWrite(Blue,LOW);
digitalWrite(Red,LOW);
uint32_t crcOfData;
readEPROM(&romData);
crcOfData = calculateCRC32(((uint8_t*)
&romData) + 4, sizeof(romData) - 4);
Serial.print("CRC32 of calculate: ");
Serial.println(crcOfData, HEX);
Serial.print("CRC32 read from EEPROM: ");
Serial.println(romData.crc32, HEX);
if (crcOfData == romData.crc32) {
Serial.println("CRC is Valid!!");
while(1) {
digitalWrite(Blue,HIGH);
delay(100);
digitalWrite(Blue,LOW);
delay(100);
}
} else {
Serial.println("CRC is InValid!!");
romData.crc32 = crcOfData;
writeEPROM(&romData);
while(1) {
digitalWrite(Red,HIGH);
delay(100);
digitalWrite(Red,LOW);
delay(100);
}
}
}
void loop() {
// put your main code here, to run repeatedly:
}
|