-
Notifications
You must be signed in to change notification settings - Fork 9
/
MCP47X6.cpp
150 lines (126 loc) · 4.52 KB
/
MCP47X6.cpp
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/**************************************************************************/
/*!
@file MCP47X6.cpp
@author C. Schnarel
@license BSD (see license.txt)
This file is part of an Arduino library to interface with the
Microchip MCP47X6 series of Digital-to-Analog converters which are
connected via the I2C bus.
This file is the MCP47X6 I2C device class file
Based on Microchip datasheets for the following part numbers
MCP4706 (8-bit), MCP4716 (10-bit), MCP4726 (12-bit)
These parts share a common programming interface
Copyright (c) 2013 Chip Schnarel <schnarel@hotmail.com>
Updates should (hopefully) always be available at
https://github.com/uchip/MCP47X6
@section HISTORY
2013-Dec-25 - First release, C. Schnarel
*/
/**************************************************************************/
#include "MCP47X6.h"
//#include "Wire.h"
/**************************************************************************/
/******************************************
* Default constructor, uses default I2C address.
* @see MCP47X6_DEFAULT_ADDRESS
*/
MCP47X6::MCP47X6() {
devAddr = MCP47X6_DEFAULT_ADDRESS;
}
/******************************************
* Specific address constructor.
* @param address I2C address
* @see MCP47X6_DEFAULT_ADDRESS
*/
MCP47X6::MCP47X6(uint8_t address) {
devAddr = address;
}
/******************************************
* Verify the I2C connection.
* Make sure the device is connected and responds as expected.
* @return true if connection is valid, false otherwise
*/
bool MCP47X6::testConnection(void) {
Wire.beginTransmission(devAddr);
return (Wire.endTransmission() == 0);
}
/******************************************
* Power on and prepare for general usage.
* This device recalls the previously saved state at power up. The begin()
* function reads these values from the DAC and uses them to reinitialize
* the driver since a reset of the microcontroller
* did not necessarily restart the device.
*/
bool MCP47X6::begin() {
// read the settings from DAC EEPROM
// reinitialize the device from the read settings
return writeConfigReg(config);
}
bool MCP47X6::begin(uint8_t newConfig) {
// initialize the device from the new settings
config = newConfig;
return true;
}
/******************************************
* Set the configuration bits for the DAC
*/
void MCP47X6::setGain(uint8_t gain) {
config = (config & MCP47X6_GAIN_MASK) | (gain & !MCP47X6_GAIN_MASK);
}
void MCP47X6::setVReference(uint8_t vref) {
config = (config & MCP47X6_VREF_MASK) | (vref & !MCP47X6_VREF_MASK);
}
//void MCP47X6::setPwrDnOutRes(uint8_t pdOutR) {
// config = (config & MCP47X6_PWRDN_MASK) | (pdOutR & !MCP47X6_PWRDN_MASK);
//}
/******************************************
* Saves current DAC settings into DAC EEPROM for use at power up
*/
bool MCP47X6::saveSettings(void) {
// read the current volatile settings
// write the values back to DAC EEPROM
}
/******************************************
* Set DAC output level value
* Valid range is 0x000 to 0xFFF for all parts.
* For the MCP4726 all 4096 steps are used.
* For the MCP4716 only 1024 steps are used. The two LSBs are not used.
* (i.e. value & 0xFFC)
* For the MCP4706 only 256 steps are used. The four LSBs are not used.
* (i.e. value & 0xFF0)
*/
bool MCP47X6::setOutputLevel(uint16_t level) {
Wire.beginTransmission(devAddr);
Wire.write((config | MCP47X6_CMD_VOLALL) & MCP47X6_PWRDN_MASK);
Wire.write((uint8_t) ((level>>4) & 0xFF));
Wire.write((uint8_t) ((level<<4) & 0xF0));
return (Wire.endTransmission() == 0);
}
// Special case for 8-bit device (MCP4706) - saves one byte of transfer
// and is therefore faster
bool MCP47X6::setOutputLevel(uint8_t level) {
Wire.beginTransmission(devAddr);
Wire.write((uint8_t) MCP47X6_CMD_VOLDAC);
Wire.write(level);
return (Wire.endTransmission() == 0);
}
/******************************************
* Put the DAC into a low power state
* NOTE: writing any settings or DAC output level value
* returns the DAC to the awake power state.
*/
bool MCP47X6::powerDown() {
return writeConfigReg(config);
}
bool MCP47X6::powerDown(uint8_t pdOutR) {
config = (config & MCP47X6_PWRDN_MASK) | (pdOutR & !MCP47X6_PWRDN_MASK);
return writeConfigReg(config);
}
/******************************************
* Private helper function to write just the config register
*/
bool MCP47X6::writeConfigReg(uint8_t theConfig) {
Wire.beginTransmission(devAddr);
Wire.write(theConfig | MCP47X6_CMD_VOLCONFIG);
return (Wire.endTransmission() == 0);
}