8-Bit Single/Dual SPI Digital POT with Non-Volatile Memory

Fork of MCP4261 by TeamElectronics

Committer:
stjo2809
Date:
Wed Jan 20 10:54:05 2016 +0000
Revision:
2:1e4469bdbed9
Parent:
1:935321af7311
tested

Who changed what in which revision?

UserRevisionLine numberNew contents of line
stjo2809 0:ff10d457fef2 1 /* mbed MCP4261 Library, for driving the 8-Bit Single/Dual SPI Digital POT with Non-Volatile Memory
stjo2809 0:ff10d457fef2 2 * Copyright (c) 2015, Created by Steen Joergensen (stjo2809)
stjo2809 0:ff10d457fef2 3 *
stjo2809 0:ff10d457fef2 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
stjo2809 0:ff10d457fef2 5 * of this software and associated documentation files (the "Software"), to deal
stjo2809 0:ff10d457fef2 6 * in the Software without restriction, including without limitation the rights
stjo2809 0:ff10d457fef2 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
stjo2809 0:ff10d457fef2 8 * copies of the Software, and to permit persons to whom the Software is
stjo2809 0:ff10d457fef2 9 * furnished to do so, subject to the following conditions:
stjo2809 0:ff10d457fef2 10 *
stjo2809 0:ff10d457fef2 11 * The above copyright notice and this permission notice shall be included in
stjo2809 0:ff10d457fef2 12 * all copies or substantial portions of the Software.
stjo2809 0:ff10d457fef2 13 *
stjo2809 0:ff10d457fef2 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
stjo2809 0:ff10d457fef2 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
stjo2809 0:ff10d457fef2 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
stjo2809 0:ff10d457fef2 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
stjo2809 0:ff10d457fef2 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
stjo2809 0:ff10d457fef2 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
stjo2809 0:ff10d457fef2 20 * THE SOFTWARE.
stjo2809 0:ff10d457fef2 21 */
stjo2809 0:ff10d457fef2 22
stjo2809 0:ff10d457fef2 23 #include "mbed.h"
stjo2809 0:ff10d457fef2 24 #include "MCP4261.h"
stjo2809 0:ff10d457fef2 25
stjo2809 0:ff10d457fef2 26 //=============================================================================
stjo2809 0:ff10d457fef2 27 // Public functions
stjo2809 0:ff10d457fef2 28 //=============================================================================
stjo2809 0:ff10d457fef2 29
stjo2809 1:935321af7311 30 MCP4261::MCP4261(SPI& spi, PinName nCs, PinName nWP, PinName nSHDN): _spi(spi), _nCs(nCs), _nWP(nWP), _nSHDN(nSHDN)
stjo2809 0:ff10d457fef2 31 {
stjo2809 2:1e4469bdbed9 32 _nCs = 1;
stjo2809 0:ff10d457fef2 33 }
stjo2809 0:ff10d457fef2 34
stjo2809 2:1e4469bdbed9 35 MCP4261::MCP4261(SPI& spi, PinName nCs, PinName nWP): _spi(spi), _nCs(nCs), _nWP(nWP), _nSHDN(NC)
stjo2809 0:ff10d457fef2 36 {
stjo2809 2:1e4469bdbed9 37 _nCs = 1;
stjo2809 1:935321af7311 38 }
stjo2809 1:935321af7311 39
stjo2809 0:ff10d457fef2 40 int MCP4261::read(char address)
stjo2809 0:ff10d457fef2 41 {
stjo2809 2:1e4469bdbed9 42 return _read(address);
stjo2809 0:ff10d457fef2 43 }
stjo2809 0:ff10d457fef2 44
stjo2809 0:ff10d457fef2 45
stjo2809 0:ff10d457fef2 46 void MCP4261::write(char address, int data)
stjo2809 0:ff10d457fef2 47 {
stjo2809 2:1e4469bdbed9 48 _write(address, data);
stjo2809 0:ff10d457fef2 49 }
stjo2809 0:ff10d457fef2 50
stjo2809 0:ff10d457fef2 51 void MCP4261::inc(bool number)
stjo2809 0:ff10d457fef2 52 {
stjo2809 2:1e4469bdbed9 53 if(number == 0)
stjo2809 0:ff10d457fef2 54 {
stjo2809 0:ff10d457fef2 55 _make_command_byte(CB_INCR, VW0_ADDR, 0);
stjo2809 0:ff10d457fef2 56 _nCs = 0;
stjo2809 0:ff10d457fef2 57 _spi.write(_command_byte);
stjo2809 0:ff10d457fef2 58 _nCs = 1;
stjo2809 0:ff10d457fef2 59 }
stjo2809 0:ff10d457fef2 60 else
stjo2809 0:ff10d457fef2 61 {
stjo2809 0:ff10d457fef2 62 _make_command_byte(CB_INCR, VW1_ADDR, 0);
stjo2809 0:ff10d457fef2 63 _nCs = 0;
stjo2809 0:ff10d457fef2 64 _spi.write(_command_byte);
stjo2809 0:ff10d457fef2 65 _nCs = 1;
stjo2809 0:ff10d457fef2 66 }
stjo2809 0:ff10d457fef2 67 }
stjo2809 0:ff10d457fef2 68
stjo2809 0:ff10d457fef2 69 void MCP4261::dec(bool number)
stjo2809 0:ff10d457fef2 70 {
stjo2809 2:1e4469bdbed9 71 if(number == 0)
stjo2809 0:ff10d457fef2 72 {
stjo2809 0:ff10d457fef2 73 _make_command_byte(CB_DECR, VW0_ADDR, 0);
stjo2809 0:ff10d457fef2 74 _nCs = 0;
stjo2809 0:ff10d457fef2 75 _spi.write(_command_byte);
stjo2809 0:ff10d457fef2 76 _nCs = 1;
stjo2809 0:ff10d457fef2 77 }
stjo2809 0:ff10d457fef2 78 else
stjo2809 0:ff10d457fef2 79 {
stjo2809 0:ff10d457fef2 80 _make_command_byte(CB_DECR, VW1_ADDR, 0);
stjo2809 0:ff10d457fef2 81 _nCs = 0;
stjo2809 0:ff10d457fef2 82 _spi.write(_command_byte);
stjo2809 0:ff10d457fef2 83 _nCs = 1;
stjo2809 0:ff10d457fef2 84 }
stjo2809 0:ff10d457fef2 85 }
stjo2809 0:ff10d457fef2 86
stjo2809 0:ff10d457fef2 87
stjo2809 0:ff10d457fef2 88 int MCP4261::status()
stjo2809 0:ff10d457fef2 89 {
stjo2809 2:1e4469bdbed9 90 return _read(STATUS_ADDR);
stjo2809 0:ff10d457fef2 91 }
stjo2809 0:ff10d457fef2 92
stjo2809 0:ff10d457fef2 93
stjo2809 0:ff10d457fef2 94 int MCP4261::tcon()
stjo2809 0:ff10d457fef2 95 {
stjo2809 2:1e4469bdbed9 96 return _read(TCON_ADDR);
stjo2809 0:ff10d457fef2 97 }
stjo2809 0:ff10d457fef2 98
stjo2809 0:ff10d457fef2 99
stjo2809 0:ff10d457fef2 100 void MCP4261::tcon(int data)
stjo2809 0:ff10d457fef2 101 {
stjo2809 2:1e4469bdbed9 102 _write(TCON_ADDR, data);
stjo2809 0:ff10d457fef2 103 }
stjo2809 0:ff10d457fef2 104
stjo2809 0:ff10d457fef2 105
stjo2809 0:ff10d457fef2 106 int MCP4261::wiper(bool number)
stjo2809 0:ff10d457fef2 107 {
stjo2809 2:1e4469bdbed9 108 if(number == 0)
stjo2809 0:ff10d457fef2 109 {
stjo2809 2:1e4469bdbed9 110 return _read(VW0_ADDR);
stjo2809 0:ff10d457fef2 111 }
stjo2809 0:ff10d457fef2 112 else
stjo2809 0:ff10d457fef2 113 {
stjo2809 2:1e4469bdbed9 114 return _read(VW1_ADDR);
stjo2809 2:1e4469bdbed9 115 }
stjo2809 2:1e4469bdbed9 116
stjo2809 0:ff10d457fef2 117 }
stjo2809 0:ff10d457fef2 118
stjo2809 0:ff10d457fef2 119
stjo2809 0:ff10d457fef2 120 void MCP4261::wiper(bool number, int data)
stjo2809 0:ff10d457fef2 121 {
stjo2809 2:1e4469bdbed9 122 if(number == 0)
stjo2809 0:ff10d457fef2 123 {
stjo2809 2:1e4469bdbed9 124 _write(VW0_ADDR, data);
stjo2809 0:ff10d457fef2 125 }
stjo2809 0:ff10d457fef2 126 else
stjo2809 0:ff10d457fef2 127 {
stjo2809 2:1e4469bdbed9 128 _write(VW1_ADDR, data);
stjo2809 0:ff10d457fef2 129 }
stjo2809 0:ff10d457fef2 130 }
stjo2809 0:ff10d457fef2 131
stjo2809 0:ff10d457fef2 132
stjo2809 0:ff10d457fef2 133 int MCP4261::nvwiper(bool number)
stjo2809 0:ff10d457fef2 134 {
stjo2809 2:1e4469bdbed9 135 if(number == 0)
stjo2809 0:ff10d457fef2 136 {
stjo2809 2:1e4469bdbed9 137 return _read(NVW0_ADDR);
stjo2809 0:ff10d457fef2 138 }
stjo2809 0:ff10d457fef2 139 else
stjo2809 0:ff10d457fef2 140 {
stjo2809 2:1e4469bdbed9 141 return _read(NVW1_ADDR);
stjo2809 0:ff10d457fef2 142 }
stjo2809 0:ff10d457fef2 143 }
stjo2809 0:ff10d457fef2 144
stjo2809 0:ff10d457fef2 145
stjo2809 0:ff10d457fef2 146 void MCP4261::nvwiper(bool number, int data)
stjo2809 0:ff10d457fef2 147 {
stjo2809 2:1e4469bdbed9 148 if(number == 0)
stjo2809 0:ff10d457fef2 149 {
stjo2809 2:1e4469bdbed9 150 _write(NVW0_ADDR, data);
stjo2809 0:ff10d457fef2 151 }
stjo2809 0:ff10d457fef2 152 else
stjo2809 0:ff10d457fef2 153 {
stjo2809 2:1e4469bdbed9 154 _write(NVW1_ADDR, data);
stjo2809 0:ff10d457fef2 155 }
stjo2809 0:ff10d457fef2 156 }
stjo2809 0:ff10d457fef2 157
stjo2809 0:ff10d457fef2 158
stjo2809 0:ff10d457fef2 159 void MCP4261::shdn(bool act)
stjo2809 0:ff10d457fef2 160 {
stjo2809 0:ff10d457fef2 161 _nSHDN = ~act;
stjo2809 0:ff10d457fef2 162 }
stjo2809 0:ff10d457fef2 163
stjo2809 0:ff10d457fef2 164
stjo2809 0:ff10d457fef2 165 void MCP4261::wp(bool act)
stjo2809 0:ff10d457fef2 166 {
stjo2809 0:ff10d457fef2 167 _nWP = ~act;
stjo2809 0:ff10d457fef2 168 }
stjo2809 0:ff10d457fef2 169
stjo2809 0:ff10d457fef2 170 //=============================================================================
stjo2809 0:ff10d457fef2 171 // Private functions
stjo2809 0:ff10d457fef2 172 //=============================================================================
stjo2809 0:ff10d457fef2 173
stjo2809 0:ff10d457fef2 174 char MCP4261::_make_command_byte(int com, char address, int data)
stjo2809 0:ff10d457fef2 175 {
stjo2809 2:1e4469bdbed9 176 if(data > 0xff && data <= 0x3FF)
stjo2809 0:ff10d457fef2 177 {
stjo2809 2:1e4469bdbed9 178 _command_byte = address << 4; // add address to _command_byte
stjo2809 2:1e4469bdbed9 179 _command_byte = _command_byte | (data >> 8); // add data to _command_byte
stjo2809 2:1e4469bdbed9 180 _command_byte = _command_byte | (com << 2); // add com to _command_byte
stjo2809 0:ff10d457fef2 181 }
stjo2809 0:ff10d457fef2 182 else
stjo2809 0:ff10d457fef2 183 {
stjo2809 2:1e4469bdbed9 184 _command_byte = address << 4; // add address to _command_byte
stjo2809 2:1e4469bdbed9 185 _command_byte = _command_byte | (com << 2); // add com to _command_byte
stjo2809 2:1e4469bdbed9 186 }
stjo2809 2:1e4469bdbed9 187
stjo2809 2:1e4469bdbed9 188 return _command_byte;
stjo2809 0:ff10d457fef2 189 }
stjo2809 0:ff10d457fef2 190
stjo2809 0:ff10d457fef2 191 int MCP4261::_read(char address)
stjo2809 0:ff10d457fef2 192 {
stjo2809 0:ff10d457fef2 193 int _response_msb;
stjo2809 0:ff10d457fef2 194 int _response_lsb;
stjo2809 0:ff10d457fef2 195 int _response;
stjo2809 0:ff10d457fef2 196
stjo2809 0:ff10d457fef2 197 _response = 0; // clear _response for old data
stjo2809 0:ff10d457fef2 198 _response_msb = 0; // clear _response_msb for old data
stjo2809 0:ff10d457fef2 199 _response_lsb = 0; // clear _response_lsb for old data
stjo2809 0:ff10d457fef2 200
stjo2809 0:ff10d457fef2 201 _make_command_byte(CB_READ, address, 0);
stjo2809 0:ff10d457fef2 202
stjo2809 0:ff10d457fef2 203 _nCs = 0;
stjo2809 2:1e4469bdbed9 204 _response_msb = _spi.write(_command_byte);
stjo2809 2:1e4469bdbed9 205 _response_lsb = _spi.write(0xff); // not important bit of the 16 bits
stjo2809 0:ff10d457fef2 206 _nCs = 1;
stjo2809 0:ff10d457fef2 207
stjo2809 0:ff10d457fef2 208 _response = _response_msb << 8;
stjo2809 0:ff10d457fef2 209 _response = _response | _response_lsb;
stjo2809 0:ff10d457fef2 210
stjo2809 0:ff10d457fef2 211 return _response;
stjo2809 0:ff10d457fef2 212 }
stjo2809 0:ff10d457fef2 213
stjo2809 0:ff10d457fef2 214 void MCP4261::_write(char address, int data)
stjo2809 0:ff10d457fef2 215 {
stjo2809 0:ff10d457fef2 216 _make_command_byte(CB_WRITE, address, data);
stjo2809 0:ff10d457fef2 217 int _send_data = data & 0xff;
stjo2809 0:ff10d457fef2 218
stjo2809 0:ff10d457fef2 219 _nCs = 0;
stjo2809 0:ff10d457fef2 220 _spi.write(_command_byte);
stjo2809 0:ff10d457fef2 221 _spi.write(_send_data);
stjo2809 0:ff10d457fef2 222 _nCs = 1;
stjo2809 0:ff10d457fef2 223 }
stjo2809 0:ff10d457fef2 224
stjo2809 0:ff10d457fef2 225
stjo2809 1:935321af7311 226
stjo2809 1:935321af7311 227
stjo2809 2:1e4469bdbed9 228