-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathmcp3914.h
120 lines (105 loc) · 3.69 KB
/
mcp3914.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#ifndef MCP3914_H_
#define MCP3914_H_
#include "gpio.h"
#include "dma.h"
enum
{
MCP3914_NUM_CHANNELS = 8,
MCP3914_MAX_SAMPLE_SIZE = 32,
};
enum MCP3914_REG
{
MCP3914_REG_CHANNEL_BASE = 0,
MCP3914_REG_MOD = 8,
MCP3914_REG_PHASE0 = 9,
MCP3914_REG_PHASE1 = 10,
MCP3914_REG_GAIN = 11,
MCP3914_REG_STATUSCOM = 12,
MCP3914_REG_CONFIG0 = 13,
MCP3914_REG_CONFIG1 = 14,
MCP3914_REG_OFFCAL_CH0 = 15, // every channel takes 2 register
MCP3914_REG_GAINCAL_CH0 = 16, // every channel takes 2 register
MCP3914_REG_SECURITY = 31,
MCP3914_REG_NUM = 32,
};
enum /* : uint32_t */ // TODO complete TODO separate file
{
MCP3914_CONFIG0_PRE_MASK = 3 << 16,
MCP3914_CONFIG0_PRE1 = 0 << 16,
MCP3914_CONFIG0_PRE2 = 1 << 16,
MCP3914_CONFIG0_PRE4 = 2 << 16,
MCP3914_CONFIG0_PRE8 = 3 << 16,
MCP3914_CONFIG0_OSC_32 = 0 << 13,
MCP3914_CONFIG0_OSC_64 = 1 << 13,
MCP3914_CONFIG0_OSC_128 = 2 << 13,
MCP3914_CONFIG0_OSC_256 = 3 << 13,
MCP3914_CONFIG0_OSC_512 = 4 << 13,
MCP3914_CONFIG0_OSC_1024 = 5 << 13,
MCP3914_CONFIG0_OSC_2048 = 6 << 13,
MCP3914_CONFIG0_OSC_4096 = 7 << 13,
MCP3914_CONFIG0_OSC_MASK = 7 << 13,
MCP3914_CONFIG1_VREF_MASK = 1 << 7,
MCP3914_CONFIG1_VREF_EXT = 1 << 7,
MCP3914_CONFIG1_VREF_INT = 0 << 7,
MCP3914_CONFIG1_CLK_MASK = 1 << 6,
MCP3914_CONFIG1_CLK_EXT = 1 << 6,
MCP3914_CONFIG1_CLK_INT = 0 << 6,
MCP3914_STATUSCOM_WIDTH_DATA_SHIFT = 16,
MCP3914_STATUSCOM_WIDTH_DATA_MASK = 3 << MCP3914_STATUSCOM_WIDTH_DATA_SHIFT,
MCP3914_STATUSCOM_WIDTH_DATA_32S = 3 << MCP3914_STATUSCOM_WIDTH_DATA_SHIFT,
MCP3914_STATUSCOM_WIDTH_DATA_32Z = 2 << MCP3914_STATUSCOM_WIDTH_DATA_SHIFT,
MCP3914_STATUSCOM_WIDTH_DATA_24 = 1 << MCP3914_STATUSCOM_WIDTH_DATA_SHIFT,
MCP3914_STATUSCOM_WIDTH_DATA_16 = 0 << MCP3914_STATUSCOM_WIDTH_DATA_SHIFT,
MCP3914_STATUSCOM_WIDTH_DATA_DEFAULT = MCP3914_STATUSCOM_WIDTH_DATA_24,
MCP3914_STATUSCOM_READ_SHIFT = 22,
MCP3914_STATUSCOM_READ_MASK = 3 << MCP3914_STATUSCOM_READ_SHIFT,
MCP3914_STATUSCOM_READ_ALL = 3 << MCP3914_STATUSCOM_READ_SHIFT,
MCP3914_STATUSCOM_READ_TYPES = 2 << MCP3914_STATUSCOM_READ_SHIFT,
MCP3914_STATUSCOM_READ_GROUP = 1 << MCP3914_STATUSCOM_READ_SHIFT,
MCP3914_STATUSCOM_READ_ONE = 0 << MCP3914_STATUSCOM_READ_SHIFT,
MCP3914_STATUSCOM_READ_DEFAULT = MCP3914_STATUSCOM_READ_TYPES,
};
enum /* : uint8_t */
{
MCP3914_CMD_ADDRESS = 1,
MCP3914_CMD_READ_MASK = 1,
MCP3914_CMD_WRITE_MASK = 0
};
enum MCP3914_STREAM
{
MCP3914_STREAM_SINGLE = 0,
MCP3914_STREAM_GROUP,
MCP3914_STREAM_ALL
};
struct MCP3914_PORT_CFG
{
SPI_TypeDef *spi;
// order of pin definitions is as in the MCP connector
struct GPIO_PORT_PIN reset_pin;
struct GPIO_PORT_PIN miso_pin;
struct GPIO_PORT_PIN mosi_pin;
struct GPIO_PORT_PIN sck_pin;
struct GPIO_PORT_PIN cs_pin;
struct GPIO_PORT_PIN dr_pin;
const struct DMA_TARGET spi_rx_dma;
const struct DMA_TARGET spi_tx_dma;
};
void mcp3914_port_configure(const struct MCP3914_PORT_CFG *port_cfg, enum GPIO_OUT_SPEED pin_speed, uint32_t spi_prescaler);
static __inline
void mcp3914_select(const struct MCP3914_PORT_CFG *port)
{
port->cs_pin.port->BSRR = 1 << (16 + port->cs_pin.pin);
}
static __inline
void mcp3914_deselect(const struct MCP3914_PORT_CFG *port)
{
// TODO WAIT ????
port->cs_pin.port->BSRR = 1 << port->cs_pin.pin;
}
void mcp_3914_parse_statuscom(uint32_t statuscom, unsigned *channel_width, unsigned *repeat);
void mcp3914_write_reg(const struct MCP3914_PORT_CFG *port, enum MCP3914_REG reg, uint32_t val);
uint32_t mcp3914_read_reg(const struct MCP3914_PORT_CFG *port, enum MCP3914_REG reg);
uint32_t mcp3914_read_channel(const struct MCP3914_PORT_CFG *port, unsigned channel, unsigned len);
void mcp3914_stream_start(const struct MCP3914_PORT_CFG *cfg, unsigned reg);
void mcp3914_stream_end(const struct MCP3914_PORT_CFG *cfg);
#endif