Statistics
| Branch: | Tag: | Revision:

root / analog_exp / excitation.c @ 168:bfc84ee2839b

History | View | Annotate | Download (1 kB)

1
#include <avr/io.h>
2
3
#include "board.h"
4
#include "excitation.h"
5
6
#define SPI_CS_HIGH() EXC_SPI_PORT |=  (1<<EXC_SPI_SS)
7
#define SPI_CS_LOW()  EXC_SPI_PORT &= ~(1<<EXC_SPI_SS)
8
9
void exc_setup(void) {
10
    SPI_CS_HIGH();
11
    EXC_SPI_DDR |= (1<<EXC_SPI_MOSI) | (1<<EXC_SPI_SCK) | (1<<EXC_SPI_SS);
12
    SPCR = (1<<SPE) | (1<<MSTR);
13
14
    EXC_EN_DDR |= (1<<EXC_VEN0) | (1<<EXC_VEN1);
15
}
16
17
static uint8_t spi_transfer(uint8_t data) {
18
    SPDR = data;
19
    while(! (SPSR & (1<<SPIF)));
20
    return SPDR;
21
}
22
23
void exc_power_on(bool on) {
24
    SPI_CS_LOW();
25
    spi_transfer(EXC_CMD_ACR_WRITE);
26
    spi_transfer(on? EXC_SHDN_bm : 0);
27
    SPI_CS_HIGH();
28
}
29
30
void exc_enable(uint8_t ch, uint8_t value) {
31
    exc_power_on(true);
32
    SPI_CS_LOW();
33
    spi_transfer(EXC_CMD_WRITE | ch);
34
    spi_transfer(value);
35
    SPI_CS_HIGH();
36
37
    EXC_EN_PORT |= (ch? (1<<EXC_VEN1) : (1<<EXC_VEN0));
38
}
39
40
void exc_disable(uint8_t ch) {
41
    EXC_EN_PORT &= ~(ch? (1<<EXC_VEN1) : (1<<EXC_VEN0));
42
    if((EXC_EN_PORT & ((1<<EXC_VEN1) | (1<<EXC_VEN0))) == 0) {
43
        exc_power_on(false);
44
    }
45
}
46