#driver #embedded-hal-driver #embedded-hal #dac8168 #dac7568

no-std dac8568

A simple platform agnostic library for the Texas Instruments DAC8568, DAC8168 and DAC7568

9 releases

0.0.9 Sep 2, 2022
0.0.8 Sep 2, 2022
0.0.7 Jun 30, 2022
0.0.6 Feb 27, 2022
0.0.2 Apr 26, 2021

#215 in Embedded development

MIT license

13KB
156 lines

dac8568

A platform agnostic library for the Texas Instruments DAC8568.

dac8568

description

The DAC7568, DAC8168, and DAC8568 are low-power, voltage-output, eight-channel, 12-, 14- and 16-bit digital-to-analog converters, respectively. These devices include a 2.5V, 2ppm/°C internal reference (disabled by default), giving a full-scale output voltage range of 2.5V or 5V. The internal reference has an initial accuracy of 0.004% and can source up to 20mA at the VREFIN/VREFOUT pin. These devices are monotonic, providing excellent linearity and minimizing undesired code-to-code transient voltages (glitch). They use a versatile 3-wire serial interface that operates at clock rates up to 50MHz. The interface is compatible with standard SPI™, QSPI™, Microwire™, and digital signal processor (DSP) interfaces.

features

wip features

Feel free to create an issue and PR if you would like to add support for the more advanced features

  • Asynchronous modes utilizing the LDAC line
  • Flexible mode
  • Generic support for DAC7568 (12-Bit) and DAC8168 (14-Bit)

example

Note: Quick example based on the stm32h7xx-hal.

// Initialise SPI. Ensure correct polarity and phase are respected
let spi: Spi<SPI1, Enabled> = interface.spi(
    (sck, NoMiso, mosi),
    spi::MODE_1, // polarity: Polarity::IdleLow,
                 // phase: Phase::CaptureOnSecondTransition,
    10.mhz(),
    prec,
    clocks,
);
// Initialise SYNC for SPI communications
let sync = sync.into_push_pull_output();
// Initialize the dac instance
let mut dac = dac8568::Dac::new(spi, sync);
// Perform a software reset of DAC8568 to clear all registers
dac.reset();
// Configure the DAC to use the internal 2.5v reference
dac.use_internal_reference().unwrap();
// Optionally, invert the output signal
dac.set_inverted_output(true);
// Now transfer the data to update the DAC as a blocking call
dac.set_voltage(dac8568::Channel::A, voltage).unwrap();

// Alternatively, you can maintain ownership of the SPI and SYNC if you need to use
// asynchronous communication such as Interrupts and/or DMA.
let (spi, sync) = dac.release();
// And then access the desired message directly
let message = dac8568::Message::get_voltage_message(dac8568::Channel::A, voltage, false);
// Get the message data that can be transferred manually
let payload = message.get_payload_bytes();
// And then write the message bytes to a DMA RAM buffer

Dependencies

~71KB