ADS1246/7/8 24bit ADC converter for Temperature Sensors class

Files at this revision

API Documentation at this revision

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