This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

INTERFACING BETWEEN PIC16F876 WITH ADS1211 READING PROBLEM using SPI

Other Parts Discussed in Thread: ADS1211

DEAR SIR,

kindly help me out  in below code ,I don't known what is wrong in this, iam not able to read from DOR register:


void main(void)
{
unsigned int i,c;
TRISA=0x00; // mux selection A,B,C output=0,STARt CONV,HYDRO_TEST;AC_MAG_GAIN=;
TRISB=0xF0; // CHANNEL SELECTION A0-A3=0;ADC16_BUSY,X,Y,ZADC_DRDY=1
TRISC=0xD1; // spi SDO,clk output=0,SDI input=1;TX=1;RX=1
ADCON1=0x86;

MUX_SEL(3); // XADC_CS SELECTED=0;
config_ADC();
set_ADC_offset(0x00000000); // SET OCR REGISTER
set_ADC_full(0x007FFFFF);


while(1)
{
DOR_BUFFER = read_DOR();
FULL_BUFFER=read_ADC_full();
OFF_BUFFER=read_ADC_off();
}
}


void config_ADC(void)
{
long comand;
ADC_reset();
ADC_self_cal();
comand=0x800004B0;
set_command(comand); //write 4 bytes in command address
}
//----------------------
void set_command(long value) /// CMR register////////// INSR AND CMR REG CONTROL THE OPERATION OF CONVERSION OK
{

write_adc_instr(0x64); //write to command CMR 3BYTE MSB addres 0100 for 1 byte
write_adc_4byte(value);
ADS_wait();
}
//-------------------------check data is ready ///////////////////////////

void ADS_wait(void)
{
while(XADC_DRDY=0); //waiting DRDY=1
while(XADC_DRDY=1); //waiting falling DRDY

}

//------------------------------write to INSR register-----------------//
void write_adc_instr(char data) //send 1 instr. byte INSR AND CMR REG CONTROL THE OPERATION OF CONVERSION OK
{
ADS_wait();
write_adc_byte(data);
TRISC=0xF1; //SPI_SDI=1; /// make input

}
//---------------------
void ADC_self_cal(void) //self calibration OK
{
write_adc_instr(0x07); // insr command reg byte 1,ADD CMR at byte 0 REFER DATASHEETS PAGE 19 ADDRESS
write_adc_byte(0x20); // insr 2 byte selectec mb0=1,DOR address 0000 for 2 byte
ADS_wait();
}

//------------------- write 1 byte data --------------------------//
void write_adc_byte(char BUFF) //send 1 instr. byte checked OK
{
unsigned char i,data;
TRISC=0xD1;// make SDO as output
BUFF = ((BUFF)&(0xFF));
for(i=0;i<8;i++)
{
SPI_SCL=1;
SPI_SDO=1;
data=BUFF;
data=(data>>i); // NEXT BIT
data=(data & 0x01); // AND OPEARATION TO GET SAME DATA
DelayMs(4);
if(data == 0)
{
SPI_SDO = 0;
}
else
{
SPI_SDO = 1;

}
SPI_SCL = 0;
DelayMs(4); // delay for 50ms

}
TRISC=0xF1; // make SDO as input
}
//--------------------- write 4 byte data CMR register -------------//
void write_adc_4byte(long BUFF) //sen 4 byte serial check OK
{
unsigned char i;
long data;
TRISC=0xD1; // make SDO as output
BUFF = ((BUFF)&(0xFFFFFFFF));
DelayMs(4);
while(XADC_DRDY=0);
for(i=0;i<32;i++)
{
SPI_SCL=1;
SPI_SDO=1;
data=BUFF;
data=(data>>i); // NEXT BIT
data=(data & 0x01); // AND OPEARATION TO GET SAME DATA
DelayMs(4);
if(data == 0)
{
SPI_SDO = 0;
}
else
{
SPI_SDO = 1;

}
SPI_SCL = 0;
DelayMs(4); // delay for 50ms
}
TRISC=0xF1; // make SDO as input
}
//----------------------------write 3 byte data for DOR,FCR,OCR register ----------//
void write_adc_3byte(long BUFF) //sen 3 byte serial checked OK
{
unsigned char i;
long data;
TRISC=0xD1; // make SDO as output
BUFF = ((BUFF)&(0x00FFFFFF));
DelayMs(4);
for(i=0;i<24;i++)
{
SPI_SCL=1;
SPI_SDO=1;
data=BUFF;
data=(data>>i); // NEXT BIT
data=(data & 0x01); // AND OPEARATION TO GET SAME DATA
DelayMs(4);
if(data == 0)
{
SPI_SDO = 0;
}
else
{
SPI_SDO = 1;

}
SPI_SCL = 0;
DelayMs(4); // delay for 50ms
}
TRISC=0xF1; // make SDO as input
}

//---------------------
void set_ADC_offset(long value) ///// OCR register//////////// OCR AND FCR REG CONVERTING THE INTERNAL CORRECTION BRFORE PLACING ON DOR OK
{

write_adc_instr(0x48); //write ocr register ADDRESS BYTE2 MSB
write_adc_3byte(value); // DATA

}
//----------------------------
void set_ADC_full(long value) ////FCR register //////////////////////// OCR AND FCR REG CONVERTING THE INTERNAL CORRECTION BRFORE PLACING ON DOR OK
{

write_adc_instr(0x4C); // WRITE 2 BYTE MSB FCR REG IN INSR
write_adc_3byte(value); // DATA

}
//--------------------
void ADC_reset(void) //reset ADS1211
{

SPI_SCL=1;
DelayMs(37); //300*Txy
SPI_SCL=0;
DelayMs(5);
SPI_SCL=1;
DelayMs(87); //300*Txy
SPI_SCL=0;
DelayMs(5);
SPI_SCL=1;
DelayMs(137); //300*Txy
SPI_SCL=0;
DelayMs(10);

}


//------------------------------Read ////////////////////////////////////
long read_adc_3byte(void) //read 3 Bytes OK
{
unsigned char i;
long data=0,data1=1;
TRISC=0xF1; // make SDO as input

for(i=1;i<=24;i++)
{
SPI_SCL=1;

if( SPI_SDO == 1)
{

data =(data|(0x01));
}
else
{
data =(data|(0x00));
}
data =(data<<1);
SPI_SCL=0;
send_hex(data);
DelayMs(10);
}
return(data);
}


//-----------------------
long read_DOR() //read DOR register OK
{
long DOR_data;
write_adc_instr(0xC0); //read DOR register 2 bytes MSB beginig in addres 0000 FROM INSR
DOR_data=read_adc_3byte(); //read the 3 bytes
return DOR_data;
}
//----------------------------
long read_ADC_off() //Read OFF register OK
{
long off_data;
write_adc_instr(0xC8); //order for read 2 bytes MSB in addres 1000
off_data=read_adc_3byte(); //read the 3 bytes
return off_data;
}
//------------------------------
long read_ADC_full() //Read FULL register OK
{
long full_data;
write_adc_instr(0xCC); //order for read 2 MSB bytes beginig in addres 1100
full_data=read_adc_3byte(); //read the 3 bytes
return full_data;
}