22
22
* BSD license, all text above must be included in any redistribution
23
23
*/
24
24
25
- #if ARDUINO >= 100
26
- #include " Arduino.h"
27
- #else
28
- #include " WProgram.h"
29
- #endif
30
- #ifdef __AVR_ATtiny85__
31
- #include < TinyWireM.h>
32
- #define Wire TinyWireM
33
- #else
34
- #include < Wire.h>
35
- #endif
36
-
37
- #ifdef __AVR
38
- #include < avr/pgmspace.h>
39
- #elif defined(ESP8266)
40
- #include < pgmspace.h>
41
- #endif
42
25
#include " Adafruit_MCP23008.h"
43
26
44
- // //////////////////////////////////////////////////////////////////////////////
45
- // RTC_DS1307 implementation
27
+ // /////////////////////////////////////////////////////////////////////////////
46
28
47
- void Adafruit_MCP23008::begin (uint8_t addr) {
48
- if (addr > 7 ) {
49
- addr = 7 ;
29
+ /* !
30
+ * @brief Begins the i2c connection using specified address
31
+ * @param addr i2c address of the MCP23008, defaults to 0x20
32
+ * @param wire TwoWire interface, defaults to &Wire
33
+ * @returns False if failed to find device at address
34
+ */
35
+ bool Adafruit_MCP23008::begin (uint8_t addr, TwoWire *wire) {
36
+ if ((addr >= 0x20 ) && (addr <= 0x27 )) {
37
+ _i2caddr = addr;
38
+ } else if (addr <= 0x07 ) {
39
+ _i2caddr = 0x20 + addr;
40
+ } else {
41
+ _i2caddr = 0x27 ;
50
42
}
51
- i2caddr = addr;
52
43
53
- Wire.begin ();
44
+ if (i2c_dev) {
45
+ delete i2c_dev; // remove old interface
46
+ }
47
+
48
+ i2c_dev = new Adafruit_I2CDevice (_i2caddr, wire);
49
+
50
+ if (!i2c_dev->begin ()) {
51
+ return false ;
52
+ }
54
53
55
54
// set defaults!
56
- Wire.beginTransmission (MCP23008_ADDRESS | i2caddr);
57
- #if ARDUINO >= 100
58
- Wire.write ((byte)MCP23008_IODIR);
59
- Wire.write ((byte)0xFF ); // all inputs
60
- Wire.write ((byte)0x00 );
61
- Wire.write ((byte)0x00 );
62
- Wire.write ((byte)0x00 );
63
- Wire.write ((byte)0x00 );
64
- Wire.write ((byte)0x00 );
65
- Wire.write ((byte)0x00 );
66
- Wire.write ((byte)0x00 );
67
- Wire.write ((byte)0x00 );
68
- Wire.write ((byte)0x00 );
69
- #else
70
- Wire.send (MCP23008_IODIR);
71
- Wire.send (0xFF ); // all inputs
72
- Wire.send (0x00 );
73
- Wire.send (0x00 );
74
- Wire.send (0x00 );
75
- Wire.send (0x00 );
76
- Wire.send (0x00 );
77
- Wire.send (0x00 );
78
- Wire.send (0x00 );
79
- Wire.send (0x00 );
80
- Wire.send (0x00 );
81
- #endif
82
- Wire.endTransmission ();
83
- }
55
+ uint8_t buf[] = {MCP23008_IODIR,
56
+ 0xFF , // all inputs
57
+ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
58
+ 0x00 , 0x00 , 0x00 , 0x00 };
59
+ if (!i2c_dev->write (buf, 10 )) {
60
+ return false ;
61
+ }
84
62
85
- void Adafruit_MCP23008::begin (void ) { begin (0 ); }
63
+ return true ;
64
+ }
86
65
87
- void Adafruit_MCP23008::pinMode (uint8_t p, uint8_t d) {
66
+ /* !
67
+ * @brief Sets the pin mode
68
+ * @param p Mode to set
69
+ * @param d Pin to set the mode to
70
+ * @returns True on success, False on bad input or I2C failure
71
+ */
72
+ bool Adafruit_MCP23008::pinMode (uint8_t p, uint8_t d) {
88
73
uint8_t iodir;
89
74
90
75
// only 8 bits!
91
76
if (p > 7 )
92
- return ;
77
+ return false ;
93
78
94
79
iodir = read8 (MCP23008_IODIR);
95
80
@@ -101,22 +86,39 @@ void Adafruit_MCP23008::pinMode(uint8_t p, uint8_t d) {
101
86
}
102
87
103
88
// write the new IODIR
104
- write8 (MCP23008_IODIR, iodir);
89
+ return write8 (MCP23008_IODIR, iodir);
105
90
}
106
91
92
+ /* !
93
+ * @brief Reads the current GPIO input
94
+ * @return Returns the current GPIO input
95
+ */
107
96
uint8_t Adafruit_MCP23008::readGPIO (void ) {
108
97
// read the current GPIO input
109
98
return read8 (MCP23008_GPIO);
110
99
}
111
100
112
- void Adafruit_MCP23008::writeGPIO (uint8_t gpio) { write8 (MCP23008_GPIO, gpio); }
101
+ /* !
102
+ * @brief Writes to the GPIO
103
+ * @param gpio what to write
104
+ * @returns True on success, False on bad input or I2C failure
105
+ */
106
+ bool Adafruit_MCP23008::writeGPIO (uint8_t gpio) {
107
+ return write8 (MCP23008_GPIO, gpio);
108
+ }
113
109
114
- void Adafruit_MCP23008::digitalWrite (uint8_t p, uint8_t d) {
110
+ /* !
111
+ * @brief Sets the pin and direction
112
+ * @param p Pin to set
113
+ * @param d Direction to set the pin
114
+ * @returns True on success, False on bad input or I2C failure
115
+ */
116
+ bool Adafruit_MCP23008::digitalWrite (uint8_t p, uint8_t d) {
115
117
uint8_t gpio;
116
118
117
119
// only 8 bits!
118
120
if (p > 7 )
119
- return ;
121
+ return false ;
120
122
121
123
// read the current GPIO output latches
122
124
gpio = readGPIO ();
@@ -129,15 +131,21 @@ void Adafruit_MCP23008::digitalWrite(uint8_t p, uint8_t d) {
129
131
}
130
132
131
133
// write the new GPIO
132
- writeGPIO (gpio);
134
+ return writeGPIO (gpio);
133
135
}
134
136
135
- void Adafruit_MCP23008::pullUp (uint8_t p, uint8_t d) {
137
+ /* !
138
+ * @brief Sets pull-up resistor on specified pin
139
+ * @param p Pin to set
140
+ * @param d Direction to set the pin
141
+ * @returns True on success, False on bad input or I2C failure
142
+ */
143
+ bool Adafruit_MCP23008::pullUp (uint8_t p, uint8_t d) {
136
144
uint8_t gppu;
137
145
138
146
// only 8 bits!
139
147
if (p > 7 )
140
- return ;
148
+ return false ;
141
149
142
150
gppu = read8 (MCP23008_GPPU);
143
151
// set the pin and direction
@@ -147,9 +155,14 @@ void Adafruit_MCP23008::pullUp(uint8_t p, uint8_t d) {
147
155
gppu &= ~(1 << p);
148
156
}
149
157
// write the new GPIO
150
- write8 (MCP23008_GPPU, gppu);
158
+ return write8 (MCP23008_GPPU, gppu);
151
159
}
152
160
161
+ /* !
162
+ * @brief Reads the status of a gpio pin
163
+ * @param p Pin to read
164
+ * @return Returns the current gpio
165
+ */
153
166
uint8_t Adafruit_MCP23008::digitalRead (uint8_t p) {
154
167
// only 8 bits!
155
168
if (p > 7 )
@@ -160,30 +173,12 @@ uint8_t Adafruit_MCP23008::digitalRead(uint8_t p) {
160
173
}
161
174
162
175
uint8_t Adafruit_MCP23008::read8 (uint8_t addr) {
163
- Wire.beginTransmission (MCP23008_ADDRESS | i2caddr);
164
- #if ARDUINO >= 100
165
- Wire.write ((byte)addr);
166
- #else
167
- Wire.send (addr);
168
- #endif
169
- Wire.endTransmission ();
170
- Wire.requestFrom (MCP23008_ADDRESS | i2caddr, 1 );
171
-
172
- #if ARDUINO >= 100
173
- return Wire.read ();
174
- #else
175
- return Wire.receive ();
176
- #endif
176
+ Adafruit_BusIO_Register reg = Adafruit_BusIO_Register (i2c_dev, addr, 1 );
177
+ return reg.read ();
177
178
}
178
179
179
- void Adafruit_MCP23008::write8 (uint8_t addr, uint8_t data) {
180
- Wire.beginTransmission (MCP23008_ADDRESS | i2caddr);
181
- #if ARDUINO >= 100
182
- Wire.write ((byte)addr);
183
- Wire.write ((byte)data);
184
- #else
185
- Wire.send (addr);
186
- Wire.send (data);
187
- #endif
188
- Wire.endTransmission ();
180
+ bool Adafruit_MCP23008::write8 (uint8_t addr, uint8_t data) {
181
+ Adafruit_BusIO_Register reg = Adafruit_BusIO_Register (i2c_dev, addr, 1 );
182
+
183
+ return reg.write (data);
189
184
}
0 commit comments