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 |