MCP4922 Lib

Fork of MCP4922 by Akinori Hashimoto

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MCP4922.cpp Source File

MCP4922.cpp

00001 #include "MCP4922.h"
00002 
00003 // **** Constructor & destructor ****
00004 // With LathPin
00005 MCP4922::MCP4922(PinName mosi, PinName sck, PinName _cs, PinName _latch)
00006     : p_spi(new SPI(mosi, NC, sck)), spi(*p_spi), cs(_cs, 1), latch(_latch, 1)
00007 {
00008     useLPin= true;  //Latch pin
00009 }
00010 MCP4922::MCP4922(SPI &_spi, PinName _cs, PinName _latch)
00011     : p_spi(NULL), spi(_spi), cs(_cs, 1), latch(_latch, 1)
00012 {
00013     useLPin= true;  //Latch pin
00014 }
00015 // W/O LatchPin
00016 MCP4922::MCP4922(PinName mosi, PinName sck, PinName _cs)
00017     : p_spi(new SPI(mosi, NC, sck)), spi(*p_spi), cs(_cs, 1), latch(NC)
00018 {
00019     useLPin= false;  //Latch pin
00020 }
00021 MCP4922::MCP4922(SPI &_spi, PinName _cs)
00022     : p_spi(NULL), spi(_spi), cs(_cs, 1), latch(NC)
00023 {
00024     useLPin= false;  //Latch pin
00025 }
00026 MCP4922::~MCP4922()
00027 {
00028     if(p_spi != NULL)
00029         delete p_spi;
00030 }
00031 
00032 // **** INIT Config ****
00033 MCP4922::ERR MCP4922::init(int hz, int gainA, int gainB, bool bufA, bool bufB)
00034 {
00035     // valA/B init.
00036 //    valA= 0x0000;   // bit15 : 0
00037 //    valB= 0x8000;   // bit15 : 1
00038 
00039     if(hz <= 0 || 20000000 < hz)
00040         return ERR_HZ;
00041     spi.frequency(hz);
00042     spi.format(16);  // 16bit, mode=0
00043 
00044     _bufA= bufA;
00045     _bufB= bufB;
00046 //    valA |= (_bufA << 14);  // if ture; |= 0x0400
00047 //    valB |= (_bufB << 14);
00048 
00049     if(!(gainA==1 || gainA==2))
00050         return ERR_GAIN;
00051     if(!(gainB==1 || gainB==2))
00052         return ERR_GAIN;
00053     _gainA= (gainA==1) ? true : false;  // false=0: 2x
00054     _gainB= (gainB==1) ? true : false;  // false=0: 2x
00055 //    valA |= (_gainA << 13);
00056 //    valB |= (_gainB << 13);
00057 
00058     // bit12; ShatDown=0
00059 //    valA |= (1 << 12);
00060 //    valB |= (1 << 12);
00061     valA= 0x0000+ (_bufA << 14)+ (_gainA << 13)+ 0x1000;
00062     valB= 0x8000+ (_bufB << 14)+ (_gainB << 13)+ 0x1000;
00063 
00064     return SUCCESS;
00065 }
00066 
00067 
00068 void MCP4922::setVal(int valA, int valB)
00069 {
00070     this->setVal(chA, valA);
00071     this->setVal(chB, valB);
00072     this->write();
00073     return;
00074 }
00075 
00076 void MCP4922::setVal(float valA, float valB)
00077 {
00078     int a= (int)(valA*4095.0+ 0.5);
00079     int b= (int)(valB*4095.0+ 0.5);
00080     this->setVal(a, b);
00081     return;
00082 }
00083 
00084 void MCP4922::setVal(CH ch, int val)
00085 {
00086     /*    if(val < 0 || 4096 < val)
00087             return ERR_VAL;*/
00088     if(val < 0)
00089         val= 0;
00090     if(4096 < val)
00091         val= 4095;
00092 
00093     uint16_t tmp= val;    // bit0-bit11; 1B+4b
00094     if(ch == chA) {
00095         valA &= 0xf000;
00096         valA |= tmp;
00097     } else {
00098         valB &= 0xf000;
00099         valB |= tmp;
00100     }
00101     return;
00102 }
00103 
00104 void MCP4922::setVal(CH ch, float val)
00105 {
00106     /*    if(val < 0.0 || 1.0 < val)
00107             return ERR_VAL;*/
00108     if(val < 0.0)
00109         val= 0.0;
00110     if(1.0 < val)
00111         val= 1.0;
00112 
00113     this->setVal(ch, (int)(val*4095.0+ 0.5));
00114     return;
00115 }
00116 
00117 void MCP4922::write()
00118 {
00119     this->_write(valA);
00120     this->_write(valB);
00121     this->update();
00122     return;
00123 }
00124 
00125 void MCP4922::write(CH ch, bool latch)
00126 {
00127     uint16_t val;
00128     if(ch == chA)
00129         val= valA;
00130     else
00131         val= valB;
00132     _write(val);
00133 
00134     if(!latch)
00135         update();
00136 
00137     return;
00138 }
00139 
00140 void MCP4922::_write(uint16_t val)
00141 {
00142     latch= 1;
00143     cs= 0;
00144     spi.write(val);
00145     cs= 1;
00146     return;
00147 }
00148 
00149 void MCP4922::update()
00150 {
00151     if(latch == NULL)
00152         return;
00153     latch= 0;
00154 }
00155 
00156 // EOF