106 lines
3.1 KiB
C
106 lines
3.1 KiB
C
#include "25LC256.h"
|
|
|
|
void initSPI(void) {
|
|
SPI_SS_DDR |= (1 << SPI_SS); /* set SS output */
|
|
SPI_SS_PORT |= (1 << SPI_SS); /* start off not selected (high) */
|
|
|
|
SPI_MOSI_DDR |= (1 << SPI_MOSI); /* output on MOSI */
|
|
SPI_MISO_PORT |= (1 << SPI_MISO); /* pullup on MISO */
|
|
SPI_SCK_DDR |= (1 << SPI_SCK); /* output on SCK */
|
|
|
|
/* Don't have to set phase, polarity b/c
|
|
default works with 25LCxxx chips */
|
|
SPCR |= (1 << SPR1); /* div 16, safer for breadboards */
|
|
SPCR |= (1 << MSTR); /* clockmaster */
|
|
SPCR |= (1 << SPE); /* enable */
|
|
}
|
|
|
|
void SPI_tradeByte(uint8_t byte) {
|
|
SPDR = byte; /* SPI starts sending immediately */
|
|
loop_until_bit_is_set(SPSR, SPIF); /* wait until done */
|
|
/* SPDR now contains the received byte */
|
|
}
|
|
|
|
void EEPROM_send16BitAddress(uint16_t address) {
|
|
SPI_tradeByte((uint8_t) (address >> 8)); /* most significant byte */
|
|
SPI_tradeByte((uint8_t) address); /* least significant byte */
|
|
}
|
|
|
|
uint8_t EEPROM_readStatus(void) {
|
|
SLAVE_SELECT;
|
|
SPI_tradeByte(EEPROM_RDSR);
|
|
SPI_tradeByte(0); /* clock out eight bits */
|
|
SLAVE_DESELECT;
|
|
return (SPDR); /* return the result */
|
|
}
|
|
|
|
void EEPROM_writeEnable(void) {
|
|
SLAVE_SELECT;
|
|
SPI_tradeByte(EEPROM_WREN);
|
|
SLAVE_DESELECT;
|
|
}
|
|
|
|
uint8_t EEPROM_readByte(uint16_t address) {
|
|
SLAVE_SELECT;
|
|
SPI_tradeByte(EEPROM_READ);
|
|
EEPROM_send16BitAddress(address);
|
|
SPI_tradeByte(0);
|
|
SLAVE_DESELECT;
|
|
return (SPDR);
|
|
}
|
|
|
|
uint16_t EEPROM_readWord(uint16_t address) {
|
|
uint16_t eepromWord;
|
|
SLAVE_SELECT;
|
|
SPI_tradeByte(EEPROM_READ);
|
|
EEPROM_send16BitAddress(address);
|
|
SPI_tradeByte(0);
|
|
eepromWord = SPDR;
|
|
eepromWord = (eepromWord << 8); /* most-sig bit */
|
|
SPI_tradeByte(0);
|
|
eepromWord += SPDR; /* least-sig bit */
|
|
SLAVE_DESELECT;
|
|
return (eepromWord);
|
|
}
|
|
|
|
void EEPROM_writeByte(uint16_t address, uint8_t byte) {
|
|
EEPROM_writeEnable();
|
|
SLAVE_SELECT;
|
|
SPI_tradeByte(EEPROM_WRITE);
|
|
EEPROM_send16BitAddress(address);
|
|
SPI_tradeByte(byte);
|
|
SLAVE_DESELECT;
|
|
while (EEPROM_readStatus() & _BV(EEPROM_WRITE_IN_PROGRESS)) {;
|
|
}
|
|
}
|
|
|
|
void EEPROM_writeWord(uint16_t address, uint16_t word) {
|
|
EEPROM_writeEnable();
|
|
SLAVE_SELECT;
|
|
SPI_tradeByte(EEPROM_WRITE);
|
|
EEPROM_send16BitAddress(address);
|
|
SPI_tradeByte((uint8_t) (word >> 8));
|
|
SPI_tradeByte((uint8_t) word);
|
|
SLAVE_DESELECT;
|
|
while (EEPROM_readStatus() & _BV(EEPROM_WRITE_IN_PROGRESS)) {;
|
|
}
|
|
}
|
|
|
|
void EEPROM_clearAll(void) {
|
|
uint8_t i;
|
|
uint16_t pageAddress = 0;
|
|
while (pageAddress < EEPROM_BYTES_MAX) {
|
|
EEPROM_writeEnable();
|
|
SLAVE_SELECT;
|
|
SPI_tradeByte(EEPROM_WRITE);
|
|
EEPROM_send16BitAddress(pageAddress);
|
|
for (i = 0; i < EEPROM_BYTES_PER_PAGE; i++) {
|
|
SPI_tradeByte(0);
|
|
}
|
|
SLAVE_DESELECT;
|
|
pageAddress += EEPROM_BYTES_PER_PAGE;
|
|
while (EEPROM_readStatus() & _BV(EEPROM_WRITE_IN_PROGRESS)) {;
|
|
}
|
|
}
|
|
}
|