Started following some tutorial on att85 usi. Downloaded example code from make avr book.

This commit is contained in:
Dan
2022-09-20 01:08:01 -04:00
parent d0cbc0000e
commit 361a828c46
295 changed files with 68746 additions and 0 deletions

View File

@@ -0,0 +1,105 @@
#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)) {;
}
}
}