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();
}