mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
167 lines
2.8 KiB
C++
167 lines
2.8 KiB
C++
//
|
|
// FILE: MAX520.cpp
|
|
// AUTHOR: Rob Tillaart
|
|
// DATE: 2024-03-06
|
|
// VERSION: 0.1.1
|
|
// PURPOSE: Arduino library for MAX520 and MAX521 4/8 channel 8 bit DAC.
|
|
// URL: https://github.com/RobTillaart/MAX520
|
|
|
|
|
|
#include "MAX520.h"
|
|
|
|
#define MAX520_RESET 0x10
|
|
#define MAX520_POWERDOWN 0x08
|
|
#define MAX520_WAKEUP 0x00
|
|
|
|
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// CONSTRUCTOR
|
|
//
|
|
MAX520::MAX520(const uint8_t deviceAddress, TwoWire *wire)
|
|
{
|
|
_address = deviceAddress;
|
|
_wire = wire;
|
|
_channels = 4;
|
|
_error = MAX520_OK;
|
|
}
|
|
|
|
|
|
bool MAX520::begin()
|
|
{
|
|
if (! isConnected()) return false;
|
|
reset();
|
|
return true;
|
|
}
|
|
|
|
|
|
bool MAX520::isConnected()
|
|
{
|
|
_wire->beginTransmission(_address);
|
|
return ( _wire->endTransmission() == 0);
|
|
}
|
|
|
|
|
|
bool MAX520::setAddress(const uint8_t deviceAddress)
|
|
{
|
|
_address = deviceAddress;
|
|
return isConnected();
|
|
}
|
|
|
|
|
|
uint8_t MAX520::getAddress()
|
|
{
|
|
return _address;
|
|
}
|
|
|
|
|
|
uint8_t MAX520::getChannels()
|
|
{
|
|
return _channels;
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// READ WRITE
|
|
//
|
|
int MAX520::write(uint8_t channel, uint8_t value)
|
|
{
|
|
if (channel >= _channels) return MAX520_CHANNEL_ERROR;
|
|
|
|
_values[channel] = value;
|
|
|
|
uint8_t command = channel;
|
|
_wire->beginTransmission(_address);
|
|
_wire->write(command);
|
|
_wire->write(value);
|
|
return _wire->endTransmission();
|
|
}
|
|
|
|
|
|
// Can be optimized with one I2C transaction.
|
|
// page 11 figure 7
|
|
int MAX520::write(uint8_t * values)
|
|
{
|
|
for (int i = 0; i < _channels; i++)
|
|
{
|
|
uint8_t rv = write(i, values[i]);
|
|
if (rv != MAX520_OK)
|
|
{
|
|
return rv;
|
|
}
|
|
}
|
|
return MAX520_OK;
|
|
}
|
|
|
|
|
|
int MAX520::read(uint8_t channel)
|
|
{
|
|
if (channel >= _channels)
|
|
{
|
|
_error = MAX520_CHANNEL_ERROR;
|
|
return 255; // buggy
|
|
}
|
|
_error = MAX520_OK;
|
|
return _values[channel];
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// RESET (page 11) and POWER DOWN (page12)
|
|
//
|
|
int MAX520::reset()
|
|
{
|
|
for (int i = 0; i < _channels; i++)
|
|
{
|
|
_values[i] = 0;
|
|
}
|
|
_wire->beginTransmission(_address);
|
|
_wire->write(MAX520_RESET);
|
|
_wire->write(0x00); // needs a value to ignore
|
|
return _wire->endTransmission();
|
|
}
|
|
|
|
|
|
int MAX520::powerDown()
|
|
{
|
|
_wire->beginTransmission(_address);
|
|
_wire->write(MAX520_POWERDOWN);
|
|
return _wire->endTransmission();
|
|
}
|
|
|
|
|
|
int MAX520::wakeUp()
|
|
{
|
|
_wire->beginTransmission(_address);
|
|
_wire->write(MAX520_WAKEUP);
|
|
return _wire->endTransmission();
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// DEBUG
|
|
//
|
|
int MAX520::lastError()
|
|
{
|
|
int e = _error;
|
|
_error = MAX520_OK; // reset error after read, is this wise?
|
|
return e;
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// DERIVED CLASS MAX521
|
|
//
|
|
MAX521::MAX521(uint8_t deviceAddress, TwoWire *wire) : MAX520(deviceAddress, wire)
|
|
{
|
|
_channels = 8;
|
|
}
|
|
|
|
|
|
// -- END OF FILE --
|
|
|