#embedded-hal-driver #driver #embedded-hal #digital-signal #dac7568 #dac8168

no-std dac8568

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

10 releases

0.0.10 Jul 15, 2024
0.0.9 Sep 2, 2022
0.0.7 Jun 30, 2022
0.0.6 Feb 27, 2022
0.0.2 Apr 26, 2021

#208 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