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