3 changed files with 196 additions and 0 deletions
@ -0,0 +1,138 @@ |
|||
//----------------------------------------------------------------------------------------------------------------------------
|
|||
// Project: Uppsense
|
|||
// Name: dac101c085.cpp
|
|||
// Author: Maximilian Stiefel
|
|||
// Date: 08.08.2017
|
|||
//
|
|||
// Description:
|
|||
//
|
|||
//----------------------------------------------------------------------------------------------------------------------------
|
|||
|
|||
//-------------------------------------Libraries------------------------------------------------------------------------------
|
|||
#include "dac101c085.h" |
|||
#include <SmingCore/Wire.h> |
|||
#include <SmingCore/SmingCore.h> |
|||
|
|||
//-------------------------------------Namespaces-----------------------------------------------------------------------------
|
|||
namespace rijnfel { |
|||
namespace dac { |
|||
|
|||
//-------------------------------------Constructor----------------------------------------------------------------------------
|
|||
cDAC101C085::cDAC101C085(uint8_t i_number, uint8_t i_address): |
|||
m_number(i_number), m_address(i_address) |
|||
{} |
|||
|
|||
//-------------------------------------Destructor-----------------------------------------------------------------------------
|
|||
cDAC101C085::~cDAC101C085() |
|||
{} |
|||
|
|||
//-------------------------------------checkDev-------------------------------------------------------------------------------
|
|||
void cDAC101C085::checkDev() |
|||
{ |
|||
// Vars
|
|||
byte error = 0; |
|||
// Action
|
|||
#if DEBUG_LEVEL == 1 |
|||
Serial.print("DAC: Scanning address 0x"); |
|||
Serial.print(m_address, HEX); |
|||
Serial.println("."); |
|||
#endif |
|||
Wire.beginTransmission(m_address); |
|||
error = Wire.endTransmission(); |
|||
I2CError(error); // Pass to error parser
|
|||
} |
|||
|
|||
//-------------------------------------changeSettings-------------------------------------------------------------------------
|
|||
uint8_t cDAC101C085::changeSettings(enum eOpMode mode, uint16_t val) |
|||
{ |
|||
// Vars
|
|||
uint16_t settings = 0; |
|||
// Action
|
|||
if( val > 1023) |
|||
return 0; // This is illegal
|
|||
settings = val << D_BITS_POS; // First two bits have to be 0
|
|||
switch(mode) |
|||
{ |
|||
case NORMAL: |
|||
settings += 0b00 << PD_BITS_POS; |
|||
break; |
|||
case PULL_DOWN_2K5: |
|||
settings += 0b01 << PD_BITS_POS; |
|||
break; |
|||
case PULL_DOWN_100K: |
|||
settings += 0b10 << PD_BITS_POS; |
|||
break; |
|||
case HIGH_IMPEDANCE: |
|||
settings += 0b11 << PD_BITS_POS; |
|||
break; |
|||
|
|||
} |
|||
return WriteSettings(settings); |
|||
} |
|||
|
|||
//-------------------------------------WriteSettings--------------------------------------------------------------------------
|
|||
uint8_t cDAC101C085::WriteSettings(uint16_t settings) |
|||
{ |
|||
// Vars
|
|||
uint8_t error = 0; |
|||
// Action
|
|||
Wire.beginTransmission(m_address); |
|||
Wire.write( (uint8_t) (settings >> 8) ); // Most significant byte
|
|||
Wire.write( (uint8_t) (settings & 0xFF) ); // Least significant byte
|
|||
error = Wire.endTransmission(); |
|||
Serial.print(settings); |
|||
return I2CError(error); // Pass to error parser
|
|||
} |
|||
|
|||
//-------------------------------------ReadSettings--------------------------------------------------------------------------
|
|||
uint16_t cDAC101C085::ReadSettings(void) |
|||
{ |
|||
// Vars
|
|||
uint8_t number = 0; |
|||
uint16_t settings = 0; |
|||
|
|||
// Action
|
|||
number = Wire.requestFrom(m_address, (uint8_t) 2); |
|||
if( number != 2) |
|||
{ |
|||
Serial.print("DAC: Trying to read 2 bytes from 0x"); |
|||
Serial.print(m_address, HEX); |
|||
Serial.println(" went wrong."); |
|||
return 0; |
|||
} |
|||
settings = (uint16_t) Wire.read() << 8; // Most significant byte
|
|||
settings += (uint16_t) Wire.read(); // Least significant byte
|
|||
return settings; |
|||
} |
|||
|
|||
//-------------------------------------I2CError-------------------------------------------------------------------------------
|
|||
uint8_t cDAC101C085::I2CError(uint8_t error) |
|||
{ |
|||
switch(error) |
|||
{ |
|||
case 0: |
|||
#if DEBUG_LEVEL == 1 |
|||
Serial.println("DAC: I2C device found. Transmission successful."); |
|||
#endif |
|||
break; |
|||
case 2: |
|||
Serial.print("DAC: Received NACK after address from 0x."); |
|||
Serial.print(m_address, HEX); |
|||
Serial.println("."); |
|||
break; |
|||
case 3: |
|||
Serial.print("DAC: Received NACK after data from 0x."); |
|||
Serial.print(m_address, HEX); |
|||
Serial.println("."); |
|||
break; |
|||
case 4: |
|||
Serial.print("DAC: Unknow error at 0x."); |
|||
Serial.print(m_address, HEX); |
|||
Serial.println("."); |
|||
break; |
|||
} |
|||
return ( (error == 0) ? 1 : 0 ); |
|||
} |
|||
|
|||
} |
|||
} |
@ -0,0 +1,48 @@ |
|||
//----------------------------------------------------------------------------------------------------------------------------
|
|||
// Project: Uppsense
|
|||
// Name: dac101c085.h
|
|||
// Author: Maximilian Stiefel
|
|||
// Date: 08.08.2017
|
|||
//
|
|||
// Description:
|
|||
//
|
|||
//----------------------------------------------------------------------------------------------------------------------------
|
|||
|
|||
#ifndef APP_DAC101C085_H_ |
|||
#define APP_DAC101C085_H_ |
|||
|
|||
//-------------------------------------Libraries------------------------------------------------------------------------------
|
|||
#include <stdint.h> |
|||
|
|||
//-------------------------------------Defines--------------------------------------------------------------------------------
|
|||
#define DEBUG_LEVEL 1 // 1 a lot debugging output, else rare debugging output
|
|||
#define PD_BITS_POS 14 // Position of power down bits
|
|||
#define D_BITS_POS 2 // Position of data bits
|
|||
|
|||
//-------------------------------------Namespaces-----------------------------------------------------------------------------
|
|||
namespace rijnfel { |
|||
namespace dac { |
|||
|
|||
//-------------------------------------Enums----------------------------------------------------------------------------------
|
|||
enum eOpMode {NORMAL, PULL_DOWN_2K5, PULL_DOWN_100K, HIGH_IMPEDANCE}; |
|||
|
|||
//-------------------------------------cDAC101085-----------------------------------------------------------------------------
|
|||
class cDAC101C085 |
|||
{ |
|||
public: |
|||
cDAC101C085(uint8_t number, uint8_t i_address); // Constructor
|
|||
~cDAC101C085(); // Destructor
|
|||
void checkDev(); // Check if device is available and alive
|
|||
uint16_t ReadSettings(void); |
|||
uint8_t WriteSettings(uint16_t settings); |
|||
uint8_t changeSettings(enum eOpMode mode, uint16_t val); |
|||
|
|||
private: |
|||
uint8_t m_number; // Which of the dacs is it?
|
|||
uint8_t m_address; |
|||
uint8_t I2CError(uint8_t error); |
|||
}; |
|||
|
|||
} |
|||
} |
|||
#endif /* APP_DAC101C085_H_ */ |
Loading…
Reference in new issue