MCP4922 Lib

Fork of MCP4922 by Akinori Hashimoto

Committer:
AkinoriHashimoto
Date:
Mon Sep 25 05:48:38 2017 +0000
Revision:
0:be25d2147046
MCP4922 Lib.

Who changed what in which revision?

UserRevisionLine numberNew 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