Files
avrm/spi.c
Олег Бородин 47485f71a4 import sources
2024-07-28 15:21:25 +02:00

76 lines
1.5 KiB
C

/*
* Copyright 2017 Oleg Borodin <onborodin@gmail.com>
*
*/
#include <avr/io.h>
#include <tools.h>
#include <spi.h>
void spi_init(void) {
/* Set PIN_MISO as input */
REG_SETDOWN_BIT(DDRB, PIN_MISO);
/* Set PIN_SS as output */
REG_SETUP_BIT(DDRB, PIN_SS);
REG_SETUP_BIT(DDRB, PIN_MOSI);
REG_SETUP_BIT(DDRB, PIN_SCK);
REG_SETUP_BIT(DDRB, PIN_RESET);
REG_SETUP_BIT(DDRB, PIN_A0);
/* Down SS */
REG_SETUP_BIT(PORTB, PIN_SS);
/* Set master mode */
REG_SETUP_BIT(SPCR, MSTR);
/* Set speed */
REG_SETDOWN_BIT(SPCR, SPR0);
REG_SETDOWN_BIT(SPCR, SPR1);
/* Set duble speed */
REG_SETUP_BIT(SPCR, SPI2X);
/* Set order */
REG_SETDOWN_BIT(SPCR, DORD);
/* Set mode */
REG_SETDOWN_BIT(SPCR, CPOL);
REG_SETDOWN_BIT(SPCR, CPHA);
/* Enable SPI */
REG_SETUP_BIT(SPCR, SPE);
}
inline void spi_write_byte(uint8_t data) {
SPDR = data;
while (!(SPSR & (1 << SPIF)));
}
inline uint8_t spi_read_byte(void) {
SPDR = 0xFF;
while (!(SPSR & (1 << SPIF)));
return SPDR;
}
inline void spi_select_mcp(void) {
REG_SETDOWN_BIT(PORTB, PIN_SS);
}
inline void spi_unselect_mcp(void) {
REG_SETUP_BIT(PORTB, PIN_SS);
}
void spi_enable(void) {
REG_SETUP_BIT(SPCR, SPE);
}
void spi_disable(void) {
REG_SETDOWN_BIT(SPCR, SPE);
}
void spi_write_word(uint16_t w) {
spi_write_byte(w >> 8);
spi_write_byte(w & 0xff);
}
void spi_write_word_array(uint16_t w, uint16_t n) {
while (n--)
spi_write_word(w);
}