spi.c


1
#include "spi.h"
2
3
uint8_t init_spi()
4
{
5
#if defined (__AVR_ATmega32__)
6
  SPI_DDR |= (1<<SCK_PIN) | (1<<MOSI_PIN);
7
  SS_DDR |= (1<<SS_PIN);
8
  SPI_PORT &= ~((1<<SCK_PIN) | (1<<MOSI_PIN) | (1<<MISO_PIN));
9
  SS_PORT |= (1<<SS_PIN);
10
11
  SPCR = (1<<SPE) | (1 << MSTR);
12
  SPSR = (1<<SPI2X);
13
#elif defined (__AVR_ATmega168__)
14
  
15
  SS_DDR |= (1<<SS_PIN);
16
  SS_PORT |= (1<<SS_PIN);
17
18
  SPI_DDR |= (1<<MOSI_PIN)|(1<<SCK_PIN);
19
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
20
#endif
21
22
  return 0;
23
}
24
25
26
void set_cs(uint8_t state)
27
{
28
  if(state)
29
    {
30
      SS_PORT |= (1<<SS_PIN);
31
    }
32
  else
33
    {
34
      SS_PORT &= ~(1<<SS_PIN);
35
    }
36
}
37
38
39
uint8_t spi_putc(uint8_t data)
40
{
41
  SPDR = data;
42
43
  while(!(SPSR & (1 << SPIF)));
44
  return SPDR;
45
}
46
47
48
void write_register(uint8_t address, uint8_t data)
49
{
50
  set_cs(LOW);
51
  spi_putc(SPI_WRITE);
52
  spi_putc(address);
53
  spi_putc(data);
54
  set_cs(HIGH);
55
}
56
57
uint8_t read_register(uint8_t address)
58
{
59
  set_cs(LOW);
60
  spi_putc(SPI_READ);
61
  spi_putc(address);
62
63
  uint8_t data = spi_putc(0xff);
64
  set_cs(HIGH);
65
  return data;
66
}
67
68
void modify_register(uint8_t address, uint8_t mask, uint8_t data)
69
{
70
  set_cs(LOW);
71
  spi_putc(SPI_BIT_MODIFY);
72
  spi_putc(address);
73
  spi_putc(mask);
74
  spi_putc(data);
75
  set_cs(HIGH);
76
}
77
78
79
void set_bit(uint8_t address, uint8_t bit, uint8_t value)
80
{
81
  modify_register(address,(1<<bit),value*255);
82
}