Elmaddin Guliyev / Mbed 2 deprecated ADS1299

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ads1299.cpp Source File

ads1299.cpp

00001 #include "mbed.h"
00002 #include "ads1299.h"
00003 
00004 SPI spi(SPI_MOSI,SPI_MISO,SPI_SCK);
00005 DigitalOut  CS(PA_4);
00006 InterruptIn DRDY(PA_2);  
00007 
00008 long ADS129X_data[9];
00009 bool ADS129X_newData;
00010 void ADS129X_dataReadyISR();
00011  
00012 void SPI_INIT(void){
00013     spi.format(8,1);
00014     spi.frequency(1000000);
00015     }
00016 
00017 void WAKEUP() {
00018     CS = 0;
00019     spi.write(ADS129X_CMD_WAKEUP);
00020     wait_us(2);
00021     CS = 1;  
00022     wait_us(2);   
00023     }
00024 
00025 void STANDBY() {
00026     CS = 0;
00027     spi.write(ADS129X_CMD_STANDBY);
00028     wait_us(2);
00029     CS = 1;
00030     }
00031 
00032 void RSET() {
00033     CS = 0;
00034     spi.write(ADS129X_CMD_RESET);
00035     wait_us(2);
00036     CS =1;
00037     wait_ms(10);  
00038     }
00039 
00040 void START() {
00041   //  CS = 0;
00042     //spi.write(ADS129X_CMD_START);
00043   //  wait_us(2);
00044   //  CS = 1;
00045     RDATA();
00046     DRDY.fall(&ADS129X_dataReadyISR);
00047 }
00048     
00049  
00050 void RDATAC() {
00051     CS =0;;
00052     spi.write(ADS129X_CMD_RDATAC);
00053     wait_us(2);
00054     CS = 1;
00055     wait_us(2); //must way at least 4 tCLK cycles before sending another command (Datasheet, pg. 39)
00056     }
00057     
00058 void SDATAC() {
00059     CS = 0;
00060     spi.write(ADS129X_CMD_SDATAC); //SDATAC
00061     wait_us(2);
00062     CS=1;
00063 }
00064 
00065 void RDATA() {
00066     CS =0;
00067     spi.write(ADS129X_CMD_RDATA);
00068     wait_us(2);
00069     CS=1;
00070     }
00071 
00072 char RREG(char _address) {
00073     char opcode1 = ADS129X_CMD_RREG | (_address & 0x1F); //001rrrrr; _RREG = 00100000 and _address = rrrrr
00074     CS = 0; //Low to communicate
00075     spi.write(opcode1); //RREG
00076     spi.write(0x00); //opcode2
00077     wait_us(1);
00078     char data = spi.write(0x00); // read (Datasheet, pg.39)
00079     wait_us(2);
00080     CS =1; //High to end communication
00081     return data;
00082 }
00083 
00084 void RREG(char _address, char _numRegisters, char *_data) {
00085     char opcode1 = ADS129X_CMD_RREG | (_address & 0x1F); //001rrrrr; _RREG = 00100000 and _address = rrrrr
00086     CS = 0;  
00087     spi.write(ADS129X_CMD_SDATAC); //SDATAC
00088     spi.write(opcode1); //RREG
00089     spi.write(_numRegisters-1); //opcode2
00090     for(char i = 0; i < _numRegisters; i++){
00091         *(_data+i) = spi.write(0x00);  
00092     }
00093     wait_us(2);
00094     CS = 1;  
00095 }
00096 
00097 void WREG(char _address, char _value) {
00098     char opcode1 = ADS129X_CMD_WREG | (_address & 0x1F); //001rrrrr; _RREG = 00100000 and _address = rrrrr ds
00099     CS=0; //Low to communicate
00100     spi.write(opcode1);
00101     spi.write(0x00); // opcode2; only write one register
00102     spi.write(_value);
00103     wait_us(2);
00104     CS = 1; //Low to communicate
00105 }
00106 
00107 char getDeviceId() {
00108     CS=0; //Low to communicate
00109     spi.write(ADS129X_CMD_RREG); //RREG
00110     spi.write(0x00); 
00111     char data = spi.write(0x00); // byte to read (hopefully 0b???11110)
00112     wait_us(2);
00113     CS=1; //Low to communicate
00114     return data;
00115 }
00116 
00117 void Set_IRQ(){
00118    // DRDY.fall(&ADS129X_dataReadyISR);
00119     }
00120 
00121 void ADS129X_dataReadyISR() {
00122 
00123     CS = 0;
00124     
00125     // status
00126     ((char*) ADS129X_data)[0*4+3] = 0;
00127     ((char*) ADS129X_data)[0*4+2] = spi.write(0x00);
00128     ((char*) ADS129X_data)[0*4+1] = spi.write(0x00);
00129     ((char*) ADS129X_data)[0*4+0] = spi.write(0x00);
00130     // channel 1
00131     ((char*) ADS129X_data)[1*4+3] = 0;
00132     ((char*) ADS129X_data)[1*4+2] = spi.write(0x00);
00133     ((char*) ADS129X_data)[1*4+1] = spi.write(0x00);
00134     ((char*) ADS129X_data)[1*4+0] = spi.write(0x00);
00135     // channel 2
00136     ((char*) ADS129X_data)[2*4+3] = 0;
00137     ((char*) ADS129X_data)[2*4+2] = spi.write(0x00);
00138     ((char*) ADS129X_data)[2*4+1] = spi.write(0x00);
00139     ((char*) ADS129X_data)[2*4+0] = spi.write(0x00);
00140     // channel 3
00141     ((char*) ADS129X_data)[3*4+3] = 0;
00142     ((char*) ADS129X_data)[3*4+2] = spi.write(0x00);
00143     ((char*) ADS129X_data)[3*4+1] = spi.write(0x00);
00144     ((char*) ADS129X_data)[3*4+0] = spi.write(0x00);
00145     // channel 4
00146     ((char*) ADS129X_data)[4*4+3] = 0;
00147     ((char*) ADS129X_data)[4*4+2] = spi.write(0x00);
00148     ((char*) ADS129X_data)[4*4+1] = spi.write(0x00);
00149     ((char*) ADS129X_data)[4*4+0] = spi.write(0x00);
00150     // channel 5
00151     ((char*) ADS129X_data)[5*4+3] = 0;
00152     ((char*) ADS129X_data)[5*4+2] = spi.write(0x00);
00153     ((char*) ADS129X_data)[5*4+1] = spi.write(0x00);
00154     ((char*) ADS129X_data)[5*4+0] = spi.write(0x00);
00155     // channel 6
00156     ((char*) ADS129X_data)[6*4+3] = 0;
00157     ((char*) ADS129X_data)[6*4+2] = spi.write(0x00);
00158     ((char*) ADS129X_data)[6*4+1] = spi.write(0x00);
00159     ((char*) ADS129X_data)[6*4+0] = spi.write(0x00);
00160     // channel 7
00161     ((char*) ADS129X_data)[7*4+3] = 0;
00162     ((char*) ADS129X_data)[7*4+2] = spi.write(0x00);
00163     ((char*) ADS129X_data)[7*4+1] = spi.write(0x00);
00164     ((char*) ADS129X_data)[7*4+0] = spi.write(0x00);
00165     // channel 8
00166     ((char*) ADS129X_data)[8*4+3] = 0;
00167     ((char*) ADS129X_data)[8*4+2] = spi.write(0x00);
00168     ((char*) ADS129X_data)[8*4+1] = spi.write(0x00);
00169     ((char*) ADS129X_data)[8*4+0] = spi.write(0x00);
00170     CS = 1;
00171     ADS129X_newData = true;
00172 }
00173  
00174 bool getData(long *buffer) {
00175     if(ADS129X_newData) {
00176        ADS129X_newData = false;
00177        for (int i = 0; i < 9; i++) {
00178             buffer[i] = ADS129X_data[i];
00179         }
00180         return true;
00181     }
00182     return false;
00183 }
00184 
00185 
00186 
00187 void configChannel(char _channel, bool _powerDown, char _gain, char _mux) {
00188     char value = ((_powerDown & 1)<<7) | ((_gain & 7)<<4) | (_mux & 7);
00189     WREG(ADS129X_REG_CH1SET + (_channel-1), value);
00190 }
00191  
00192 
00193 
00194 
00195 
00196 
00197 
00198 
00199 
00200 
00201 
00202 
00203 
00204 
00205 
00206 
00207 
00208 
00209 
00210 
00211 
00212 
00213 
00214 
00215 
00216 
00217 
00218 
00219 
00220 
00221 
00222