MCP4922 Lib
Fork of MCP4922 by
Embed:
(wiki syntax)
Show/hide line numbers
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
Generated on Fri Jul 22 2022 18:32:14 by 1.7.2