I2CDAC.c

/**
 * I2CDAC.c
 *
 * 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 .
 */

#include <stdlib.h>
#include <stdio.h>
#include <libtiepie.h>
#include "CheckStatus.h"
#include "PrintInfo.h"
#include "Utils.h"

// AD5667 address:
#define AD5667_ADDRESS 12

// AD5667 registers:
#define AD5667_REG_DAC_A   0x00
#define AD5667_REG_DAC_B   0x01
#define AD5667_REG_DAC_ALL 0x07

// AD5667 commands:
#define AD5667_CMD_WRITE            0x00
#define AD5667_CMD_UPDATE           0x08
#define AD5667_CMD_WRITE_UPDATE_ALL 0x10
#define AD5667_CMD_WRITE_UPDATE     0x18
#define AD5667_CMD_POWER            0x20
#define AD5667_CMD_RESET            0x28
#define AD5667_CMD_LDAC_SETUP       0x30
#define AD5667_CMD_REF_SETUP        0x38

int main(int argc, char* argv[])
{
  int status = EXIT_SUCCESS;

  // Initialize library:
  LibInit();

  // Print library information:
  printLibraryInfo();

  // Enable network search:
  NetSetAutoDetectEnabled(BOOL8_TRUE);
  CHECK_LAST_STATUS();

  // Update device list:
  LstUpdate();
  CHECK_LAST_STATUS();

  // Try to open an I2C host:
  LibTiePieHandle_t i2c = LIBTIEPIE_HANDLE_INVALID;

  for(uint32_t index = 0; index < LstGetCount(); index++)
  {
    if(LstDevCanOpen(IDKIND_INDEX, index, DEVICETYPE_I2CHOST))
    {
      i2c = LstOpenI2CHost(IDKIND_INDEX, index);
      CHECK_LAST_STATUS();

      if(i2c)
      {
        break;
      }
    }
  }

  if(i2c != LIBTIEPIE_HANDLE_INVALID)
  {
    // Print I2C host info:
    printDeviceInfo(i2c);

    // Turn on internal reference for DAC A:
    I2CWriteByteWord(i2c, AD5667_ADDRESS, AD5667_CMD_REF_SETUP | AD5667_REG_DAC_A, 1);
    CHECK_LAST_STATUS();

    // Set DAC A to mid level:
    I2CWriteByteWord(i2c, AD5667_ADDRESS, AD5667_CMD_WRITE_UPDATE | AD5667_REG_DAC_A, 0x8000);
    CHECK_LAST_STATUS();

    // Close I2C host:
    ObjClose(i2c);
    CHECK_LAST_STATUS();
  }
  else
  {
    fprintf(stderr, "No I2C host available!" NEWLINE);
    status = EXIT_FAILURE;
  }

  // Exit library:
  LibExit();

  return status;
}