I have an ADS1243 connected to an MSP430F2618.
Vdd = 3.3V, Vref+ 2.5V, Vref- gnd
4 single ended voltages on Ain0 to Ain3, Gnd on Ain4, Voltages are in the mV range
I am getting max value back when I read the ADC, 0x7FFFFF on each channel.
I send the MUX register new channel after DRDY goes low, then I wait until the next DRDY to read the data.
RANGE =1
SETUP = 0x00
ACR = 0x04
MUX = 0x04, 0x14, 0x24, 0x34 , change on each read
Bipolar data format
Any help on reading the values correctly would be very helpful.
Thanks
Greg
Code Attached:
void init_ADC24(void) { uint8_t i,temp; uint8_t regValue[10]; char *ptr; ptr = (char *)&Adc24; // Config Pins: DRDY, PDWN P2SEL &= ~b11000000; P2DIR |= b10000000; // Turn IC On, PDWN P2OUT |= b10000000; for(i=0;i<5;i++) _NOP(); // Delay // Reset P3OUT &= ~P0; // CS while(!(IFG2&UCB0TXIFG)); UCB0TXBUF = 0xFE; while(UCB0STAT&UCBUSY); temp = UCB0RXBUF; P3OUT |= P0; // CS while(!(P2IN&BIT6)); // DRDY goes high while(P2IN&BIT6); // DRDY for(i=0;i<10;i++) _NOP(); // Delay // Calibration P3OUT &= ~P0; // CS while(!(IFG2&UCB0TXIFG)); UCB0TXBUF = 0xF0; while(UCB0STAT&UCBUSY); temp = UCB0RXBUF; P3OUT |= P0; // CS while(!(P2IN&BIT6)); // DRDY goes high while(P2IN&BIT6); // DRDY for(i=0;i<10;i++) _NOP(); // Delay // Write Config Registers regValue[0] = 0x50; // Write regValue[1] = 0x08; // Registers count 8 + 1 regValue[2] = 0x00; // Setup regValue[3] = 0x04; // Mux regValue[4] = 0x04; // ACR regValue[5] = 0x00; // ODAC regValue[6] = 0x00; // DIO regValue[7] = 0xFF; // DIR regValue[8] = 0x00; // IOCON P3OUT &= ~P0; // CS for(i=0;i<9;i++) { while(!(IFG2&UCB0TXIFG)); UCB0TXBUF = regValue[i]; } while(UCB0STAT&UCBUSY); temp = UCB0RXBUF; P3OUT |= P0; // CS //while(!(P2IN&BIT6)); // DRDY goes high while(P2IN&BIT6); // DRDY for(i=0;i<10;i++) _NOP(); // Delay // Read back all registers regValue[0] = 0x10; regValue[1] = 0x0F; P3OUT &= ~P0; // CS while(!(IFG2&UCB0TXIFG)); UCB0TXBUF = regValue[0]; while(!(IFG2&UCB0RXIFG)); temp = UCB0RXBUF; while(!(IFG2&UCB0TXIFG)); UCB0TXBUF = regValue[1]; while(!(IFG2&UCB0RXIFG)); temp = UCB0RXBUF; for(i=0;i<5;i++) _NOP(); for(i=0;i<16;i++) { while(!(IFG2&UCB0TXIFG)); UCB0TXBUF = 0x00; while(!(IFG2&UCB0RXIFG)); *ptr++ = UCB0RXBUF; } while(UCB0STAT&UCBUSY); P3OUT |= P0; // CS temp++; } void read_ADC24(void) { uint8_t i,j,temp; uint32_t value=0; uint8_t regValue[5]; // int32_t convValue=0; for(j=0;j<4;j++) { // Wait for DRDRY to go low to minimizes settling error while(!(P2IN&BIT6)); // DRDY goes high while(P2IN&BIT6); // DRDY // Change Channel regValue[0] = b01010000; regValue[1] = 0x00; switch(j) { case 0: regValue[2] = 0x04; // Mux CH0 pri-volt (V+) break; case 1: regValue[2] = 0x14; // Mux CH1 sec-volt (VSEC) break; case 2: regValue[2] = 0x24; // Mux CH2 sec-sw1 (VSEC_SW1) break; case 3: regValue[2] = 0x34; // Mux CH3 sec-sw2 (VSEC-SW2) break; } P3OUT &= ~P0; // CS for(i=0;i<3;i++) { while(!(IFG2&UCB0TXIFG)); UCB0TXBUF = regValue[i]; } while(UCB0STAT&UCBUSY); temp = UCB0RXBUF; P3OUT |= P0; // CS // Wait for data conversion while(!(P2IN&BIT6)); // DRDY goes high while(P2IN&BIT6); // DRDY // Read Data value=0; regValue[0] = b00000001; P3OUT &= ~P0; // CS while(!(IFG2&UCB0TXIFG)); UCB0TXBUF = regValue[0]; while(UCB0STAT&UCBUSY); temp = UCB0RXBUF; for(i=0;i<15;i++) _NOP(); // Delay for(i=0;i<3;i++) { while(!(IFG2&UCB0TXIFG)); UCB0TXBUF = 0x00; while(!(IFG2&UCB0RXIFG)); temp = UCB0RXBUF; value <<= 8; value += temp; } while(UCB0STAT&UCBUSY); P3OUT |= P0; // CS if(value>0x007FFFFF) value += 0xFF000000; switch(j) { case 0: Adc24.priCnt = value; // Mux CH0 pri-volt (V+) // convValue = ((Adc24.priCnt*149)/100*3831)/100000; // Data.priVolt = (int16_t)convValue; // mV Data.priVolt = Adc24.priCnt; break; case 1: Adc24.secCnt = value; // Mux CH1 sec-volt (VSEC) Data.secVolt = Adc24.secCnt; // mV break; case 2: Adc24.secSw1Cnt = value; // Mux CH2 sec-sw1 (VSEC_SW1) Data.secSw1Volt = Adc24.secSw1Cnt; // mV break; case 3: Adc24.secSw2Cnt = value; // Mux CH3 sec-sw2 (VSEC-SW2) Data.secSw2Volt = Adc24.secSw2Cnt; // mV break; } _NOP(); } _NOP(); }