Library for TI's DRV2667

DRV2667.h

Committer:
takuhachisu
Date:
2018-02-19
Revision:
3:870dc06a0e8a
Parent:
2:101901b3f05e

File content as of revision 3:870dc06a0e8a:

#ifndef DRV2667_H
#define DRV2667_H

#include "mbed.h"

// DRV2667 Slave Address
#define SLAVE_ADDR_7_BIT 0x59

/** Library for the TI DRV2667
 *
 */

class DRV2667
{

public:
    // Selects the source to be played in register 0x01, bit 2
    enum InputMux {
        Digital = 0,    // Digital input source
        Analog = 0x04,  // Analog input source
    };

    // Selects the gain for the amplifier in register 0x01, bits [1:0]
    enum Gain {
        GNx1,    // 0x00:  50 Vpp - 28.8 dB
        GNx2,    // 0x01: 100 Vpp - 34.8 dB
        GNx3,    // 0x02: 150 Vpp - 38.4 dB
        GNx4,    // 0x03: 200 Vpp - 40.7 dB
    };

    // Time period when the FIFO runs empty and the device goes into idle
    // mode, powering down the boost converter and amplifier in register
    // 0x02, bits [3:2]
    enum Timeout {
        TOx1 = 0,    // 5 msec
        TOx2 = 0x04,    // 10 msec
        TOx3 = 0x08,    // 15 msec
        TOx4 = 0x0C,    // 20 msec
    };

    /**
    * Create a DRV2667 object
    *
    * @param &i2c pointer of I2C object
    * @param im DRV2667::Digital or DRV2667::Analog
    * @param gn gain for the amplifier
    * @param to timeout for FIFO interface (digital input only)
    */
    DRV2667(I2C &i2c, InputMux im = Digital, Gain gn = GNx1, Timeout to = TOx1);

    /**
    * Write value to specified register of device
    * @param reg      The device register to write
    * @param value    The value to write to the register
    */
    void i2cWriteByte(char reg, char value);

    /**
    * Read value from register of device
    * @param reg  The device register to read
    * @return     The result
    */
    char i2cReadByte(char reg);
    
    /**
    * Initialize the device
    *
    * @param im DRV2667::Digital or DRV2667::Analog
    * @param gn gain for the amplifier
    * @param to timeout for FIFO interface (digital input only)
    */
    void init(InputMux im = Digital, Gain gn = GNx1, Timeout to = TOx1);

    /**
    * Reset the device
    */
    void reset();
    
    /**
    * Starts waveform playback
    */
    void play();

    /**
    * Cancel waveform playback
    */
    void stop();
    
    /**
    * Get state of playing
    */
    bool isPlaying();
    
    /**
    * Set sequencer to play waveform
    *   
    * @param id array of waveform ID in RAM
    * @param setNum the number of waveform to set
    */
    void setWaveform(char* id, char setNum);

    ///**
    //* Entry point for FIFO data read out automatically at an 8-kHz sampling rate
    //*
    //* @param data signed 8-bit data
    //* @param size size of waveform
    //* To be implemented
    //*/
    //void loadFIFO(signed char* data, char size);

    /**
    * Set internal wavefrom storage for the Waveform Synthesis Playback mode
    * @param data[][0] Peak voltage = amp / 255  x Gain / 2
    * @param data[][1] Sinusoidal frequency
    * @param data[][2] Number of cycles to be played
    * @param data[][3] The envelope setting: bits [7:4] sets ramp-up rate; 
    *                  bits [3:0] sets ramp-down rate. 0x00 NoEnvelope; 0x01 
    *                  32ms; 0x02 64ms; 0x03 96ms; 0x04 128ms; 0x05 160ms; 
    *                  0x06 192ms; 0x07 224ms; 0x08 256ms; 0x09 512ms; 0x0A
    *                  768ms; 0x0B 1024ms; 0xC 1280ms; 0x0D 1536ms; 0x0E
    *                  1792ms; 0x0F 2048ms.
    * @param data[][4] Number of repeat. Setting "0" plays infinite loop until
    *                  the GO bit is cleared by the user.
    * @param waveNum the number of waveform
    */
    void setWSP(char data[][5], char waveNum);

    ///**
    //* Set internal wavefrom storage for the Direct Playback from RAM mode
    //* To be implemented
    //*/
    //void setDPR(void);

private:
    I2C *_i2c;
};

#endif