ADS1246/7/8 24bit ADC converter for Temperature Sensors class
Revision 0:e015f99b8dfb, committed 2014-09-17
- Comitter:
- mederic
- Date:
- Wed Sep 17 08:20:38 2014 +0000
- Child:
- 1:d62be7487e9d
- Commit message:
- first release
Changed in this revision
ADS1248.cpp | Show annotated file Show diff for this revision Revisions of this file |
ADS1248.h | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ADS1248.cpp Wed Sep 17 08:20:38 2014 +0000 @@ -0,0 +1,137 @@ +#include "ADS1248.h" + +//***********************************/************************************ +// Constructors // +//***********************************/************************************ +ADS1248::ADS1248(SPI& spi, PinName cs, PinName rdy, PinName start):_spi(spi),_cs(cs),_rdy(rdy),_start(start){ + + _cs = 0; + _start = 1; + _spi.format(8,1); + wait(0.016); + _cs = 1; +} + +//***********************************/************************************ +// Public Methods // +//***********************************/************************************ +void ADS1248::start(bool en){ + _start = en; +} + +void ADS1248::waitReady(void){ + while(!_rdy); + while(_rdy); +} + +void ADS1248::sleep(bool en){ + _start = 1; + _cs = 0; + _spi.write(en<<1); + wait_us(1); + _cs = 1; + waitReady(); +} + +void ADS1248::sync(void){ + _start = 1; + _cs = 0; + _spi.write(SYNC); + _spi.write(SYNC); + wait_us(1); + _cs = 1; +} + +void ADS1248::reset(void){ + _start = 1; + _cs = 0; + _spi.write(RESET); + wait_us(1); + _cs = 1; + wait_us(600); +} + + +int ADS1248::read(void){ + int data; + _start = 1; + waitReady(); + _cs = 0; + _spi.write(RDATA); + data = ((_spi.write(0)<<24)&0xFF000000); + data |=((_spi.write(0)<<16)&0x00FF0000); + data |=((_spi.write(0)<< 8)&0x0000FF00); + data >>= 8; + data &= 0xfffffff8; + wait_us(1); + _cs = 1; + wait_us(1); + return data; +} + +ADS1248::operator int(){ + return read(); +} + + +void ADS1248::readReg(unsigned char reg, unsigned char *buff, int len){ + _start = 1; + _cs = 0; + _spi.write(RREG|(reg&0x0F)); + _spi.write(len-1); + while(len--){ + *(buff++) = _spi.write(0); + }wait_us(1); + _cs = 1; + wait_us(1); +} + +unsigned char ADS1248::readReg(unsigned char reg){ + unsigned char ret; + readReg(reg,&ret,1); + return ret; +} + +void ADS1248::writeReg(unsigned char reg, const unsigned char *buff, int len){ + _start = 1; + _cs = 0; + _spi.write(WREG|(reg&0x0F)); + _spi.write(len-1); + while(len--){ + _spi.write(*(buff++)); + }wait_us(1); + _cs = 1; + wait_us(1); +} + +void ADS1248::writeReg(unsigned char reg, unsigned char val){ + writeReg(reg,&val,1); +} + +void ADS1248::systemOffsetCal(void){ + _start = 1; + _cs = 0; + _spi.write(SYSOCAL); + wait_us(1); + _cs = 1; + waitReady(); +} + +void ADS1248::systemGainCal(void){ + _start = 1; + _cs = 0; + _spi.write(SYSGCAL); + wait_us(1); + _cs = 1; + waitReady(); +} + +void ADS1248::selfOffsetCal(void){ + _start = 1; + _cs = 0; + _spi.write(SELFOCAL); + wait_us(1); + _cs = 1; + waitReady(); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ADS1248.h Wed Sep 17 08:20:38 2014 +0000 @@ -0,0 +1,134 @@ +#ifndef ADS1248_H +#define ADS1248_H + +#include "mbed.h" +/** ADS1248 class. + * Used for read ADS1248/7/6 Temperature ADC + * + */ +class ADS1248 +{ + public: + /** Create ADS1248 instance + * @param SPI SPI bus to use + * @param cs pin to connect at CS input + * @param rdy pin connect at !rdy output + * @param start pin connect at start inpout (pullup if unused) + */ + ADS1248(SPI& spi, PinName cs, PinName rdy, PinName start = NC); + + /** register name list of ADS1248 + */ + enum reg{ + MUX0 = 0x00, + VBIAS = 0x01, + MUX1 = 0x02, + SYS0 = 0x03, + OFC0 = 0x04, + OFC1 = 0x05, + OFC2 = 0x06, + FSC0 = 0x07, + FSC1 = 0x08, + FSC2 = 0x09, + IDAC0 = 0x0A, + IDAC1 = 0x0B, + GPIOCFG = 0x0C, + GPIODIR = 0x0D, + GPIODAT = 0x0E}; + + /** commande list of ADS1248 + */ + enum cmd{ + WAKEUP = 0x00, + SLEEP = 0x02, + SYNC = 0x04, + RESET = 0x06, + NOP = 0xff, + RDATA = 0x12, + RDATAC = 0x14, + SDATAC = 0x16, + RREG = 0x20, + WREG = 0x40, + SYSOCAL = 0x60, + SYSGCAL = 0x61, + SELFOCAL= 0x62}; + + /** Access to output start pin + * @param en start pin state + */ + void start(bool en); + + /** Wait ADS1248 to be ready (pooling method) + */ + void waitReady(void); + + /** Sleep cmd of ADS1248 (ask waitReady) + * @param en for wakeup or sleep + */ + void sleep(bool en); + + /** Synchronisation cmd of ADS1248 + */ + void sync(void); + + /** Reset cmd of ADS1248 + */ + void reset(void); + + /** Read data when conversion was finished (ask waitReady) + * @return 24bit data 2's complement + */ + int read(void); + + /** Ask read + * @return 24bit data 2's complement + */ + operator int(); + + /** Read ADS1248 register + * @param reg is register address + * @return register value + */ + unsigned char readReg(unsigned char reg); + + /** Read ADS1248 registers + * @param reg is first register address + * @param buff pointer on buffer to write + * @param len lenght of data to read + */ + void readReg(unsigned char reg, unsigned char *buff, int len); + + /** Write ADS1248 register + * @param reg is register address + * @param val value to write + */ + void writeReg(unsigned char reg, unsigned char val); + + /** Write ADS1248 registers + * @param reg is first register address + * @param buff pointer on buffer to read + * @param len lenght of data to write + */ + void writeReg(unsigned char reg, const unsigned char *buff, int len); + + /** System Offset Calibration cmd of ADS1248 (ask waitReady) + */ + void systemOffsetCal(void); + + /** System Gain Calibration cmd of ADS1248 (ask waitReady) + */ + void systemGainCal(void); + + /** Self Offset Calibration cmd of ADS1248 (ask waitReady) + */ + void selfOffsetCal(void); + + + private: + SPI& _spi; + DigitalOut _cs; + DigitalIn _rdy; + DigitalOut _start; +}; + +#endif