Dan Allen
/
MAX11410_test
test program to power up two MAX11410 ADCs and check the inputs of ADC1. Uses MAX11410 library.
main.cpp@6:c3db4eff9170, 2018-01-10 (annotated)
- Committer:
- laserdad
- Date:
- Wed Jan 10 02:17:31 2018 +0000
- Revision:
- 6:c3db4eff9170
- Parent:
- 5:d7b803aa9079
added serial prints
Who changed what in which revision?
User | Revision | Line number | New 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 | 5:d7b803aa9079 | 30 | //Serial pc(USBTX, USBRX,115200); |
laserdad | 5:d7b803aa9079 | 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 | 5:d7b803aa9079 | 69 | int main() |
smartsystemdesign | 2:39ba9beabf3c | 70 | { |
laserdad | 5:d7b803aa9079 | 71 | int32_t channel_data[10]; |
laserdad | 6:c3db4eff9170 | 72 | double vdiff=0.01; |
laserdad | 5:d7b803aa9079 | 73 | vOut1 = 0.5-vdiff/2; |
laserdad | 5:d7b803aa9079 | 74 | vOut2 = 0.5+vdiff/2; |
laserdad | 5:d7b803aa9079 | 75 | starting(); |
laserdad | 5:d7b803aa9079 | 76 | bool int_state; |
laserdad | 5:d7b803aa9079 | 77 | spi.format(8,MAX11410_SPI_MODE); //configure number of spi bits 8, 16 |
laserdad | 5:d7b803aa9079 | 78 | spi.frequency(8000000); // Max 8MHz |
laserdad | 5:d7b803aa9079 | 79 | //read chip ID |
laserdad | 5:d7b803aa9079 | 80 | |
laserdad | 5:d7b803aa9079 | 81 | pc.printf("chip ID %d\r\n",adc1.read8bits(REG_PART_ID,&int_state) ); |
laserdad | 5:d7b803aa9079 | 82 | |
laserdad | 5:d7b803aa9079 | 83 | //config ADC 1 |
laserdad | 5:d7b803aa9079 | 84 | adc1.reset(); //POR |
laserdad | 5:d7b803aa9079 | 85 | // adc2.reset(); |
laserdad | 5:d7b803aa9079 | 86 | |
laserdad | 5:d7b803aa9079 | 87 | //check default register configs |
laserdad | 5:d7b803aa9079 | 88 | pc.printf("default regs for ADC1\r\n"); |
laserdad | 5:d7b803aa9079 | 89 | print8bitRegsAdc1(REG_PD,REG_WAIT_START); |
laserdad | 5:d7b803aa9079 | 90 | |
laserdad | 5:d7b803aa9079 | 91 | pc.printf("default regs for ADC2\r\n"); |
laserdad | 5:d7b803aa9079 | 92 | print8bitRegsAdc2(REG_PD,REG_WAIT_START); |
laserdad | 5:d7b803aa9079 | 93 | |
laserdad | 5:d7b803aa9079 | 94 | |
laserdad | 5:d7b803aa9079 | 95 | //config interrupts, PGA, Buffer, polarity, reference |
laserdad | 5:d7b803aa9079 | 96 | char mode_config = MODE_NORMAL; |
laserdad | 5:d7b803aa9079 | 97 | adc1.write8bitReg(REG_PD,mode_config); //got to normal mode |
laserdad | 5:d7b803aa9079 | 98 | adc2.write8bitReg(REG_PD,mode_config); //got to normal mode |
laserdad | 5:d7b803aa9079 | 99 | |
laserdad | 5:d7b803aa9079 | 100 | char filter_config = FIR_SIXTY | _RATE(4) ; // |
laserdad | 5:d7b803aa9079 | 101 | adc1.write8bitReg( REG_FILTER,filter_config ); |
laserdad | 5:d7b803aa9079 | 102 | adc2.write8bitReg( REG_FILTER,filter_config ); |
laserdad | 5:d7b803aa9079 | 103 | |
laserdad | 5:d7b803aa9079 | 104 | char ctrl_config = INT_CLOCK | BIPOLAR | TWOS_COMP | _PBUF_EN(0) | _NBUF_EN(0) | REF_AVDD ; //ADC configuration |
laserdad | 5:d7b803aa9079 | 105 | adc1.write8bitReg( REG_CTRL, ctrl_config ); |
laserdad | 5:d7b803aa9079 | 106 | adc2.write8bitReg( REG_CTRL, ctrl_config ); |
laserdad | 5:d7b803aa9079 | 107 | |
laserdad | 5:d7b803aa9079 | 108 | char source_config = VBIAS_ACTIVE | BRN_OFF | _IDAC(0); //not sourcing current |
laserdad | 5:d7b803aa9079 | 109 | adc1.write8bitReg( REG_SOURCE,source_config ); |
laserdad | 5:d7b803aa9079 | 110 | adc2.write8bitReg( REG_SOURCE,source_config ); |
laserdad | 5:d7b803aa9079 | 111 | |
laserdad | 5:d7b803aa9079 | 112 | uint32_t status_ie_config = DATA_RDY_INT | CAL_RDY_INT | CONV_RDY_INT; |
laserdad | 5:d7b803aa9079 | 113 | adc1.write24bitReg(REG_STATUS_IE,status_ie_config); |
laserdad | 5:d7b803aa9079 | 114 | adc2.write8bitReg( REG_SOURCE,source_config ); |
laserdad | 5:d7b803aa9079 | 115 | |
laserdad | 5:d7b803aa9079 | 116 | char gain_setting = 0; |
laserdad | 5:d7b803aa9079 | 117 | char pga_config = PGA | _GAIN_EXP(gain_setting) ; //no gain |
laserdad | 5:d7b803aa9079 | 118 | adc1.write8bitReg(REG_PGA,pga_config); |
laserdad | 5:d7b803aa9079 | 119 | adc2.write8bitReg(REG_PGA,pga_config); |
laserdad | 5:d7b803aa9079 | 120 | |
laserdad | 5:d7b803aa9079 | 121 | pc.printf("PGA gain = %d\r\n",1<<gain_setting); |
laserdad | 5:d7b803aa9079 | 122 | |
laserdad | 5:d7b803aa9079 | 123 | //check register writes |
laserdad | 5:d7b803aa9079 | 124 | pc.printf("checking register writes\r\n"); |
laserdad | 5:d7b803aa9079 | 125 | pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_PD,adc1.read8bits(REG_PD,&int_state),mode_config); |
laserdad | 5:d7b803aa9079 | 126 | pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_FILTER,adc1.read8bits(REG_FILTER,&int_state),filter_config); |
laserdad | 5:d7b803aa9079 | 127 | pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_CTRL,adc1.read8bits(REG_CTRL,&int_state),ctrl_config); |
laserdad | 5:d7b803aa9079 | 128 | pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_SOURCE,adc1.read8bits(REG_SOURCE,&int_state),source_config); |
laserdad | 5:d7b803aa9079 | 129 | 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 | 130 | pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_PGA,adc1.read8bits(REG_PGA,&int_state),pga_config); |
laserdad | 5:d7b803aa9079 | 131 | |
laserdad | 5:d7b803aa9079 | 132 | // for each channel 1-5 |
laserdad | 5:d7b803aa9079 | 133 | for(int n=0;n<5;n++) |
laserdad | 5:d7b803aa9079 | 134 | { |
laserdad | 5:d7b803aa9079 | 135 | //select channel |
laserdad | 5:d7b803aa9079 | 136 | char p_ch = 2*n<<4; |
laserdad | 5:d7b803aa9079 | 137 | char n_ch = 2*n+1; |
laserdad | 5:d7b803aa9079 | 138 | adc1.write8bitReg(REG_MUX_CTRL0, p_ch | n_ch ); |
laserdad | 5:d7b803aa9079 | 139 | |
laserdad | 5:d7b803aa9079 | 140 | //select data output register and begin conversion |
laserdad | 5:d7b803aa9079 | 141 | adc1.write8bitReg(REG_CONV_START, (_DEST(n) | SINGLE_CONV) ); |
laserdad | 5:d7b803aa9079 | 142 | |
laserdad | 5:d7b803aa9079 | 143 | //optional: cal Gain |
laserdad | 5:d7b803aa9079 | 144 | |
laserdad | 5:d7b803aa9079 | 145 | //optional: cal Offset |
laserdad | 5:d7b803aa9079 | 146 | |
laserdad | 5:d7b803aa9079 | 147 | //optional: store cal parameters |
laserdad | 5:d7b803aa9079 | 148 | |
laserdad | 5:d7b803aa9079 | 149 | //begin conversion |
laserdad | 5:d7b803aa9079 | 150 | |
laserdad | 5:d7b803aa9079 | 151 | //wait for interrupt |
laserdad | 5:d7b803aa9079 | 152 | while(!adc1.interrupt() ) |
laserdad | 5:d7b803aa9079 | 153 | { |
laserdad | 5:d7b803aa9079 | 154 | wait_ms(CONV_DELAY_MS);//do nothing |
laserdad | 5:d7b803aa9079 | 155 | } |
laserdad | 5:d7b803aa9079 | 156 | |
laserdad | 5:d7b803aa9079 | 157 | //read conversion |
laserdad | 5:d7b803aa9079 | 158 | channel_data[n] = adc1.read24bitsSigned(REG_DATA0+n,&int_state); |
laserdad | 5:d7b803aa9079 | 159 | pc.printf("%d, ",channel_data[n]); |
laserdad | 5:d7b803aa9079 | 160 | } //channel sweep |
laserdad | 5:d7b803aa9079 | 161 | pc.printf("\r\n"); |
laserdad | 5:d7b803aa9079 | 162 | |
laserdad | 5:d7b803aa9079 | 163 | |
laserdad | 5:d7b803aa9079 | 164 | //config ADC 2: repeat above |
laserdad | 5:d7b803aa9079 | 165 | |
laserdad | 5:d7b803aa9079 | 166 | |
laserdad | 6:c3db4eff9170 | 167 | uint32_t checksum; |
laserdad | 6:c3db4eff9170 | 168 | char byte2print[40]; |
laserdad | 5:d7b803aa9079 | 169 | |
laserdad | 6:c3db4eff9170 | 170 | while(1) |
laserdad | 6:c3db4eff9170 | 171 | { |
laserdad | 6:c3db4eff9170 | 172 | for(int n=0; n<5; n++) |
laserdad | 6:c3db4eff9170 | 173 | { |
laserdad | 6:c3db4eff9170 | 174 | //read each channel |
laserdad | 6:c3db4eff9170 | 175 | //select channel |
laserdad | 6:c3db4eff9170 | 176 | char p_ch = 2*n<<4; |
laserdad | 6:c3db4eff9170 | 177 | char n_ch = 2*n+1; |
laserdad | 6:c3db4eff9170 | 178 | adc1.write8bitReg(REG_MUX_CTRL0, p_ch | n_ch ); |
laserdad | 6:c3db4eff9170 | 179 | |
laserdad | 6:c3db4eff9170 | 180 | //select data output register and begin conversion |
laserdad | 6:c3db4eff9170 | 181 | adc1.write8bitReg(REG_CONV_START, (_DEST(n) | SINGLE_CONV) ); |
laserdad | 6:c3db4eff9170 | 182 | |
laserdad | 6:c3db4eff9170 | 183 | //optional: cal Gain |
laserdad | 6:c3db4eff9170 | 184 | |
laserdad | 6:c3db4eff9170 | 185 | //optional: cal Offset |
laserdad | 6:c3db4eff9170 | 186 | |
laserdad | 6:c3db4eff9170 | 187 | //optional: store cal parameters |
laserdad | 6:c3db4eff9170 | 188 | |
laserdad | 6:c3db4eff9170 | 189 | //begin conversion |
laserdad | 6:c3db4eff9170 | 190 | |
laserdad | 6:c3db4eff9170 | 191 | //wait for interrupt |
laserdad | 6:c3db4eff9170 | 192 | while(!adc1.interrupt() ) |
laserdad | 6:c3db4eff9170 | 193 | { |
laserdad | 6:c3db4eff9170 | 194 | wait_ms(CONV_DELAY_MS);//do nothing |
laserdad | 6:c3db4eff9170 | 195 | } |
laserdad | 6:c3db4eff9170 | 196 | |
laserdad | 6:c3db4eff9170 | 197 | //read conversion |
laserdad | 6:c3db4eff9170 | 198 | channel_data[n] = adc1.read24bitsSigned(REG_DATA0+n,&int_state); |
laserdad | 6:c3db4eff9170 | 199 | |
laserdad | 6:c3db4eff9170 | 200 | } |
laserdad | 6:c3db4eff9170 | 201 | for(int n=0; n<5; n++) |
laserdad | 6:c3db4eff9170 | 202 | { |
laserdad | 6:c3db4eff9170 | 203 | //read each channel |
laserdad | 6:c3db4eff9170 | 204 | //select channel |
laserdad | 6:c3db4eff9170 | 205 | char p_ch = 2*n<<4; |
laserdad | 6:c3db4eff9170 | 206 | char n_ch = 2*n+1; |
laserdad | 6:c3db4eff9170 | 207 | adc2.write8bitReg(REG_MUX_CTRL0, p_ch | n_ch ); |
laserdad | 6:c3db4eff9170 | 208 | |
laserdad | 6:c3db4eff9170 | 209 | //select data output register and begin conversion |
laserdad | 6:c3db4eff9170 | 210 | adc2.write8bitReg(REG_CONV_START, (_DEST(n) | SINGLE_CONV) ); |
laserdad | 6:c3db4eff9170 | 211 | |
laserdad | 6:c3db4eff9170 | 212 | //optional: cal Gain |
laserdad | 6:c3db4eff9170 | 213 | |
laserdad | 6:c3db4eff9170 | 214 | //optional: cal Offset |
laserdad | 6:c3db4eff9170 | 215 | |
laserdad | 6:c3db4eff9170 | 216 | //optional: store cal parameters |
laserdad | 6:c3db4eff9170 | 217 | |
laserdad | 6:c3db4eff9170 | 218 | //begin conversion |
laserdad | 6:c3db4eff9170 | 219 | |
laserdad | 6:c3db4eff9170 | 220 | //wait for interrupt |
laserdad | 6:c3db4eff9170 | 221 | while(!adc2.interrupt() ) |
laserdad | 6:c3db4eff9170 | 222 | { |
laserdad | 6:c3db4eff9170 | 223 | wait_ms(CONV_DELAY_MS);//do nothing |
laserdad | 6:c3db4eff9170 | 224 | } |
laserdad | 6:c3db4eff9170 | 225 | |
laserdad | 6:c3db4eff9170 | 226 | //read conversion |
laserdad | 6:c3db4eff9170 | 227 | channel_data[n+5] = adc2.read24bitsSigned(REG_DATA0+n,&int_state); |
laserdad | 6:c3db4eff9170 | 228 | } |
laserdad | 6:c3db4eff9170 | 229 | |
laserdad | 6:c3db4eff9170 | 230 | // calc checksum |
laserdad | 6:c3db4eff9170 | 231 | checksum=0; |
laserdad | 6:c3db4eff9170 | 232 | for (int n=0; n<10; n++) |
laserdad | 6:c3db4eff9170 | 233 | { |
laserdad | 6:c3db4eff9170 | 234 | checksum += channel_data[n]; |
laserdad | 6:c3db4eff9170 | 235 | } |
laserdad | 6:c3db4eff9170 | 236 | |
laserdad | 6:c3db4eff9170 | 237 | for (int n=0; n<10; n++) |
laserdad | 6:c3db4eff9170 | 238 | { |
laserdad | 6:c3db4eff9170 | 239 | for(int m=0;m<4;m++) |
laserdad | 6:c3db4eff9170 | 240 | { |
laserdad | 6:c3db4eff9170 | 241 | byte2print[n*4+m] = getNthByte(channel_data[n],3-m); |
laserdad | 6:c3db4eff9170 | 242 | } |
laserdad | 6:c3db4eff9170 | 243 | } |
laserdad | 6:c3db4eff9170 | 244 | //print data and checksum |
laserdad | 6:c3db4eff9170 | 245 | |
laserdad | 6:c3db4eff9170 | 246 | // print header 0x6601 |
laserdad | 6:c3db4eff9170 | 247 | rpi.putc(0x66); |
laserdad | 6:c3db4eff9170 | 248 | rpi.putc(0x01); |
laserdad | 6:c3db4eff9170 | 249 | for (int n =0; n<40;n++) |
laserdad | 6:c3db4eff9170 | 250 | { |
laserdad | 6:c3db4eff9170 | 251 | rpi.putc(byte2print[n]); |
laserdad | 6:c3db4eff9170 | 252 | } |
laserdad | 6:c3db4eff9170 | 253 | rpi.putc( (char) checksum ); |
laserdad | 6:c3db4eff9170 | 254 | } //end while |
laserdad | 5:d7b803aa9079 | 255 | |
laserdad | 5:d7b803aa9079 | 256 | } //END MAIN |