/********************************************************************* * Function: MPFS MPFSPutEnd(void) * * PreCondition: XEEBeginWrite() is already called. * * Input: None * * Output: None * * Side Effects: None * * Overview: None * * Note: Actual write may not get started until internal * write page is full. To ensure that previously * data gets written, caller must call MPFSPutEnd() * after last call to MPFSPut(). ********************************************************************/ void MPFSPutEnd(void) { #if defined(MPFS_USE_EEPROM) isMPFSLocked = FALSE; XEEEndWrite(); while(XEEIsBusy()); #endif }
/********************************************************************* * Function: MPFS MPFSPutEnd(void) * * PreCondition: MPFSPutBegin() is already called. * * Input: None * * Output: Up-to-date MPFS handle * * Side Effects: Original MPFS handle is no longer valid. * Updated MPFS handle must be obtained by calling * MPFSPutEnd(). * * Overview: None * * Note: Actual write may not get started until internal * write page is full. To ensure that previously * data gets written, caller must call MPFSPutEnd() * after last call to MPFSPut(). ********************************************************************/ MPFS MPFSPutEnd(void) { #if defined(MPFS_USE_EEPROM) _currentCount = 0; XEEEndWrite(); while(XEEIsBusy()); #endif return _currentHandle; }
/********************************************************************* * Function: MPFS MPFSPutEnd(void) * * PreCondition: MPFSPutBegin() is already called. * * Input: None * * Output: Up-to-date MPFS handle * * Side Effects: Original MPFS handle is no longer valid. * Updated MPFS handle must be obtained by calling * MPFSPutEnd(). * * Overview: None * * Note: Actual write may not get started until internal * write page is full. To ensure that previously * data gets written, caller must call MPFSPutEnd() * after last call to MPFSPut(). ********************************************************************/ MPFS MPFSPutEnd(void) { debug_mpfs(debug_mpfs_putc, "\r\nMPFSPutEnd() "); #if defined(MPFS_USE_EEPROM) _currentCount = 0; XEEEndWrite(); while(XEEIsBusy()); #elif defined(MPFS_USE_SPI_FLASH) SPIFlashStopWrite(); #endif return _currentHandle; }
static void DoWrite(void) { BYTE i; volatile BYTE vDummy; BYTE vSPIONSave; DWORD SPICON1Save; // Save SPI state SPICON1Save = EEPROM_SPICON1; vSPIONSave = SPI_ON_BIT; // Configure SPI SPI_ON_BIT = 0; EEPROM_SPICON1 = PROPER_SPICON1; SPI_ON_BIT = 1; // Set the Write Enable latch EEPROM_CS_IO = 0; EEPROM_SSPBUF = OPCODE_WREN; WaitForDataByte(); vDummy = EEPROM_SSPBUF; EEPROM_CS_IO = 1; // Send WRITE opcode EEPROM_CS_IO = 0; EEPROM_SSPBUF = OPCODE_WRITE; WaitForDataByte(); vDummy = EEPROM_SSPBUF; // Send address #if defined(USE_EEPROM_25LC1024) EEPROM_SSPBUF = ((DWORD_VAL*)&EEPROMAddress)->v[2]; WaitForDataByte(); vDummy = EEPROM_SSPBUF; #endif EEPROM_SSPBUF = ((DWORD_VAL*)&EEPROMAddress)->v[1]; WaitForDataByte(); vDummy = EEPROM_SSPBUF; EEPROM_SSPBUF = ((DWORD_VAL*)&EEPROMAddress)->v[0]; WaitForDataByte(); vDummy = EEPROM_SSPBUF; for(i = 0; i < vBytesInBuffer; i++) { // Send the byte to write EEPROM_SSPBUF = EEPROMBuffer[i]; WaitForDataByte(); vDummy = EEPROM_SSPBUF; } // Begin the write EEPROM_CS_IO = 1; // Update write address and clear write cache EEPROMAddress += vBytesInBuffer; vBytesInBuffer = 0; // Restore SPI State SPI_ON_BIT = 0; EEPROM_SPICON1 = SPICON1Save; SPI_ON_BIT = vSPIONSave; // Wait for write to complete while( XEEIsBusy() ); }
static void DoWrite(void) { uint8_t i; uint8_t vSPIONSave; #if defined(__XC8) uint8_t SPICON1Save; #elif defined(__XC16) uint16_t SPICON1Save; #else uint32_t SPICON1Save; #endif // Save SPI state SPICON1Save = EEPROM_SPICON1; vSPIONSave = SPI_ON_BIT; // Configure SPI SPI_ON_BIT = 0; EEPROM_SPICON1 = PROPER_SPICON1; SPI_ON_BIT = 1; // Set the Write Enable latch EEPROM_CS_IO = 0; EEPROM_SSPBUF = OPCODE_WREN; WaitForDataByte(); EEPROM_SSPBUF; EEPROM_CS_IO = 1; // Send WRITE opcode EEPROM_CS_IO = 0; EEPROM_SSPBUF = OPCODE_WRITE; WaitForDataByte(); EEPROM_SSPBUF; // Send address #if defined(USE_EEPROM_25LC1024) EEPROM_SSPBUF = ((TCPIP_UINT32_VAL*) & EEPROMAddress)->v[2]; WaitForDataByte(); EEPROM_SSPBUF; #endif EEPROM_SSPBUF = ((TCPIP_UINT32_VAL*) & EEPROMAddress)->v[1]; WaitForDataByte(); EEPROM_SSPBUF; EEPROM_SSPBUF = ((TCPIP_UINT32_VAL*) & EEPROMAddress)->v[0]; WaitForDataByte(); EEPROM_SSPBUF; for (i = 0; i < vBytesInBuffer; i++) { // Send the byte to write EEPROM_SSPBUF = EEPROMBuffer[i]; WaitForDataByte(); EEPROM_SSPBUF; } // Begin the write EEPROM_CS_IO = 1; // Update write address and clear write cache EEPROMAddress += vBytesInBuffer; vBytesInBuffer = 0; // Restore SPI State SPI_ON_BIT = 0; EEPROM_SPICON1 = SPICON1Save; SPI_ON_BIT = vSPIONSave; // Wait for write to complete while (XEEIsBusy()); }