From 9a9d8e33e942f8a2af0828181203c4a1def62adb Mon Sep 17 00:00:00 2001 From: batt Date: Mon, 15 Feb 2010 17:59:06 +0000 Subject: [PATCH] Add Texas Instruments TLV5618 DAC driver. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@3172 38d2e660-2303-0410-9eaa-f027e97ec537 --- bertos/drv/tlv5618.c | 104 +++++++++++++++++++++++++++++++++++++++++ bertos/drv/tlv5618.h | 59 +++++++++++++++++++++++ bertos/hw/hw_tlv5618.h | 69 +++++++++++++++++++++++++++ 3 files changed, 232 insertions(+) create mode 100644 bertos/drv/tlv5618.c create mode 100644 bertos/drv/tlv5618.h create mode 100644 bertos/hw/hw_tlv5618.h diff --git a/bertos/drv/tlv5618.c b/bertos/drv/tlv5618.c new file mode 100644 index 00000000..4639df6b --- /dev/null +++ b/bertos/drv/tlv5618.c @@ -0,0 +1,104 @@ +/** + * \file + * + * + * \author Francesco Sacchi + * + * Texas instrument TLV5618 DAC driver. + */ + +#include "tlv5618.h" +#include "hw/hw_tlv5618.h" + +#include + +#include //memset + + +static void tlv5618_write(Tlv5618 *ctx, uint16_t val) +{ + TLV5618_CSLOW(ctx->cs_pin); + kfile_putc(val >> 8, ctx->ch); + kfile_putc(val & 0xFF, ctx->ch); + kfile_flush(ctx->ch); + TLV5618_CSHIGH(ctx->cs_pin); +} + +#define POWERDOWN 0x2000 +#define OUTA 0xC000 +#define OUTB 0x4000 + +/** + * Set DAC output A to \a val. + * \a val ranges from 0 to 4095 (12 bit). + * \note : if in power down, the device will be awaken. + */ +void tlv5618_setOutA(Tlv5618 *ctx, uint16_t val) +{ + val &= 0x0FFF; + tlv5618_write(ctx, val | OUTA); +} + +/** + * Set DAC output B to \a val. + * \a val ranges from 0 to 4095 (12 bit). + * \note : if in power down, the device will be awaken. + */ +void tlv5618_setOutB(Tlv5618 *ctx, uint16_t val) +{ + val &= 0x0FFF; + tlv5618_write(ctx, val | OUTB); +} + +/** + * Set the TLV5618 in the power down state. + */ +void tlv5618_setPowerDown(Tlv5618 *ctx) +{ + tlv5618_write(ctx, POWERDOWN); +} + + +/** + * Init the TLV5618 with CS connected to \a cs_pin. + * \a ch should be the SPI channel needed to communicate with the DAC. + * This SPI should also be correctly configured (the MOSI should + * change on the rising edge of the SCK clock). + * \note the device is set in power down mode. + */ +void tlv5618_init(Tlv5618 *ctx, KFile *ch, int cs_pin) +{ + memset(ctx, 0, sizeof(*ctx)); + ctx->cs_pin = cs_pin; + ctx->ch = ch; + TLV5618_CSINIT(cs_pin); + tlv5618_setPowerDown(ctx); +} diff --git a/bertos/drv/tlv5618.h b/bertos/drv/tlv5618.h new file mode 100644 index 00000000..7deb1eb7 --- /dev/null +++ b/bertos/drv/tlv5618.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \author Francesco Sacchi + * + * \brief Texas instrument TLV5618 DAC driver. + * + * $WIZ$ module_name = "tlv5618" + * $WIZ$ module_depends = "kfile" + * $WIZ$ module_hw = "bertos/hw/hw_tlv5618.h" + */ + +#ifndef DRV_TLV5618_H +#define DRV_TLV5618_H + +#include +#include + +typedef struct Tlv5618 +{ + KFile *ch; + int cs_pin; +} Tlv5618; + +void tlv5618_setOutA(Tlv5618 *ctx, uint16_t val); +void tlv5618_setOutB(Tlv5618 *ctx, uint16_t val); +void tlv5618_setPowerDown(Tlv5618 *ctx); +void tlv5618_init(Tlv5618 *ctx, KFile *ch, int pin); + +#endif /* DRV_TLV5618_H */ diff --git a/bertos/hw/hw_tlv5618.h b/bertos/hw/hw_tlv5618.h new file mode 100644 index 00000000..4a2b4202 --- /dev/null +++ b/bertos/hw/hw_tlv5618.h @@ -0,0 +1,69 @@ +/** + * \file + * + * + * \brief TLV5816 DAC hardware-specific definitions + * + * + * \author Francesco Sacchi + */ + +#ifndef HW_TLV5816_H +#define HW_TLV5816_H + +#warning TODO:This is an example implementation, you must implement it! + +#define TLV5618_CSINIT(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ + TLV5618_CSHIGH(pin); \ +} while(0) + +#define TLV5618_CSLOW(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ +} while(0) + + +#define TLV5618_CSHIGH(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ +} while(0) + + +#endif /* HW_TLV5816_H */ + -- 2.25.1