3 * Extend wiringPi with the MCP3422 I2C ADC chip
4 * Copyright (c) 2013 Gordon Henderson
5 ***********************************************************************
6 * This file is part of wiringPi:
7 * https://projects.drogon.net/raspberry-pi/wiringpi/
9 * wiringPi is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU Lesser General Public License as
11 * published by the Free Software Foundation, either version 3 of the
12 * License, or (at your option) any later version.
14 * wiringPi is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with wiringPi.
21 * If not, see <http://www.gnu.org/licenses/>.
22 ***********************************************************************
29 #include <sys/ioctl.h>
30 #include <linux/spi/spidev.h>
33 #include <wiringPiI2C.h>
40 * Read a channel from the device
41 *********************************************************************************
44 int myAnalogRead (struct wiringPiNodeStruct *node, int chan)
46 unsigned char config, b0, b1, b2, b3 ;
49 // One-shot mode, trigger plus the other configs.
51 config = 0x80 | ((chan - node->pinBase) << 5) | (node->data0 << 2) | (node->data1) ;
53 wiringPiI2CWrite (node->fd, config) ;
55 switch (node->data0) // Sample rate
57 case MCP3422_SR_3_75: // 18 bits
59 b0 = wiringPiI2CRead (node->fd) ;
60 b1 = wiringPiI2CRead (node->fd) ;
61 b2 = wiringPiI2CRead (node->fd) ;
62 b3 = wiringPiI2CRead (node->fd) ;
63 value = ((b0 & 3) << 16) | (b1 << 8) | b2 ;
66 case MCP3422_SR_15: // 16 bits
68 b0 = wiringPiI2CRead (node->fd) ;
69 b1 = wiringPiI2CRead (node->fd) ;
70 b2 = wiringPiI2CRead (node->fd) ;
71 value = (b0 << 8) | b1 ;
74 case MCP3422_SR_60: // 14 bits
76 b0 = wiringPiI2CRead (node->fd) ;
77 b1 = wiringPiI2CRead (node->fd) ;
78 b2 = wiringPiI2CRead (node->fd) ;
79 value = ((b0 & 0x3F) << 8) | b1 ;
82 case MCP3422_SR_240: // 12 bits
84 b0 = wiringPiI2CRead (node->fd) ;
85 b1 = wiringPiI2CRead (node->fd) ;
86 b2 = wiringPiI2CRead (node->fd) ;
87 value = ((b0 & 0x0F) << 8) | b1 ;
97 * Create a new wiringPi device node for the mcp3422
98 *********************************************************************************
101 int mcp3422Setup (int pinBase, int i2cAddress, int channels, int sampleRate, int gain)
104 struct wiringPiNodeStruct *node ;
106 if ((fd = wiringPiI2CSetup (i2cAddress)) < 0)
109 node = wiringPiNewNode (pinBase, channels) ;
111 node->data0 = sampleRate ;
113 node->analogRead = myAnalogRead ;