void sysRead(uint8_t *dest, uint16_t addr, uint16_t count) { uint8_t oldRFIE = RFIE; uint16_t PageCounter = 0; RFIE = 0; do { EES_nCS = 0; MacroNop(); EESPIPut(SPI_RD_STATUS); PageCounter = EESPIGet(); EES_nCS = 1; MacroNop(); } while(PageCounter & 0x01 ); EES_nCS = 0; EESPIPut(SPI_READ); EESPIPut(0x01); // allow system settings for second bank EESPIPut(addr >> 8); EESPIPut(addr); while( count > 0 ) { *dest++ = EESPIGet(); count--; } EES_nCS = 1; RFIE = oldRFIE; }
void spieepromWrite(uint8_t *source, uint16_t addr, uint16_t count) { uint8_t statusReg = 0; uint8_t oldGIE = INTCONbits.GIE; INTCONbits.GIE = 0; EEPROM_NEXT_PAGE: do { EE_nCS = 0; EESPIPut(SPI_RDSR); statusReg = EESPIGet(); EE_nCS = 1; Nop(); } while (statusReg & 0x01); EE_nCS = 0; EESPIPut(SPI_WREN); EE_nCS = 1; Nop(); EE_nCS = 0; #if MCHP_EEPROM < MCHP_4KBIT EESPIPut(SPI_WRITE); EESPIPut(addr); #elif MCHP_EEPROM == MCHP_4KBIT if (addr > 0xFF) { EESPIPut(SPI_WRITE | 0x08); } else { EESPIPut(SPI_WRITE); } EESPIPut(addr); #elif MCHP_EEPROM < MCHP_1MBIT EESPIPut(SPI_WRITE); EESPIPut(addr >> 8); EESPIPut(addr); #endif statusReg = 0; while (count > 0) { EESPIPut(*source++); count--; statusReg++; if (((addr + statusReg) & (NVM_PAGE_SIZE - 1)) == 0) { EE_nCS = 1; addr += statusReg; goto EEPROM_NEXT_PAGE; } } EE_nCS = 1; Nop(); // waiting for write finish do { EE_nCS = 0; EESPIPut(SPI_RDSR); statusReg = EESPIGet(); EE_nCS = 1; Nop(); } while (statusReg & 0x01); INTCONbits.GIE = oldGIE; }
void spieepromRead(uint8_t *dest, uint16_t addr, uint16_t count) { uint8_t oldGIEH = INTCONbits.GIE; INTCONbits.GIE = 0; EE_nCS = 0; #if MCHP_EEPROM < MCHP_4KBIT EESPIPut(SPI_READ); EESPIPut(addr); #elif MCHP_EEPROM == MCHP_4KBIT if (addr > 0xFF) { EESPIPut(SPI_READ | 0x08); } else { EESPIPut(SPI_READ); } EESPIPut(addr); #elif MCHP_EEPROM < MCHP_1MBIT EESPIPut(SPI_READ); EESPIPut(addr >> 8); EESPIPut(addr); #endif while (count > 0) { *dest++ = EESPIGet(); count--; } EE_nCS = 1; INTCONbits.GIE = oldGIEH; }
uint16_t sysDiff(uint8_t *dest, uint16_t addr, uint16_t count) { uint8_t oldRFIE = RFIE; RFIE = 0; EES_nCS = 0; EESPIPut(SPI_READ); EESPIPut(0x01); // allow system settings for second bank EESPIPut(addr >> 8); EESPIPut(addr); while( count > 0 ) { if(*dest++ != EESPIGet()) { EES_nCS = 1; RFIE = oldRFIE; return (count&0xFF); } count--; } EES_nCS = 1; RFIE = oldRFIE; return 0; }
void sysErase() { uint32_t addr = 0; uint32_t count = 0x20000; uint16_t PageCounter = 0; uint8_t oldRFIE = RFIE; RFIE = 0; EEPROM_NEXT_PAGE: do { EES_nCS = 0; MacroNop(); EESPIPut(SPI_RD_STATUS); PageCounter = EESPIGet(); EES_nCS = 1; MacroNop(); } while(PageCounter & 0x01 ); EES_nCS = 0; MacroNop(); EESPIPut(SPI_EN_WRT); EES_nCS = 1; MacroNop(); EES_nCS = 0; MacroNop(); EESPIPut(SPI_WRITE); EESPIPut(addr >> 16); // allow system settings for second bank EESPIPut(addr >> 8); EESPIPut(addr); PageCounter = 0; while( count > 0 ) { EESPIPut(0xFF); count--; PageCounter++; if( ((addr + PageCounter) & (NVM_PAGE_SIZE-1)) == 0 ) { EES_nCS = 1; addr += PageCounter; goto EEPROM_NEXT_PAGE; } } EES_nCS = 1; RFIE = oldRFIE; }
/********************************************************************* * Function: void NVMRead(BYTE *dest, BYTE addr, BYTE count) * * PreCondition: SPI port has been initialized * * Input: dest - pointer to the buffer to hold the read data * addr - starting address for the read * count - total number of bytes to be read * * Output: none * * Side Effects: none * * Overview: This function will read count byte of data starting * from address addr, and store the read data to the * buffer starting from *dest. * * Note: None ********************************************************************/ void NVMRead(BYTE *dest, WORD addr, WORD count) { #if defined(__18CXX) BYTE oldGIEH = INTCONbits.GIEH; INTCONbits.GIEH = 0; #else BYTE oldRFIE = RFIE; RFIE = 0; #endif EE_nCS = 0; #if MCHP_EEPROM < MCHP_4KBIT EESPIPut(SPI_READ); EESPIPut(addr); #elif MCHP_EEPROM == MCHP_4KBIT if( addr > 0xFF ) { EESPIPut(SPI_READ | 0x08); } else { EESPIPut(SPI_READ); } EESPIPut(addr); #elif MCHP_EEPROM < MCHP_1MBIT EESPIPut(SPI_READ); EESPIPut(addr>>8); EESPIPut(addr); #endif while( count > 0 ) { *dest++ = EESPIGet(); count--; } EE_nCS = 1; #if defined(__18CXX) INTCONbits.GIEH = oldGIEH; #else RFIE = oldRFIE; #endif }
void NVMRead(uint8_t *dest, uint16_t addr, uint16_t count) { uint8_t oldRFIE = RFIE; RFIE = 0; EES_nCS = 0; EESPIPut(SPI_READ); EESPIPut(0x00); // allow MIWI for first bank EESPIPut(addr >> 8); EESPIPut(addr); while( count > 0 ) { *dest++ = EESPIGet(); count--; } EES_nCS = 1; RFIE = oldRFIE; }
void NVMWrite(BYTE *source, WORD addr, WORD count) { BYTE PageCounter = 0; //BYTE i; #if defined(__18CXX) BYTE oldGIEH = INTCONbits.GIEH; INTCONbits.GIEH = 0; #else BYTE oldRFIE = RFIE; RFIE = 0; #endif EEPROM_NEXT_PAGE: do { EE_nCS = 0; EESPIPut(SPI_RD_STATUS); PageCounter = EESPIGet(); EE_nCS = 1; MacroNop(); } while(PageCounter & 0x01 ); EE_nCS = 0; EESPIPut(SPI_EN_WRT); EE_nCS = 1; MacroNop(); EE_nCS = 0; #if MCHP_EEPROM < MCHP_4KBIT EESPIPut(SPI_WRITE); EESPIPut(addr); #elif MCHP_EEPROM == MCHP_4KBIT if( addr > 0xFF ) { EESPIPut(SPI_WRITE | 0x08); } else { EESPIPut(SPI_WRITE); } EESPIPut(addr); #elif MCHP_EEPROM < MCHP_1MBIT EESPIPut(SPI_WRITE); EESPIPut(addr>>8); EESPIPut(addr); #endif PageCounter = 0; while( count > 0 ) { EESPIPut(*source++); count--; PageCounter++; if( ((addr + PageCounter) & (NVM_PAGE_SIZE-1)) == 0 ) { EE_nCS = 1; addr += PageCounter; goto EEPROM_NEXT_PAGE; } } EE_nCS = 1; #if defined(__18CXX) INTCONbits.GIEH = oldGIEH; #else RFIE = oldRFIE; #endif }