#define WREN 0x06 // write enable #define WRITE 0x02 #define READ 0x03 #define READSTATUS 0x05 const int writeCycle = 15; const int csDriverEEPROM = 27; //PA07 const int csSensorAVR128 = 28; //PB22 //SPI EEPROM void eepromWriteEnable(uint8_t csPin); void eepromWriteUINT8(uint8_t addr, uint8_t value, uint8_t csPin); void avrWriteEEPROM32(uint8_t addr, uint32_t value); void setup(){ pinMode(csSensorAVR128, OUTPUT); digitalWrite(csSensorAVR128, HIGH); Serial1.begin(115200); while (!Serial); Serial1.println("TEST"); SPI.begin(); SPI.setDataMode(SPI_MODE0); //DA@ CPOL = 0 and CPHA = 0 SERCOM0 Register CTRLA pinMode (csDriverEEPROM, OUTPUT); digitalWrite(csDriverEEPROM, HIGH); //PA07 digitalWrite(csDriverEEPROM, LOW); delay(20); digitalWrite(csDriverEEPROM, HIGH); uint8_t SpiEEPromAddr = 1; uint8_t relaycounter = 0x00; uint8_t status = eepromReadStatus(csDriverEEPROM); //************************************************* SPI EEPROM *********************************************************************** for(uint8_t i = 0; i < 255; i++) { eepromWriteUINT8(SpiEEPromAddr, relaycounter, csDriverEEPROM); //SPI EEPROM Serial1.print("EEPROM: writing "); Serial1.print(relaycounter,HEX); Serial1.print(" to "); Serial1.print(SpiEEPromAddr,HEX); Serial1.println("... Done"); SpiEEPromAddr++; relaycounter++; delay(1); } relaycounter = 0; SpiEEPromAddr = 0; for(uint8_t i = 0; i < 255; i++) { delay(2); relaycounter = eepromReadUINT8(SpiEEPromAddr, csDriverEEPROM); SpiEEPromAddr++; Serial1.print("EEPROM: reading "); Serial1.print(relaycounter,HEX); Serial1.print(" from "); Serial1.println(SpiEEPromAddr,HEX); } } //--------------------------SPI fn--------------------------------------- void eepromWriteEnable(uint8_t csPin){ digitalWrite(csPin, LOW); SPI.transfer(WREN); for (uint8_t i=0; i<32;i++) { __NOP; } digitalWrite(csPin, HIGH); } //----------------------------------------------------------------- void eepromWriteUINT8(uint8_t addr, uint8_t value, uint8_t csPin){ //eepromWriteEnable(csPin); // If you want to change the SPI clock speed, uncomment the following line and adjust //SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0)); //value = eepromReadStatus(csPin); uint8_t temp; eepromWriteEnable(csPin); temp = eepromReadStatus(csPin); while(temp == 0xF8) { temp = eepromReadStatus(csPin); }; delay(1); digitalWrite(csPin, LOW); delay(1); SPI.transfer(WRITE); SPI.transfer(addr); SPI.transfer(value); delay(1); digitalWrite(csPin, HIGH); delay(1); temp = eepromReadStatus(csPin); while(temp == 0xFB) { temp = eepromReadStatus(csPin); }; //SPI.endTransaction(); // Uncomment if you have uncommented SPI.beginTransaction() delay(writeCycle); } //----------------------------------------------------------------- uint8_t eepromReadUINT8(uint8_t addr, uint8_t csPin){ uint8_t value = 0; //SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0)); digitalWrite(csPin, LOW); delay(1); SPI.transfer(READ); SPI.transfer(addr); value = SPI.transfer(0x00); delay(1); digitalWrite(csPin, HIGH); delay(1); //SPI.endTransaction(); return value; } //----------------------------------------------------------------- uint8_t eepromReadStatus(uint8_t csPin) { uint8_t value = 0; uint8_t value1 = 0; //SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0)); digitalWrite(csPin, LOW); delay(1); SPI.transfer(READSTATUS); delay(1); value = SPI.transfer(0x00); delay(1); digitalWrite(csPin, HIGH); //SPI.endTransaction(); return value; } //----------------------------------------------------------------- void delay(uint32_t delayms) { while(delayms--) { //1ms for(uint32_t i = 0; i < 5000; i++) { __ASM volatile ("nop"); } } }