📄 spieeprom.c
字号:
EEPROM_CS_IO = 0;
// Send READ opcode
EEPROM_SSPBUF = READ;
while(!EEPROM_SPI_IF);
Dummy = EEPROM_SSPBUF;
EEPROM_SPI_IF = 0;
// Send address
EEPROM_SSPBUF = ((WORD_VAL*)&address)->v[1];
while(!EEPROM_SPI_IF);
Dummy = EEPROM_SSPBUF;
EEPROM_SPI_IF = 0;
EEPROM_SSPBUF = ((WORD_VAL*)&address)->v[0];
while(!EEPROM_SPI_IF);
Dummy = EEPROM_SSPBUF;
EEPROM_SPI_IF = 0;
while(length--)
{
EEPROM_SSPBUF = 0;
while(!EEPROM_SPI_IF);
*buffer++ = EEPROM_SSPBUF;
EEPROM_SPI_IF = 0;
};
EEPROM_CS_IO = 1;
// Restore SPI state
EEPROM_SPICON1 = SPICON1Save;
return XEE_SUCCESS;
}
/*********************************************************************
* Function: XEE_RESULT XEESetAddr(unsigned char control,
* XEE_ADDR address)
*
* PreCondition: XEEInit() is already called.
*
* Input: control - data EEPROM control code
* address - address to be set for writing
*
* Output: XEE_SUCCESS if successful
* other value if failed.
*
* Side Effects: None
*
* Overview: Modifies internal address counter of EEPROM.
*
* Note: Unlike XEESetAddr() in xeeprom.c for I2C EEPROM
* memories, this function is used only for writing
* to the EEPROM. Reads must use XEEBeginRead(),
* XEERead(), and XEEEndRead().
* This function does not release the SPI bus.
* User must close XEEClose() after this function
* is called.
********************************************************************/
XEE_RESULT XEESetAddr(unsigned char control, XEE_ADDR address)
{
EEPROMAddress = address;
EEPROMBufferPtr = EEPROMBuffer;
return XEE_SUCCESS;
}
/*********************************************************************
* Function: XEE_RESULT XEEWrite(unsigned char val)
*
* PreCondition: XEEInit() && XEEBeginWrite() are already called.
*
* Input: val - Byte to be written
*
* Output: XEE_SUCCESS
*
* Side Effects: None
*
* Overview: Adds a byte to the current page to be writen when
* XEEEndWrite() is called.
*
* Note: Page boundary cannot be exceeded or the byte
* to be written will be looped back to the
* beginning of the page.
********************************************************************/
XEE_RESULT XEEWrite(unsigned char val)
{
*EEPROMBufferPtr++ = val;
if( EEPROMBufferPtr == EEPROMBuffer + EEPROM_BUFFER_SIZE )
{
DoWrite();
}
return XEE_SUCCESS;
}
/*********************************************************************
* Function: XEE_RESULT XEEEndWrite(void)
*
* PreCondition: XEEInit() && XEEBeginWrite() are already called.
*
* Input: None
*
* Output: XEE_SUCCESS if successful
* other value if failed.
*
* Side Effects: None
*
* Overview: Instructs EEPROM to begin write cycle.
*
* Note: Call this function after either page full of bytes
* written or no more bytes are left to load.
* This function initiates the write cycle.
* User must call for XEEIsBusy() to ensure that write
* cycle is finished before calling any other
* routine.
********************************************************************/
XEE_RESULT XEEEndWrite(void)
{
if( EEPROMBufferPtr != EEPROMBuffer )
{
DoWrite();
}
return XEE_SUCCESS;
}
void DoWrite(void)
{
BYTE Dummy;
BYTE BytesToWrite;
#if defined(__18CXX)
BYTE SPICON1Save;
#else
WORD SPICON1Save;
#endif
// Save SPI state (clock speed)
SPICON1Save = EEPROM_SPICON1;
EEPROM_SPICON1 = PROPER_SPICON1;
// Set the Write Enable latch
EEPROM_CS_IO = 0;
EEPROM_SSPBUF = WREN;
while(!EEPROM_SPI_IF);
Dummy = EEPROM_SSPBUF;
EEPROM_SPI_IF = 0;
EEPROM_CS_IO = 1;
// Send WRITE opcode
EEPROM_CS_IO = 0;
EEPROM_SSPBUF = WRITE;
while(!EEPROM_SPI_IF);
Dummy = EEPROM_SSPBUF;
EEPROM_SPI_IF = 0;
// Send address
EEPROM_SSPBUF = ((WORD_VAL*)&EEPROMAddress)->v[1];
while(!EEPROM_SPI_IF);
Dummy = EEPROM_SSPBUF;
EEPROM_SPI_IF = 0;
EEPROM_SSPBUF = ((WORD_VAL*)&EEPROMAddress)->v[0];
while(!EEPROM_SPI_IF);
Dummy = EEPROM_SSPBUF;
EEPROM_SPI_IF = 0;
BytesToWrite = (BYTE)(EEPROMBufferPtr - EEPROMBuffer);
EEPROMAddress += BytesToWrite;
EEPROMBufferPtr = EEPROMBuffer;
while(BytesToWrite--)
{
// Send the byte to write
EEPROM_SSPBUF = *EEPROMBufferPtr++;
while(!EEPROM_SPI_IF);
Dummy = EEPROM_SSPBUF;
EEPROM_SPI_IF = 0;
}
// Begin the write
EEPROM_CS_IO = 1;
EEPROMBufferPtr = EEPROMBuffer;
// Restore SPI State
EEPROM_SPICON1 = SPICON1Save;
// Wait for write to complete
while( XEEIsBusy(0) );
}
/*********************************************************************
* Function: XEE_RESULT XEEIsBusy(unsigned char control)
*
* PreCondition: XEEInit() is already called.
*
* Input: control - EEPROM control and address code.
*
* Output: XEE_READY if EEPROM is not busy
* XEE_BUSY if EEPROM is busy
* other value if failed.
*
* Side Effects: None
*
* Overview: Requests ack from EEPROM.
*
* Note: None
********************************************************************/
XEE_RESULT XEEIsBusy(unsigned char control)
{
BYTE_VAL result;
#if defined(__18CXX)
BYTE SPICON1Save;
#else
WORD SPICON1Save;
#endif
// Save SPI state (clock speed)
SPICON1Save = EEPROM_SPICON1;
EEPROM_SPICON1 = PROPER_SPICON1;
EEPROM_CS_IO = 0;
// Send RDSR - Read Status Register opcode
EEPROM_SSPBUF = RDSR;
while(!EEPROM_SPI_IF);
result.Val = EEPROM_SSPBUF;
EEPROM_SPI_IF = 0;
// Get register contents
EEPROM_SSPBUF = 0;
while(!EEPROM_SPI_IF);
result.Val = EEPROM_SSPBUF;
EEPROM_SPI_IF = 0;
EEPROM_CS_IO = 1;
// Restore SPI State
EEPROM_SPICON1 = SPICON1Save;
return result.bits.b0 ? XEE_BUSY : XEE_SUCCESS;
}
#endif //#if defined(MPFS_USE_EEPROM)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -