MCP4922 Lib
Fork of MCP4922 by
MCP4922.cpp@0:be25d2147046, 2017-09-25 (annotated)
- Committer:
- AkinoriHashimoto
- Date:
- Mon Sep 25 05:48:38 2017 +0000
- Revision:
- 0:be25d2147046
MCP4922 Lib.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AkinoriHashimoto | 0:be25d2147046 | 1 | #include "MCP4922.h" |
AkinoriHashimoto | 0:be25d2147046 | 2 | |
AkinoriHashimoto | 0:be25d2147046 | 3 | // **** Constructor & destructor **** |
AkinoriHashimoto | 0:be25d2147046 | 4 | // With LathPin |
AkinoriHashimoto | 0:be25d2147046 | 5 | MCP4922::MCP4922(PinName mosi, PinName sck, PinName _cs, PinName _latch) |
AkinoriHashimoto | 0:be25d2147046 | 6 | : p_spi(new SPI(mosi, NC, sck)), spi(*p_spi), cs(_cs, 1), latch(_latch, 1) |
AkinoriHashimoto | 0:be25d2147046 | 7 | { |
AkinoriHashimoto | 0:be25d2147046 | 8 | useLPin= true; //Latch pin |
AkinoriHashimoto | 0:be25d2147046 | 9 | } |
AkinoriHashimoto | 0:be25d2147046 | 10 | MCP4922::MCP4922(SPI &_spi, PinName _cs, PinName _latch) |
AkinoriHashimoto | 0:be25d2147046 | 11 | : p_spi(NULL), spi(_spi), cs(_cs, 1), latch(_latch, 1) |
AkinoriHashimoto | 0:be25d2147046 | 12 | { |
AkinoriHashimoto | 0:be25d2147046 | 13 | useLPin= true; //Latch pin |
AkinoriHashimoto | 0:be25d2147046 | 14 | } |
AkinoriHashimoto | 0:be25d2147046 | 15 | // W/O LatchPin |
AkinoriHashimoto | 0:be25d2147046 | 16 | MCP4922::MCP4922(PinName mosi, PinName sck, PinName _cs) |
AkinoriHashimoto | 0:be25d2147046 | 17 | : p_spi(new SPI(mosi, NC, sck)), spi(*p_spi), cs(_cs, 1), latch(NC) |
AkinoriHashimoto | 0:be25d2147046 | 18 | { |
AkinoriHashimoto | 0:be25d2147046 | 19 | useLPin= false; //Latch pin |
AkinoriHashimoto | 0:be25d2147046 | 20 | } |
AkinoriHashimoto | 0:be25d2147046 | 21 | MCP4922::MCP4922(SPI &_spi, PinName _cs) |
AkinoriHashimoto | 0:be25d2147046 | 22 | : p_spi(NULL), spi(_spi), cs(_cs, 1), latch(NC) |
AkinoriHashimoto | 0:be25d2147046 | 23 | { |
AkinoriHashimoto | 0:be25d2147046 | 24 | useLPin= false; //Latch pin |
AkinoriHashimoto | 0:be25d2147046 | 25 | } |
AkinoriHashimoto | 0:be25d2147046 | 26 | MCP4922::~MCP4922() |
AkinoriHashimoto | 0:be25d2147046 | 27 | { |
AkinoriHashimoto | 0:be25d2147046 | 28 | if(p_spi != NULL) |
AkinoriHashimoto | 0:be25d2147046 | 29 | delete p_spi; |
AkinoriHashimoto | 0:be25d2147046 | 30 | } |
AkinoriHashimoto | 0:be25d2147046 | 31 | |
AkinoriHashimoto | 0:be25d2147046 | 32 | // **** INIT Config **** |
AkinoriHashimoto | 0:be25d2147046 | 33 | MCP4922::ERR MCP4922::init(int hz, int gainA, int gainB, bool bufA, bool bufB) |
AkinoriHashimoto | 0:be25d2147046 | 34 | { |
AkinoriHashimoto | 0:be25d2147046 | 35 | // valA/B init. |
AkinoriHashimoto | 0:be25d2147046 | 36 | // valA= 0x0000; // bit15 : 0 |
AkinoriHashimoto | 0:be25d2147046 | 37 | // valB= 0x8000; // bit15 : 1 |
AkinoriHashimoto | 0:be25d2147046 | 38 | |
AkinoriHashimoto | 0:be25d2147046 | 39 | if(hz <= 0 || 20000000 < hz) |
AkinoriHashimoto | 0:be25d2147046 | 40 | return ERR_HZ; |
AkinoriHashimoto | 0:be25d2147046 | 41 | spi.frequency(hz); |
AkinoriHashimoto | 0:be25d2147046 | 42 | spi.format(16); // 16bit, mode=0 |
AkinoriHashimoto | 0:be25d2147046 | 43 | |
AkinoriHashimoto | 0:be25d2147046 | 44 | _bufA= bufA; |
AkinoriHashimoto | 0:be25d2147046 | 45 | _bufB= bufB; |
AkinoriHashimoto | 0:be25d2147046 | 46 | // valA |= (_bufA << 14); // if ture; |= 0x0400 |
AkinoriHashimoto | 0:be25d2147046 | 47 | // valB |= (_bufB << 14); |
AkinoriHashimoto | 0:be25d2147046 | 48 | |
AkinoriHashimoto | 0:be25d2147046 | 49 | if(!(gainA==1 || gainA==2)) |
AkinoriHashimoto | 0:be25d2147046 | 50 | return ERR_GAIN; |
AkinoriHashimoto | 0:be25d2147046 | 51 | if(!(gainB==1 || gainB==2)) |
AkinoriHashimoto | 0:be25d2147046 | 52 | return ERR_GAIN; |
AkinoriHashimoto | 0:be25d2147046 | 53 | _gainA= (gainA==1) ? true : false; // false=0: 2x |
AkinoriHashimoto | 0:be25d2147046 | 54 | _gainB= (gainB==1) ? true : false; // false=0: 2x |
AkinoriHashimoto | 0:be25d2147046 | 55 | // valA |= (_gainA << 13); |
AkinoriHashimoto | 0:be25d2147046 | 56 | // valB |= (_gainB << 13); |
AkinoriHashimoto | 0:be25d2147046 | 57 | |
AkinoriHashimoto | 0:be25d2147046 | 58 | // bit12; ShatDown=0 |
AkinoriHashimoto | 0:be25d2147046 | 59 | // valA |= (1 << 12); |
AkinoriHashimoto | 0:be25d2147046 | 60 | // valB |= (1 << 12); |
AkinoriHashimoto | 0:be25d2147046 | 61 | valA= 0x0000+ (_bufA << 14)+ (_gainA << 13)+ 0x1000; |
AkinoriHashimoto | 0:be25d2147046 | 62 | valB= 0x8000+ (_bufB << 14)+ (_gainB << 13)+ 0x1000; |
AkinoriHashimoto | 0:be25d2147046 | 63 | |
AkinoriHashimoto | 0:be25d2147046 | 64 | return SUCCESS; |
AkinoriHashimoto | 0:be25d2147046 | 65 | } |
AkinoriHashimoto | 0:be25d2147046 | 66 | |
AkinoriHashimoto | 0:be25d2147046 | 67 | |
AkinoriHashimoto | 0:be25d2147046 | 68 | void MCP4922::setVal(int valA, int valB) |
AkinoriHashimoto | 0:be25d2147046 | 69 | { |
AkinoriHashimoto | 0:be25d2147046 | 70 | this->setVal(chA, valA); |
AkinoriHashimoto | 0:be25d2147046 | 71 | this->setVal(chB, valB); |
AkinoriHashimoto | 0:be25d2147046 | 72 | this->write(); |
AkinoriHashimoto | 0:be25d2147046 | 73 | return; |
AkinoriHashimoto | 0:be25d2147046 | 74 | } |
AkinoriHashimoto | 0:be25d2147046 | 75 | |
AkinoriHashimoto | 0:be25d2147046 | 76 | void MCP4922::setVal(float valA, float valB) |
AkinoriHashimoto | 0:be25d2147046 | 77 | { |
AkinoriHashimoto | 0:be25d2147046 | 78 | int a= (int)(valA*4095.0+ 0.5); |
AkinoriHashimoto | 0:be25d2147046 | 79 | int b= (int)(valB*4095.0+ 0.5); |
AkinoriHashimoto | 0:be25d2147046 | 80 | this->setVal(a, b); |
AkinoriHashimoto | 0:be25d2147046 | 81 | return; |
AkinoriHashimoto | 0:be25d2147046 | 82 | } |
AkinoriHashimoto | 0:be25d2147046 | 83 | |
AkinoriHashimoto | 0:be25d2147046 | 84 | void MCP4922::setVal(CH ch, int val) |
AkinoriHashimoto | 0:be25d2147046 | 85 | { |
AkinoriHashimoto | 0:be25d2147046 | 86 | /* if(val < 0 || 4096 < val) |
AkinoriHashimoto | 0:be25d2147046 | 87 | return ERR_VAL;*/ |
AkinoriHashimoto | 0:be25d2147046 | 88 | if(val < 0) |
AkinoriHashimoto | 0:be25d2147046 | 89 | val= 0; |
AkinoriHashimoto | 0:be25d2147046 | 90 | if(4096 < val) |
AkinoriHashimoto | 0:be25d2147046 | 91 | val= 4095; |
AkinoriHashimoto | 0:be25d2147046 | 92 | |
AkinoriHashimoto | 0:be25d2147046 | 93 | uint16_t tmp= val; // bit0-bit11; 1B+4b |
AkinoriHashimoto | 0:be25d2147046 | 94 | if(ch == chA) { |
AkinoriHashimoto | 0:be25d2147046 | 95 | valA &= 0xf000; |
AkinoriHashimoto | 0:be25d2147046 | 96 | valA |= tmp; |
AkinoriHashimoto | 0:be25d2147046 | 97 | } else { |
AkinoriHashimoto | 0:be25d2147046 | 98 | valB &= 0xf000; |
AkinoriHashimoto | 0:be25d2147046 | 99 | valB |= tmp; |
AkinoriHashimoto | 0:be25d2147046 | 100 | } |
AkinoriHashimoto | 0:be25d2147046 | 101 | return; |
AkinoriHashimoto | 0:be25d2147046 | 102 | } |
AkinoriHashimoto | 0:be25d2147046 | 103 | |
AkinoriHashimoto | 0:be25d2147046 | 104 | void MCP4922::setVal(CH ch, float val) |
AkinoriHashimoto | 0:be25d2147046 | 105 | { |
AkinoriHashimoto | 0:be25d2147046 | 106 | /* if(val < 0.0 || 1.0 < val) |
AkinoriHashimoto | 0:be25d2147046 | 107 | return ERR_VAL;*/ |
AkinoriHashimoto | 0:be25d2147046 | 108 | if(val < 0.0) |
AkinoriHashimoto | 0:be25d2147046 | 109 | val= 0.0; |
AkinoriHashimoto | 0:be25d2147046 | 110 | if(1.0 < val) |
AkinoriHashimoto | 0:be25d2147046 | 111 | val= 1.0; |
AkinoriHashimoto | 0:be25d2147046 | 112 | |
AkinoriHashimoto | 0:be25d2147046 | 113 | this->setVal(ch, (int)(val*4095.0+ 0.5)); |
AkinoriHashimoto | 0:be25d2147046 | 114 | return; |
AkinoriHashimoto | 0:be25d2147046 | 115 | } |
AkinoriHashimoto | 0:be25d2147046 | 116 | |
AkinoriHashimoto | 0:be25d2147046 | 117 | void MCP4922::write() |
AkinoriHashimoto | 0:be25d2147046 | 118 | { |
AkinoriHashimoto | 0:be25d2147046 | 119 | this->_write(valA); |
AkinoriHashimoto | 0:be25d2147046 | 120 | this->_write(valB); |
AkinoriHashimoto | 0:be25d2147046 | 121 | this->update(); |
AkinoriHashimoto | 0:be25d2147046 | 122 | return; |
AkinoriHashimoto | 0:be25d2147046 | 123 | } |
AkinoriHashimoto | 0:be25d2147046 | 124 | |
AkinoriHashimoto | 0:be25d2147046 | 125 | void MCP4922::write(CH ch, bool latch) |
AkinoriHashimoto | 0:be25d2147046 | 126 | { |
AkinoriHashimoto | 0:be25d2147046 | 127 | uint16_t val; |
AkinoriHashimoto | 0:be25d2147046 | 128 | if(ch == chA) |
AkinoriHashimoto | 0:be25d2147046 | 129 | val= valA; |
AkinoriHashimoto | 0:be25d2147046 | 130 | else |
AkinoriHashimoto | 0:be25d2147046 | 131 | val= valB; |
AkinoriHashimoto | 0:be25d2147046 | 132 | _write(val); |
AkinoriHashimoto | 0:be25d2147046 | 133 | |
AkinoriHashimoto | 0:be25d2147046 | 134 | if(!latch) |
AkinoriHashimoto | 0:be25d2147046 | 135 | update(); |
AkinoriHashimoto | 0:be25d2147046 | 136 | |
AkinoriHashimoto | 0:be25d2147046 | 137 | return; |
AkinoriHashimoto | 0:be25d2147046 | 138 | } |
AkinoriHashimoto | 0:be25d2147046 | 139 | |
AkinoriHashimoto | 0:be25d2147046 | 140 | void MCP4922::_write(uint16_t val) |
AkinoriHashimoto | 0:be25d2147046 | 141 | { |
AkinoriHashimoto | 0:be25d2147046 | 142 | latch= 1; |
AkinoriHashimoto | 0:be25d2147046 | 143 | cs= 0; |
AkinoriHashimoto | 0:be25d2147046 | 144 | spi.write(val); |
AkinoriHashimoto | 0:be25d2147046 | 145 | cs= 1; |
AkinoriHashimoto | 0:be25d2147046 | 146 | return; |
AkinoriHashimoto | 0:be25d2147046 | 147 | } |
AkinoriHashimoto | 0:be25d2147046 | 148 | |
AkinoriHashimoto | 0:be25d2147046 | 149 | void MCP4922::update() |
AkinoriHashimoto | 0:be25d2147046 | 150 | { |
AkinoriHashimoto | 0:be25d2147046 | 151 | if(latch == NULL) |
AkinoriHashimoto | 0:be25d2147046 | 152 | return; |
AkinoriHashimoto | 0:be25d2147046 | 153 | latch= 0; |
AkinoriHashimoto | 0:be25d2147046 | 154 | } |
AkinoriHashimoto | 0:be25d2147046 | 155 | |
AkinoriHashimoto | 0:be25d2147046 | 156 | // EOF |