I²C DAC example

View on GitHub

/* I2CDAC.cs
 *
 * This example demonstrates how to use an I2C host supported by LibTiePie.
 * It shows how to control an Analog Devices AD5667 dual 16-bit DAC.
 *
 * Find more information on http://www.tiepie.com/LibTiePie .
 */

using System;
using TiePie.LibTiePie;

class I2CDACExample
{
    // AD5667 address:
    private const UInt16 AD5667_ADDRESS = 12;

    // AD5667 registers:
    private const Byte AD5567_REG_DAC_A = 0x0;
    private const Byte AD5567_REG_DAC_B = 0x1;
    private const Byte AD5667_REG_DAC_ALL = 0x7;

    // AD5667 commands:
    private const Byte AD5667_CMD_WRITE = 0x0;
    private const Byte AD5667_CMD_UPDATE = 0x8;
    private const Byte AD5667_CMD_WRITE_UPDATE_ALL = 0x10;
    private const Byte AD5667_CMD_WRITE_UPDATE = 0x18;
    private const Byte AD5667_CMD_POWER = 0x20;
    private const Byte AD5667_CMD_RESET = 0x28;
    private const Byte AD5667_CMD_LDAC_SETUP = 0x30;
    private const Byte AD5667_CMD_REF_SETUP = 0x38;

    public static void Main()
    {
        // Print library information:
        PrintInfo.PrintLibraryInfo();

        // Enable network search:
        Network.AutoDetectEnabled = true;

        // Update device list:
        DeviceList.Update();

        // Try to open an I2C host:
        I2CHost I2C = null;

        for (UInt32 i = 0; i < DeviceList.Count; i++)
        {
            DeviceListItem item = DeviceList.GetItemByIndex(i);
            if (item.CanOpen(DeviceType.I2CHost))
            {
                I2C = item.OpenI2CHost();
                break;
            }
        }

        if (I2C != null)
        {
            try
            {
                // Print I2C host info:
                PrintInfo.PrintDeviceInfo(I2C);

                // Turn on internal reference for DAC A:
                I2C.WriteByteWord(AD5667_ADDRESS, AD5667_CMD_REF_SETUP | AD5567_REG_DAC_A, 1);

                // Set DAC A to mid level:
                I2C.WriteByteWord(AD5667_ADDRESS, AD5667_CMD_WRITE_UPDATE | AD5567_REG_DAC_A, 0x8000);
            }
            catch (System.Exception e)
            {
                Console.WriteLine("Exception: " + e.Message);
                Environment.Exit(1);
            }

            // Close I2C host:
            I2C.Dispose();
            I2C = null;
        }
        else
        {
            Console.WriteLine("No I2C host available!");
            Environment.Exit(1);
        }

        System.Environment.Exit(0);
    }
}