KM3NeT CLB  2.0
KM3NeT CLB v2 Embedded Software
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
max123x.c
1 /*
2  * KM3NeT CLB v2 Firmware
3  * ----------------------
4  *
5  * Copyright 2012-2014 KM3NeT Collaboration
6  *
7  * All Rights Reserved.
8  *
9  *
10  * File : max123x.c
11  * Created : 28 jul. 2014
12  * Author : Vincent van Beveren
13  */
14 
15 #include "drv/i2c/max123x.h"
16 
17 
18 #define _SU_REG_SETUP BIT(7) // Must be set, indicates setup
19 #define _SU_REG_SEL_SHIFT 4
20 #define _SU_REG_SEL_MASK ( MASK(3) << _SU_REG_SEL_SHIFT)
21 
22 #define _SU_REG_EXTCLK BIT(3) // When set, uses external clock
23 #define _SU_REG_BIP BIT(2) // Bipolar
24 #define _SU_REG_NORESETREG BIT(1)
25 
26 #define _CFG_REG_SCAN_SHIFT 5
27 #define _CFG_REG_SCAN_MASK ( MASK(2) << _CFG_REG_SCAN_SHIFT )
28 #define _CFG_REG_CS_SHIFT 1
29 #define _CFG_REG_CS_MASK ( MASK(4) << _CFG_REG_CS_SHIFT )
30 #define _CFG_REG_SGL BIT(0)
31 
32 #define _CFG_SCAN_UPTO 0
33 #define _CFG_SCAN_CONV8 1
34 #define _CFG_SCAN_HALF_UPTO 2
35 #define _CFG_SCAN_NONE 3
36 
37 
38 bool max123xSetup(I2C_Device * dev, i2cAddr addr, int ref, bool extclk, bool bipolar)
39 {
40  uint8_t su = _SU_REG_SETUP | _SU_REG_NORESETREG;
41  su |= (ref << _SU_REG_SEL_SHIFT) & _SU_REG_SEL_MASK;
42  if (extclk) su |= _SU_REG_EXTCLK;
43  if (bipolar) su |= _SU_REG_BIP;
44  return i2cWrite(dev, addr, &su, 1);
45 }
46 
47 static bool configure(I2C_Device * dev, i2cAddr addr, int scan, int chan, bool sgl)
48 {
49  uint8_t cfg = 0;
50  cfg |= _CFG_REG_SCAN_MASK & ( scan << _CFG_REG_SCAN_SHIFT );
51  cfg |= _CFG_REG_CS_MASK & ( chan << _CFG_REG_CS_SHIFT );
52  if (sgl) cfg |= _CFG_REG_SGL;
53  return i2cWrite(dev, addr, &cfg, 1);
54 }
55 
56 bool max123xConvert(I2C_Device * dev, i2cAddr addr, int ch, uint16_t * result)
57 {
58  if (!configure(dev, addr, _CFG_SCAN_NONE, ch, true)) return errRebase("MAX123x");
59 
60  uint8_t buf[2];
61 
62  if (!i2cRead(dev, addr, buf, 2)) return errRebase("MAX123x");
63  *result = ((buf[0] << 8) | (buf[1])) & 0x0FFF;
64 
65  return true;
66 }
67 
68 bool max123xScanUpTo(I2C_Device * dev, i2cAddr addr, int upToCh, uint16_t * results)
69 {
70  int i;
71  if (!configure(dev, addr, _CFG_SCAN_UPTO, upToCh, true)) return errRebase("MAX123x");
72 
73  if (!i2cRead(dev, addr, (uint8_t *)results, (upToCh + 1) * 2)) return errRebase("MAX123x");
74 
75  // XXX: will go wrong on little endian machines.
76 
77  // PAds off error bytes
78  for (i = 0; i <= upToCh; ++i)
79  results[i] = results[i] & 0x0FFF;
80 
81 
82  return true;
83 }
bool i2cWrite(I2C_Device *dev, i2cAddr addr, uint8_t *bytes, int len)
Writes to the I2C device.
Definition: i2c.c:219
Structure defines OpenCores I2C Device.
Definition: dev_i2c.h:55
bool max123xConvert(I2C_Device *dev, i2cAddr addr, int ch, uint16_t *result)
Performs a single conversion of a specific channel.
Definition: max123x.c:56
uint8_t i2cAddr
I2C address type.
Definition: i2c.h:93
bool max123xSetup(I2C_Device *dev, i2cAddr addr, int ref, bool extclk, bool bipolar)
Writes the setup register of the MAX123x.
Definition: max123x.c:38
bool max123xScanUpTo(I2C_Device *dev, i2cAddr addr, int upToCh, uint16_t *results)
Scan from analog input up to a given channel.
Definition: max123x.c:68
MAX123x multichannel ADC driver.
bool i2cRead(I2C_Device *dev, i2cAddr addr, uint8_t *bytes, int len)
Reads from the I2C device.
Definition: i2c.c:161
static bool errRebase(const char *name)
Rebases the cause of the error message.
Definition: err.h:104