AD7172 library

ad7172.h

Committer:
mmdonatti
Date:
2020-05-05
Revision:
3:ae9ae6b0b8e0
Parent:
2:8c5d9f069f11
Child:
5:eeec01a423be

File content as of revision 3:ae9ae6b0b8e0:

//////////////////////////////////////////////////////////////////////////////////
//   @file    AD7172.h
//   @brief   AD7172 header file.
//   @devices AD7172-2
//
//   @author  
//
// 		Mauricio Donatti - mauricio.donatti@lnls.br
//		Lucas Tanio - lucas.tanio@lnls.br
//
// 		LNLS - Brazilian Synchrotron Light Source
// 		GIE - Electronics Instrumentation Group
//
// 		2020, April
//
//	Future Implementation:
//			-CRC and Checksum Support
//
//////////////////////////////////////////////////////////////////////////////////

/*********************************************************************************
* Based on Analog Devices AD717X library, focused on performance improvements
*
* Special thanks to original authors:
*		acozma (andrei.cozma@analog.com)
*		dnechita (dan.nechita@analog.com)
* 
* Copyright 2015(c) Analog Devices, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*  - Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
*  - Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in
*    the documentation and/or other materials provided with the
*    distribution.
*  - Neither the name of Analog Devices, Inc. nor the names of its
*    contributors may be used to endorse or promote products derived
*    from this software without specific prior written permission.
*  - The use of this software may or may not infringe the patent rights
*    of one or more patent holders.  This license does not release you
*    from the requirement that you obtain separate licenses from these
*    patent holders to use this software.
*  - Use of the software either in source or binary form, must be run
*    on or directly connected to an Analog Devices Inc. component.
*
* THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
******************************************************************************/

#ifndef AD7172_H
#define AD7172_H

#include "mbed.h"


#ifdef DEBUG

extern Serial pc;
#define AD7172_PRINTF(fmt, ...)       pc.printf("AD7172: " fmt "\r\n", ##__VA_ARGS__);

#else

#define AD7172_PRINTF(fmt, ...)         __NOP()

#endif // Config enabled DEBUG

typedef union Data32 {
    uint32_t data;
    uint8_t bytes[4];       
}data32;

typedef union Data16 {
    uint16_t data;
    uint8_t bytes[2];       
}data16;

// AD7172-2 Register Map
#define AD7172_COMM_REG       0x00
#define AD7172_STATUS_REG     0x00
#define AD7172_ADCMODE_REG    0x01
#define AD7172_IFMODE_REG     0x02
#define AD7172_REGCHECK_REG   0x03
#define AD7172_DATA_REG       0x04
#define AD7172_GPIOCON_REG    0x06
#define AD7172_ID_REG         0x07
#define AD7172_CHMAP0_REG     0x10
#define AD7172_CHMAP1_REG     0x11
#define AD7172_CHMAP2_REG     0x12
#define AD7172_CHMAP3_REG     0x13
#define AD7172_SETUPCON0_REG  0x20
#define AD7172_SETUPCON1_REG  0x21
#define AD7172_SETUPCON2_REG  0x22
#define AD7172_SETUPCON3_REG  0x23

#define AD7172_FILTCON0_REG   0x28
#define AD7172_FILTCON1_REG   0x29
#define AD7172_FILTCON2_REG   0x2A
#define AD7172_FILTCON3_REG   0x2B

#define AD7172_OFFSET0_REG    0x30
#define AD7172_OFFSET1_REG    0x31
#define AD7172_OFFSET2_REG    0x32
#define AD7172_OFFSET3_REG    0x33

#define AD7172_GAIN0_REG      0x38
#define AD7172_GAIN1_REG      0x39
#define AD7172_GAIN2_REG      0x3A
#define AD7172_GAIN3_REG      0x3B

// Communication Register bits
#define AD7172_COMM_REG_RD     (1 << 6)

// Status Register bits
#define AD7172_STATUS_REG_RDY      (1 << 7)
#define AD7172_STATUS_REG_ADC_ERR  (1 << 6)
#define AD7172_STATUS_REG_CRC_ERR  (1 << 5)
#define AD7172_STATUS_REG_REG_ERR  (1 << 4)
#define AD7172_STATUS_REG_CH(x)    ((x) & 0x03)

// ADC Mode Register bits
#define AD7172_ADCMODE_REG_REF_EN     (1 << 15)
#define AD7172_ADCMODE_REG_HIDE_DELAY   (1 << 14)
#define AD7172_ADCMODE_SING_CYC       (1 << 13)
#define AD7172_ADCMODE_REG_DELAY(x)   (((x) & 0x7) << 8)
#define AD7172_ADCMODE_REG_MODE(x)    (((x) & 0x7) << 4)
#define AD7172_ADCMODE_REG_CLKSEL(x) (((x) & 0x3) << 2)

// Interface Mode Register bits
#define AD7172_IFMODE_REG_ALT_SYNC      (1 << 12)
#define AD7172_IFMODE_REG_IOSTRENGTH    (1 << 11)
#define AD7172_IFMODE_REG_HIDE_DELAY    (1 << 10)
#define AD7172_IFMODE_REG_DOUT_RESET    (1 << 8)
#define AD7172_IFMODE_REG_CONT_READ     (1 << 7)
#define AD7172_IFMODE_REG_DATA_STAT     (1 << 6)
#define AD7172_IFMODE_REG_REG_CHECK     (1 << 5)
#define AD7172_IFMODE_REG_XOR_EN        (0x01 << 2)
#define AD7172_IFMODE_REG_CRC_EN        (0x02 << 2)
#define AD7172_IFMODE_REG_XOR_STAT(x)   (((x) & AD7172_IFMODE_REG_XOR_EN) == AD7172_IFMODE_REG_XOR_EN)
#define AD7172_IFMODE_REG_CRC_STAT(x)   (((x) & AD7172_IFMODE_REG_CRC_EN) == AD7172_IFMODE_REG_CRC_EN)
#define AD7172_IFMODE_REG_DATA_WL16     (1 << 0)

// GPIO Configuration Register bits
#define AD7172_GPIOCON_REG_MUX_IO      (1 << 12)
#define AD7172_GPIOCON_REG_SYNC_EN     (1 << 11)
#define AD7172_GPIOCON_REG_ERR_EN(x)   (((x) & 0x3) << 9)
#define AD7172_GPIOCON_REG_ERR_DAT     (1 << 8)
#define AD7172_GPIOCON_REG_IP_EN1      (1 << 5)
#define AD7172_GPIOCON_REG_IP_EN0      (1 << 4)
#define AD7172_GPIOCON_REG_OP_EN1      (1 << 3)
#define AD7172_GPIOCON_REG_OP_EN0      (1 << 2)
#define AD7172_GPIOCON_REG_DATA1       (1 << 1)
#define AD7172_GPIOCON_REG_DATA0       (1 << 0)

// Channel Map Register 0-3 bits
#define AD7172_CHMAP_REG_CH_EN         (1 << 15)
#define AD7172_CHMAP_REG_SETUP_SEL(x)  (((x) & 0x3) << 12)
#define AD7172_CHMAP_REG_AINPOS(x)     (((x) & 0x1F) << 5)
#define AD7172_CHMAP_REG_AINNEG(x)     (((x) & 0x1F) << 0)

// Setup Configuration Register 0-3 bits
#define AD7172_SETUP_CONF_REG_BI_UNIPOLAR  (1 << 12)
#define AD7172_SETUP_CONF_REG_REFBUF_P    (1 << 11)
#define AD7172_SETUP_CONF_REG_REFBUF_N    (1 << 10)
#define AD7172_SETUP_CONF_REG_AINBUF_P    (1 << 9)
#define AD7172_SETUP_CONF_REG_AINBUF_N    (1 << 8)
#define AD7172_SETUP_CONF_REG_REF_SEL(x)   (((x) & 0x3) << 4)

// Filter Configuration Register 0-3 bits
#define AD7172_FILT_CONF_REG_SINC3_MAP    (1 << 15)
#define AD7172_FILT_CONF_REG_ENHFILTEN    (1 << 11)
#define AD7172_FILT_CONF_REG_ENHFILT(x)   (((x) & 0x7) << 8)
#define AD7172_FILT_CONF_REG_ORDER(x)     (((x) & 0x3) << 5)
#define AD7172_FILT_CONF_REG_ODR(x)       (((x) & 0x1F) << 0)

// Class Declaration
class AD7172
{
public:
	// Class Constructor
	AD7172(SPI& p_spi,PinName slave_select,DigitalIn& p_rdy);
	
	// Enable Device - CS goes low
	void enable();
	
	// Disable Device - CS goes high
	void disable();
	
	// Configure Continuous Convertion Mode
	void start_continuous();
	
	void stop_continuous();
			
	// Read ID function (update ID variable) - Communication Test
	void ReadID();
	
	// Read Status register and update status and ready public variables
	void ReadStatus();

	// Reads the value of the specified register.
	void ReadRegister(uint8_t reg,uint8_t bytes);
	
	// Writes the value of the specified register.
	void WriteRegister(uint8_t reg,uint8_t bytes);
	
	// Resets the device
	void Reset();
	
	// Waits until a new conversion result is available
	void WaitForReady(uint32_t timeout);
	
	// Reads the conversion result from the device
	void ReadDataRegister();
	
	// Reads the conversion result from the device with status reg appended
	void ReadDataRegisterStatus();
	
	// Reads data for continuous read mode
	void ReadDataContinuous();
	
	// Reads data for continuous read mode if DATA STAT bit is set
	void ReadDataContinuousStatus();
	    
    uint8_t status;
    uint8_t sw_ready;
    uint8_t bytes;
    uint8_t channel;
    uint8_t addr;
    
    uint8_t res;
    
	data32 data;
	data16 id;
	DigitalIn &_rdy;

protected:
    SPI &_spi;
	DigitalOut* cs;
		
private:
    int i;
	uint8_t aux;
};

#endif //AD7172_H