12-Bit DAC with internal Vref and SPI interface

Fork of MCP4822 by TeamElectronics

Committer:
stjo2809
Date:
Wed Jan 20 10:55:01 2016 +0000
Revision:
1:d97fd6c6e2e4
Parent:
0:929babff65b1
tested

Who changed what in which revision?

UserRevisionLine numberNew contents of line
stjo2809 0:929babff65b1 1 /* mbed MCP4822 Library, for driving the 12-Bit DAC with internal Vref and SPI interface
stjo2809 0:929babff65b1 2 * Copyright (c) 2015, Created by Steen Joergensen (stjo2809)
stjo2809 0:929babff65b1 3 *
stjo2809 0:929babff65b1 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
stjo2809 0:929babff65b1 5 * of this software and associated documentation files (the "Software"), to deal
stjo2809 0:929babff65b1 6 * in the Software without restriction, including without limitation the rights
stjo2809 0:929babff65b1 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
stjo2809 0:929babff65b1 8 * copies of the Software, and to permit persons to whom the Software is
stjo2809 0:929babff65b1 9 * furnished to do so, subject to the following conditions:
stjo2809 0:929babff65b1 10 *
stjo2809 0:929babff65b1 11 * The above copyright notice and this permission notice shall be included in
stjo2809 0:929babff65b1 12 * all copies or substantial portions of the Software.
stjo2809 0:929babff65b1 13 *
stjo2809 0:929babff65b1 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
stjo2809 0:929babff65b1 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
stjo2809 0:929babff65b1 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
stjo2809 0:929babff65b1 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
stjo2809 0:929babff65b1 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
stjo2809 0:929babff65b1 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
stjo2809 0:929babff65b1 20 * THE SOFTWARE.
stjo2809 0:929babff65b1 21 */
stjo2809 0:929babff65b1 22
stjo2809 0:929babff65b1 23 #include "mbed.h"
stjo2809 0:929babff65b1 24 #include "MCP4822.h"
stjo2809 0:929babff65b1 25
stjo2809 0:929babff65b1 26 //=============================================================================
stjo2809 0:929babff65b1 27 // Public functions
stjo2809 0:929babff65b1 28 //=============================================================================
stjo2809 0:929babff65b1 29
stjo2809 1:d97fd6c6e2e4 30 MCP4822::MCP4822(SPI& spi, PinName nCs, PinName nLDAC) : _spi(spi), _nCs(nCs), _nLDAC(nLDAC)
stjo2809 0:929babff65b1 31 {
stjo2809 1:d97fd6c6e2e4 32 _nCs = 1;
stjo2809 0:929babff65b1 33 }
stjo2809 0:929babff65b1 34
stjo2809 0:929babff65b1 35 void MCP4822::a(bool gain, int data)
stjo2809 0:929babff65b1 36 {
stjo2809 0:929babff65b1 37 _write(0, gain, 1, data);
stjo2809 0:929babff65b1 38 }
stjo2809 0:929babff65b1 39
stjo2809 0:929babff65b1 40 void MCP4822::b(bool gain, int data)
stjo2809 0:929babff65b1 41 {
stjo2809 0:929babff65b1 42 _write(1, gain, 1, data);
stjo2809 0:929babff65b1 43 }
stjo2809 0:929babff65b1 44
stjo2809 0:929babff65b1 45 void MCP4822::ldac(bool act)
stjo2809 0:929babff65b1 46 {
stjo2809 0:929babff65b1 47 _nLDAC = ~act;
stjo2809 0:929babff65b1 48 }
stjo2809 0:929babff65b1 49
stjo2809 1:d97fd6c6e2e4 50 bool MCP4822::ldac()
stjo2809 1:d97fd6c6e2e4 51 {
stjo2809 1:d97fd6c6e2e4 52 return _nLDAC;
stjo2809 1:d97fd6c6e2e4 53 }
stjo2809 1:d97fd6c6e2e4 54
stjo2809 0:929babff65b1 55 void MCP4822::shdn(bool output, bool act)
stjo2809 0:929babff65b1 56 {
stjo2809 1:d97fd6c6e2e4 57 _write(output, 1, ~act, 0x00);
stjo2809 1:d97fd6c6e2e4 58 _SHDN_STATUS = act;
stjo2809 1:d97fd6c6e2e4 59 }
stjo2809 1:d97fd6c6e2e4 60
stjo2809 1:d97fd6c6e2e4 61 bool MCP4822::shdn()
stjo2809 1:d97fd6c6e2e4 62 {
stjo2809 1:d97fd6c6e2e4 63 return _SHDN_STATUS;
stjo2809 0:929babff65b1 64 }
stjo2809 0:929babff65b1 65
stjo2809 0:929babff65b1 66 //=============================================================================
stjo2809 0:929babff65b1 67 // Private functions
stjo2809 0:929babff65b1 68 //=============================================================================
stjo2809 0:929babff65b1 69
stjo2809 0:929babff65b1 70 char MCP4822::_make_upper_half(bool output, bool gain, bool shdn, int data)
stjo2809 0:929babff65b1 71 {
stjo2809 0:929babff65b1 72 char responce = 0;
stjo2809 0:929babff65b1 73
stjo2809 1:d97fd6c6e2e4 74 if(output == 0)
stjo2809 0:929babff65b1 75 {
stjo2809 0:929babff65b1 76 responce = responce | CB_OUTPUT_A;
stjo2809 0:929babff65b1 77 }
stjo2809 0:929babff65b1 78 else
stjo2809 0:929babff65b1 79 {
stjo2809 0:929babff65b1 80 responce = responce | CB_OUTPUT_B;
stjo2809 0:929babff65b1 81 }
stjo2809 0:929babff65b1 82
stjo2809 1:d97fd6c6e2e4 83 if(gain == 0)
stjo2809 0:929babff65b1 84 {
stjo2809 0:929babff65b1 85 responce = responce | CB_GAIN_2X;
stjo2809 0:929babff65b1 86 }
stjo2809 0:929babff65b1 87 else
stjo2809 0:929babff65b1 88 {
stjo2809 0:929babff65b1 89 responce = responce | CB_GAIN_1X;
stjo2809 0:929babff65b1 90 }
stjo2809 0:929babff65b1 91
stjo2809 1:d97fd6c6e2e4 92 if(shdn == 0)
stjo2809 0:929babff65b1 93 {
stjo2809 0:929babff65b1 94 responce = responce | CB_NSHDN;
stjo2809 0:929babff65b1 95 }
stjo2809 0:929babff65b1 96 else
stjo2809 0:929babff65b1 97 {
stjo2809 0:929babff65b1 98 responce = responce | CB_SHDN;
stjo2809 0:929babff65b1 99 }
stjo2809 0:929babff65b1 100
stjo2809 1:d97fd6c6e2e4 101 if(data > 0xff && data <= 0xfff)
stjo2809 0:929babff65b1 102 {
stjo2809 0:929babff65b1 103 responce = responce | (data >> 8);
stjo2809 0:929babff65b1 104 }
stjo2809 0:929babff65b1 105
stjo2809 0:929babff65b1 106 return responce;
stjo2809 0:929babff65b1 107 }
stjo2809 0:929babff65b1 108
stjo2809 0:929babff65b1 109 char MCP4822::_make_lower_half(int data)
stjo2809 0:929babff65b1 110 {
stjo2809 0:929babff65b1 111 return (data & 0xff);
stjo2809 0:929babff65b1 112 }
stjo2809 0:929babff65b1 113
stjo2809 0:929babff65b1 114 void MCP4822::_write(bool output, bool gain, bool shdn, int data)
stjo2809 0:929babff65b1 115 {
stjo2809 0:929babff65b1 116
stjo2809 0:929babff65b1 117 _upper_half = _make_upper_half(output, gain, shdn, data);
stjo2809 0:929babff65b1 118 _lower_half = _make_lower_half(data);
stjo2809 0:929babff65b1 119
stjo2809 0:929babff65b1 120 _nCs = 0;
stjo2809 0:929babff65b1 121 _spi.write(_upper_half);
stjo2809 0:929babff65b1 122 _spi.write(_lower_half);
stjo2809 0:929babff65b1 123 _nCs = 1;
stjo2809 1:d97fd6c6e2e4 124 }