Dan Allen / Mbed 2 deprecated MAX11410-test

Dependencies:   mbed MAX11410

Fork of MAX11410-test by Dan Allen

Committer:
shawjo
Date:
Tue Feb 06 02:51:26 2018 +0000
Revision:
8:882a6cdb1bf3
Parent:
7:5295cbdb123c
Child:
9:5d9509c15e8a
Changed checksum to include all of the bytes of data instead of just the LSB of each channel.  Checksum also includes the start bits of 0x66 and 0x01.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simon 0:4f78cdfc99de 1 // I2CU - Search for devices on an I2C bus
simon 0:4f78cdfc99de 2 // Copyright (c) 2009, sford
simon 0:4f78cdfc99de 3 // Released under the MIT License: http://mbed.org/license/mit
simon 0:4f78cdfc99de 4 //
simon 0:4f78cdfc99de 5 // Goes through each device address, seeing if it gets a response
simon 0:4f78cdfc99de 6 // - for every device if finds, it prints the 8-bit address
simon 0:4f78cdfc99de 7 // - if the program hangs, the bus isn't working (check pull-ups etc)
simon 0:4f78cdfc99de 8 // - if it doesn't find your device, check power/bus wiring etc
smartsystemdesign 3:42120705a9bd 9 //
smartsystemdesign 3:42120705a9bd 10 // - Note: if you plug / unplug devices try cycling power
smartsystemdesign 2:39ba9beabf3c 11
simon 0:4f78cdfc99de 12 #include "mbed.h"
laserdad 5:d7b803aa9079 13 #include "MAX11410.h"
simon 0:4f78cdfc99de 14
laserdad 5:d7b803aa9079 15 #define CS1 D9
laserdad 5:d7b803aa9079 16 #define CS2 D10
laserdad 5:d7b803aa9079 17 #define MOSI_1 D11
laserdad 5:d7b803aa9079 18 #define MISO_1 D12
laserdad 5:d7b803aa9079 19 #define SCLK_1 D13
laserdad 5:d7b803aa9079 20 #define VDD 3.3
laserdad 6:c3db4eff9170 21
laserdad 6:c3db4eff9170 22
laserdad 5:d7b803aa9079 23 AnalogOut vOut1(A3);
laserdad 5:d7b803aa9079 24 AnalogOut vOut2(A4);
laserdad 5:d7b803aa9079 25 DigitalOut cs_pin1(CS1);
laserdad 5:d7b803aa9079 26 DigitalOut cs_pin2(CS2);
laserdad 5:d7b803aa9079 27 SPI spi(MOSI_1, MISO_1, SCLK_1);
laserdad 5:d7b803aa9079 28 MAX11410 adc1(&spi,&cs_pin1);
laserdad 5:d7b803aa9079 29 MAX11410 adc2(&spi,&cs_pin2);
laserdad 7:5295cbdb123c 30 Serial pc(USBTX, USBRX,115200);
laserdad 7:5295cbdb123c 31 //Serial pc(USBTX, USBRX, 9600);
laserdad 6:c3db4eff9170 32 Serial rpi(PA_9,PA_10,115200);
laserdad 5:d7b803aa9079 33
laserdad 5:d7b803aa9079 34 void starting()
smartsystemdesign 2:39ba9beabf3c 35 {
laserdad 5:d7b803aa9079 36 pc.printf("this program has started\r\n");
laserdad 5:d7b803aa9079 37 }
laserdad 5:d7b803aa9079 38
simon 0:4f78cdfc99de 39
laserdad 6:c3db4eff9170 40 char getNthByte(int32_t data, int ind)
laserdad 6:c3db4eff9170 41 {
laserdad 6:c3db4eff9170 42 return (data>>(8*ind)) & 0x000000FF ;
laserdad 6:c3db4eff9170 43 }
laserdad 5:d7b803aa9079 44
laserdad 5:d7b803aa9079 45
laserdad 5:d7b803aa9079 46 void print8bitRegsAdc1(char start_reg,char end_reg)
laserdad 5:d7b803aa9079 47 {
laserdad 5:d7b803aa9079 48 bool int_status;
laserdad 5:d7b803aa9079 49 char val;
laserdad 5:d7b803aa9079 50 for(int n=start_reg;n<=end_reg;n++)
laserdad 5:d7b803aa9079 51 {
laserdad 5:d7b803aa9079 52 val = adc1.read8bits(n,&int_status);
laserdad 5:d7b803aa9079 53 pc.printf("reg %02x, val =%02x\r\n",n,val);
simon 0:4f78cdfc99de 54 }
laserdad 5:d7b803aa9079 55
laserdad 5:d7b803aa9079 56 }
laserdad 5:d7b803aa9079 57
laserdad 5:d7b803aa9079 58 void print8bitRegsAdc2(char start_reg,char end_reg)
laserdad 5:d7b803aa9079 59 {
laserdad 5:d7b803aa9079 60 bool int_status;
laserdad 5:d7b803aa9079 61 char val;
laserdad 5:d7b803aa9079 62 for(int n=start_reg;n<=end_reg;n++)
laserdad 5:d7b803aa9079 63 {
laserdad 5:d7b803aa9079 64 val = adc2.read8bits(n,&int_status);
laserdad 5:d7b803aa9079 65 pc.printf("reg %02x, val =%02x\r\n",n,val);
laserdad 5:d7b803aa9079 66 }
simon 0:4f78cdfc99de 67 }
smartsystemdesign 2:39ba9beabf3c 68
laserdad 7:5295cbdb123c 69
laserdad 5:d7b803aa9079 70 int main()
smartsystemdesign 2:39ba9beabf3c 71 {
laserdad 5:d7b803aa9079 72 int32_t channel_data[10];
laserdad 7:5295cbdb123c 73 int32_t channel_data2[10];
laserdad 7:5295cbdb123c 74 int32_t checksum2 =0;
laserdad 7:5295cbdb123c 75 int32_t checksum = 0;
laserdad 7:5295cbdb123c 76 char checksum_byte = 0;
laserdad 7:5295cbdb123c 77 char byte2print[40];
laserdad 6:c3db4eff9170 78 double vdiff=0.01;
laserdad 5:d7b803aa9079 79 vOut1 = 0.5-vdiff/2;
laserdad 5:d7b803aa9079 80 vOut2 = 0.5+vdiff/2;
laserdad 5:d7b803aa9079 81 starting();
laserdad 7:5295cbdb123c 82
laserdad 5:d7b803aa9079 83 bool int_state;
laserdad 5:d7b803aa9079 84 spi.format(8,MAX11410_SPI_MODE); //configure number of spi bits 8, 16
laserdad 5:d7b803aa9079 85 spi.frequency(8000000); // Max 8MHz
laserdad 5:d7b803aa9079 86 //read chip ID
laserdad 5:d7b803aa9079 87
laserdad 5:d7b803aa9079 88 pc.printf("chip ID %d\r\n",adc1.read8bits(REG_PART_ID,&int_state) );
laserdad 5:d7b803aa9079 89
laserdad 5:d7b803aa9079 90 //config ADC 1
laserdad 5:d7b803aa9079 91 adc1.reset(); //POR
laserdad 5:d7b803aa9079 92 // adc2.reset();
laserdad 5:d7b803aa9079 93
laserdad 5:d7b803aa9079 94 //check default register configs
laserdad 5:d7b803aa9079 95 pc.printf("default regs for ADC1\r\n");
laserdad 5:d7b803aa9079 96 print8bitRegsAdc1(REG_PD,REG_WAIT_START);
laserdad 5:d7b803aa9079 97
laserdad 5:d7b803aa9079 98 pc.printf("default regs for ADC2\r\n");
laserdad 5:d7b803aa9079 99 print8bitRegsAdc2(REG_PD,REG_WAIT_START);
laserdad 5:d7b803aa9079 100
laserdad 5:d7b803aa9079 101
laserdad 5:d7b803aa9079 102 //config interrupts, PGA, Buffer, polarity, reference
laserdad 5:d7b803aa9079 103 char mode_config = MODE_NORMAL;
laserdad 5:d7b803aa9079 104 adc1.write8bitReg(REG_PD,mode_config); //got to normal mode
laserdad 5:d7b803aa9079 105 adc2.write8bitReg(REG_PD,mode_config); //got to normal mode
laserdad 5:d7b803aa9079 106
laserdad 5:d7b803aa9079 107 char filter_config = FIR_SIXTY | _RATE(4) ; //
laserdad 5:d7b803aa9079 108 adc1.write8bitReg( REG_FILTER,filter_config );
laserdad 5:d7b803aa9079 109 adc2.write8bitReg( REG_FILTER,filter_config );
laserdad 5:d7b803aa9079 110
laserdad 5:d7b803aa9079 111 char ctrl_config = INT_CLOCK | BIPOLAR | TWOS_COMP | _PBUF_EN(0) | _NBUF_EN(0) | REF_AVDD ; //ADC configuration
laserdad 5:d7b803aa9079 112 adc1.write8bitReg( REG_CTRL, ctrl_config );
laserdad 5:d7b803aa9079 113 adc2.write8bitReg( REG_CTRL, ctrl_config );
laserdad 5:d7b803aa9079 114
laserdad 5:d7b803aa9079 115 char source_config = VBIAS_ACTIVE | BRN_OFF | _IDAC(0); //not sourcing current
laserdad 5:d7b803aa9079 116 adc1.write8bitReg( REG_SOURCE,source_config );
laserdad 5:d7b803aa9079 117 adc2.write8bitReg( REG_SOURCE,source_config );
laserdad 5:d7b803aa9079 118
laserdad 5:d7b803aa9079 119 uint32_t status_ie_config = DATA_RDY_INT | CAL_RDY_INT | CONV_RDY_INT;
laserdad 5:d7b803aa9079 120 adc1.write24bitReg(REG_STATUS_IE,status_ie_config);
laserdad 5:d7b803aa9079 121 adc2.write8bitReg( REG_SOURCE,source_config );
laserdad 5:d7b803aa9079 122
laserdad 5:d7b803aa9079 123 char gain_setting = 0;
laserdad 5:d7b803aa9079 124 char pga_config = PGA | _GAIN_EXP(gain_setting) ; //no gain
laserdad 5:d7b803aa9079 125 adc1.write8bitReg(REG_PGA,pga_config);
laserdad 5:d7b803aa9079 126 adc2.write8bitReg(REG_PGA,pga_config);
laserdad 5:d7b803aa9079 127
laserdad 5:d7b803aa9079 128 pc.printf("PGA gain = %d\r\n",1<<gain_setting);
laserdad 5:d7b803aa9079 129
laserdad 5:d7b803aa9079 130 //check register writes
laserdad 5:d7b803aa9079 131 pc.printf("checking register writes\r\n");
laserdad 5:d7b803aa9079 132 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_PD,adc1.read8bits(REG_PD,&int_state),mode_config);
laserdad 5:d7b803aa9079 133 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_FILTER,adc1.read8bits(REG_FILTER,&int_state),filter_config);
laserdad 5:d7b803aa9079 134 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_CTRL,adc1.read8bits(REG_CTRL,&int_state),ctrl_config);
laserdad 5:d7b803aa9079 135 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_SOURCE,adc1.read8bits(REG_SOURCE,&int_state),source_config);
laserdad 5:d7b803aa9079 136 pc.printf("reg %02x, val %06x, set to %06x\r\n",REG_STATUS_IE,adc1.read24bits(REG_STATUS_IE,&int_state),status_ie_config);
laserdad 5:d7b803aa9079 137 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_PGA,adc1.read8bits(REG_PGA,&int_state),pga_config);
laserdad 5:d7b803aa9079 138
laserdad 5:d7b803aa9079 139 // for each channel 1-5
laserdad 5:d7b803aa9079 140 for(int n=0;n<5;n++)
laserdad 5:d7b803aa9079 141 {
laserdad 5:d7b803aa9079 142 //select channel
laserdad 5:d7b803aa9079 143 char p_ch = 2*n<<4;
laserdad 5:d7b803aa9079 144 char n_ch = 2*n+1;
laserdad 5:d7b803aa9079 145 adc1.write8bitReg(REG_MUX_CTRL0, p_ch | n_ch );
laserdad 5:d7b803aa9079 146
laserdad 5:d7b803aa9079 147 //select data output register and begin conversion
laserdad 5:d7b803aa9079 148 adc1.write8bitReg(REG_CONV_START, (_DEST(n) | SINGLE_CONV) );
laserdad 5:d7b803aa9079 149
laserdad 5:d7b803aa9079 150 //optional: cal Gain
laserdad 5:d7b803aa9079 151
laserdad 5:d7b803aa9079 152 //optional: cal Offset
laserdad 5:d7b803aa9079 153
laserdad 5:d7b803aa9079 154 //optional: store cal parameters
laserdad 5:d7b803aa9079 155
laserdad 5:d7b803aa9079 156 //begin conversion
laserdad 5:d7b803aa9079 157
laserdad 5:d7b803aa9079 158 //wait for interrupt
laserdad 5:d7b803aa9079 159 while(!adc1.interrupt() )
laserdad 5:d7b803aa9079 160 {
laserdad 5:d7b803aa9079 161 wait_ms(CONV_DELAY_MS);//do nothing
laserdad 7:5295cbdb123c 162 // pc.printf("waiting for int");
laserdad 5:d7b803aa9079 163 }
laserdad 5:d7b803aa9079 164
laserdad 5:d7b803aa9079 165 //read conversion
laserdad 5:d7b803aa9079 166 channel_data[n] = adc1.read24bitsSigned(REG_DATA0+n,&int_state);
laserdad 5:d7b803aa9079 167 pc.printf("%d, ",channel_data[n]);
laserdad 5:d7b803aa9079 168 } //channel sweep
laserdad 5:d7b803aa9079 169 pc.printf("\r\n");
laserdad 5:d7b803aa9079 170
laserdad 5:d7b803aa9079 171
laserdad 5:d7b803aa9079 172 //config ADC 2: repeat above
laserdad 5:d7b803aa9079 173
laserdad 5:d7b803aa9079 174
laserdad 7:5295cbdb123c 175
laserdad 7:5295cbdb123c 176 pc.printf("beginning while loop");
laserdad 7:5295cbdb123c 177 wait_ms(1000);
laserdad 6:c3db4eff9170 178 while(1)
laserdad 6:c3db4eff9170 179 {
laserdad 6:c3db4eff9170 180 for(int n=0; n<5; n++)
laserdad 6:c3db4eff9170 181 {
laserdad 6:c3db4eff9170 182 //read each channel
laserdad 6:c3db4eff9170 183 //select channel
laserdad 6:c3db4eff9170 184 char p_ch = 2*n<<4;
laserdad 6:c3db4eff9170 185 char n_ch = 2*n+1;
laserdad 6:c3db4eff9170 186 adc1.write8bitReg(REG_MUX_CTRL0, p_ch | n_ch );
laserdad 6:c3db4eff9170 187
laserdad 6:c3db4eff9170 188 //select data output register and begin conversion
laserdad 6:c3db4eff9170 189 adc1.write8bitReg(REG_CONV_START, (_DEST(n) | SINGLE_CONV) );
laserdad 6:c3db4eff9170 190
laserdad 6:c3db4eff9170 191 //optional: cal Gain
laserdad 6:c3db4eff9170 192
laserdad 6:c3db4eff9170 193 //optional: cal Offset
laserdad 6:c3db4eff9170 194
laserdad 6:c3db4eff9170 195 //optional: store cal parameters
laserdad 6:c3db4eff9170 196
laserdad 6:c3db4eff9170 197 //begin conversion
laserdad 6:c3db4eff9170 198
laserdad 6:c3db4eff9170 199 //wait for interrupt
laserdad 6:c3db4eff9170 200 while(!adc1.interrupt() )
laserdad 6:c3db4eff9170 201 {
laserdad 6:c3db4eff9170 202 wait_ms(CONV_DELAY_MS);//do nothing
laserdad 7:5295cbdb123c 203 // pc.printf("waiting for int");
laserdad 6:c3db4eff9170 204 }
laserdad 6:c3db4eff9170 205
laserdad 6:c3db4eff9170 206 //read conversion
laserdad 6:c3db4eff9170 207 channel_data[n] = adc1.read24bitsSigned(REG_DATA0+n,&int_state);
laserdad 6:c3db4eff9170 208
laserdad 6:c3db4eff9170 209 }
laserdad 6:c3db4eff9170 210 for(int n=0; n<5; n++)
laserdad 6:c3db4eff9170 211 {
laserdad 6:c3db4eff9170 212 //read each channel
laserdad 6:c3db4eff9170 213 //select channel
laserdad 6:c3db4eff9170 214 char p_ch = 2*n<<4;
laserdad 6:c3db4eff9170 215 char n_ch = 2*n+1;
laserdad 6:c3db4eff9170 216 adc2.write8bitReg(REG_MUX_CTRL0, p_ch | n_ch );
laserdad 6:c3db4eff9170 217
laserdad 6:c3db4eff9170 218 //select data output register and begin conversion
laserdad 6:c3db4eff9170 219 adc2.write8bitReg(REG_CONV_START, (_DEST(n) | SINGLE_CONV) );
laserdad 6:c3db4eff9170 220
laserdad 6:c3db4eff9170 221 //optional: cal Gain
laserdad 6:c3db4eff9170 222
laserdad 6:c3db4eff9170 223 //optional: cal Offset
laserdad 6:c3db4eff9170 224
laserdad 6:c3db4eff9170 225 //optional: store cal parameters
laserdad 6:c3db4eff9170 226
laserdad 6:c3db4eff9170 227 //begin conversion
laserdad 6:c3db4eff9170 228
laserdad 6:c3db4eff9170 229 //wait for interrupt
laserdad 6:c3db4eff9170 230 while(!adc2.interrupt() )
laserdad 6:c3db4eff9170 231 {
laserdad 6:c3db4eff9170 232 wait_ms(CONV_DELAY_MS);//do nothing
laserdad 6:c3db4eff9170 233 }
laserdad 6:c3db4eff9170 234
laserdad 6:c3db4eff9170 235 //read conversion
laserdad 6:c3db4eff9170 236 channel_data[n+5] = adc2.read24bitsSigned(REG_DATA0+n,&int_state);
laserdad 6:c3db4eff9170 237 }
laserdad 6:c3db4eff9170 238
laserdad 6:c3db4eff9170 239 // calc checksum
shawjo 8:882a6cdb1bf3 240 checksum= 0x66 + 0x01;
shawjo 8:882a6cdb1bf3 241 // for (int n=0; n<10; n++)
shawjo 8:882a6cdb1bf3 242 // {
shawjo 8:882a6cdb1bf3 243 // checksum += channel_data[n];
shawjo 8:882a6cdb1bf3 244 // }
shawjo 8:882a6cdb1bf3 245 // checksum_byte = (char) checksum;
laserdad 6:c3db4eff9170 246
laserdad 6:c3db4eff9170 247 for (int n=0; n<10; n++)
laserdad 6:c3db4eff9170 248 {
laserdad 6:c3db4eff9170 249 for(int m=0;m<4;m++)
laserdad 6:c3db4eff9170 250 {
laserdad 6:c3db4eff9170 251 byte2print[n*4+m] = getNthByte(channel_data[n],3-m);
shawjo 8:882a6cdb1bf3 252 checksum += getNthByte(channel_data[n],3-m);
shawjo 8:882a6cdb1bf3 253 }
laserdad 6:c3db4eff9170 254 }
shawjo 8:882a6cdb1bf3 255 checksum_byte = (char) checksum;
shawjo 8:882a6cdb1bf3 256
laserdad 6:c3db4eff9170 257 //print data and checksum
laserdad 6:c3db4eff9170 258
laserdad 6:c3db4eff9170 259 // print header 0x6601
laserdad 6:c3db4eff9170 260 rpi.putc(0x66);
laserdad 6:c3db4eff9170 261 rpi.putc(0x01);
laserdad 6:c3db4eff9170 262 for (int n =0; n<40;n++)
laserdad 6:c3db4eff9170 263 {
laserdad 6:c3db4eff9170 264 rpi.putc(byte2print[n]);
laserdad 6:c3db4eff9170 265 }
laserdad 7:5295cbdb123c 266 rpi.putc( checksum_byte );
laserdad 7:5295cbdb123c 267 // now reassemble the bits and print them
laserdad 7:5295cbdb123c 268
laserdad 7:5295cbdb123c 269 for (int n=0;n<10;n++)
laserdad 7:5295cbdb123c 270 {
laserdad 7:5295cbdb123c 271 channel_data2[n] = (byte2print[4*n]<<24 ) | ( byte2print[4*n+1]<<16 ) | ( byte2print[4*n+2] << 8 ) | byte2print[4*n+3];
laserdad 7:5295cbdb123c 272 }
laserdad 7:5295cbdb123c 273 pc.printf("orig reconstructed\r\n");
laserdad 7:5295cbdb123c 274 for (int n=0;n<10;n++)
laserdad 7:5295cbdb123c 275 {
laserdad 7:5295cbdb123c 276 pc.printf("%d, %d, %d\r\n",n,channel_data[n],channel_data2[n]);
laserdad 7:5295cbdb123c 277 }
laserdad 7:5295cbdb123c 278 checksum2 = 0;
laserdad 7:5295cbdb123c 279 for(int n=0;n<10;n++)
laserdad 7:5295cbdb123c 280 {
laserdad 7:5295cbdb123c 281 checksum2 += channel_data2[n];
laserdad 7:5295cbdb123c 282 }
laserdad 7:5295cbdb123c 283 pc.printf("checksum %02X, %08X, %08X\r\n",checksum_byte,checksum,checksum2);
laserdad 6:c3db4eff9170 284 } //end while
laserdad 5:d7b803aa9079 285
laserdad 5:d7b803aa9079 286 } //END MAIN