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)
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)
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)
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
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;
47 static bool configure(
I2C_Device * dev,
i2cAddr addr,
int scan,
int chan,
bool sgl)
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;
58 if (!configure(dev, addr, _CFG_SCAN_NONE, ch,
true))
return errRebase(
"MAX123x");
63 *result = ((buf[0] << 8) | (buf[1])) & 0x0FFF;
71 if (!configure(dev, addr, _CFG_SCAN_UPTO, upToCh,
true))
return errRebase(
"MAX123x");
73 if (!
i2cRead(dev, addr, (uint8_t *)results, (upToCh + 1) * 2))
return errRebase(
"MAX123x");
78 for (i = 0; i <= upToCh; ++i)
79 results[i] = results[i] & 0x0FFF;
bool i2cWrite(I2C_Device *dev, i2cAddr addr, uint8_t *bytes, int len)
Writes to the I2C device.
Structure defines OpenCores I2C Device.
bool max123xConvert(I2C_Device *dev, i2cAddr addr, int ch, uint16_t *result)
Performs a single conversion of a specific channel.
uint8_t i2cAddr
I2C address type.
bool max123xSetup(I2C_Device *dev, i2cAddr addr, int ref, bool extclk, bool bipolar)
Writes the setup register of the MAX123x.
bool max123xScanUpTo(I2C_Device *dev, i2cAddr addr, int upToCh, uint16_t *results)
Scan from analog input up to a given channel.
MAX123x multichannel ADC driver.
bool i2cRead(I2C_Device *dev, i2cAddr addr, uint8_t *bytes, int len)
Reads from the I2C device.
static bool errRebase(const char *name)
Rebases the cause of the error message.