borgware-2d/src/can/spi.c

67 lines
1.3 KiB
C

#ifdef __AVR__
#include <avr/io.h>
#endif
#include "spi.h"
#ifdef __AVR__
void spi_init(){
//set output SPI pins to output
SPI_DDR |= (1<<SPI_PIN_MOSI) | (1<<SPI_PIN_SCK) | (1<<SPI_PIN_SS);
#ifdef SPI_HARDWARE
// 0 1
//DORD msb first lsb first
//CPOL low idle high idle
//CPHA rising edge fallling edge
//SPR0 SPR1
// 0 0 ck/4
// 0 1 ck/16
// 1 0 ck/64
// 1 1 ck/128
//Interrupt disable, SPI enable, MSB first, master, clk low idle, data valid on rising edge, ck/4
SPCR = (0<<SPIE) | (1<<SPE) | (0<<DORD) | (1<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
//Double speed on
SPSR = (1<<SPI2X);
#endif
}
#ifndef SPI_HARDWARE
unsigned char spi_data(unsigned char c) {
unsigned char x, d=d;
for(x = 0; x < 8; x++) {
if(c & 0x80) {
SPI_PORT |= (1 << SPI_PIN_MOSI);
} else {
SPI_PORT &= ~(1 << SPI_PIN_MOSI);
}
SPI_PORT |= (1 << SPI_PIN_SCK);
d <<= 1;
if(SPI_PIN & (1 << SPI_PIN_MISO)) {
d |= 1;
}
SPI_PORT &= ~(1 << SPI_PIN_SCK);
c <<= 1;
}
return d;
}
#else
unsigned char spi_data(unsigned char c) {
SPDR = c;
while(!(SPSR & (1<<SPIF)));
c = SPDR;
return (c);
}
#endif
#else
void spi_init(){}
unsigned char spi_data(unsigned char c){return 0;}
#endif