This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

AD7705 and AT89s52

hi to all

i am started working on ad7705 16 bit ADC and my first experience on SPI communication.
the follwing code i wrote to communicate AD7705 to AT89s52


/******************************************************************************************************/

#include <REGX51.H>
#include<define.h>
#include<intrins.h>

/*******************************************************************************************************/
volatile unsigned int TimeTick1ms;
char DispBuf[DGTS_ON_DISP];
int SPI_OUTDATA_BUFFER;


sbit  SPI_DIN   = P1^4;  // SPI D_IN
sbit  SPI_DOUT  = P1^5;  // SPI D_OUT
sbit  SPI_DRDY  = P1^6;  // SPI D_RDY
sbit  SPI_CLK   = P1^7;  // SPI CLK

/*****************function declaration***************************/


void SPI_Write(char COMMAND_DATA);
void SPI_Read();

void TMR_1(void)interrupt 3
           {
                   TR1 = STOP;
                   TL1 = COUNT_LO_1mS;
                   TH1 = COUNT_HI_1mS;
                   TR1 = RUN;
                   TimeTick1ms++;

          }

void main(void)
         {
                 char i;
                 P0   = 0x3f;
                 P1   = 0xff;
                 P2   = 0xf8;
                 P3   = 0xff;

                 IE   = 0x8A;
                 TMOD = 0x11; /* T1 in 16-bit timer mode and T0 in 16-bit timer mode*/
             TH1  = 0x63;
         TL1  = 0xBF;
                 TR1  = RUN;
                 V2F  = 0;







/**********************************************/
                 while(1)
                     {
                          SPI_Write(0x20);    // Active Channel Ain1(+)/Ain1(-),Next Opraton Write to CLK REG.
              for(i=0;i<=10;i++)
                                     {_nop_();}

                          SPI_Write(0x0C);    // Master Clk Enable, 4.9512 MHz Clk , O/P Update rate 50Hz (20 mSec).
                      for(i=0;i<=10;i++)
                                     {_nop_();}

                          SPI_Write(0x28);    // Active Channel Ain1(+)/Ain1(-),Next Opraton Read to CLK REG.
                          for(i=0;i<=10;i++)
                                     {_nop_();}

                          SPI_Write(0x10);    // Active Channel Ain1(+)/Ain(-),Next Opraton Write to SETUP REG.
                      for(i=0;i<=10;i++)
                                     {_nop_();}

                          SPI_Write(0x40);    // Gain = 1, Bipolar Mode, Buffer Off, Clear FSYNC, Perform Self Calibration.
                      for(i=0;i<=10;i++)
                                     {_nop_();}   // Clearing  FSYNC bit Starts sampling.

                          while(SPI_DRDY);       //wait for DRDY to go LOW

                          SPI_Write(0x38);    // Active Channel Ain1(+)/Ain(-),Next Opraton Read From DATA REG.
                      for(i=0;i<=10;i++)
                                     {_nop_();}

                          SPI_Read();
                          for(i=0;i<=10;i++)
                                     {_nop_();}

                          val = SPI_OUTDATA_BUFFER;
              V2F = enable;
                          disp(val,Lable_No);


                        }
                }
/***********************************************************************/
void SPI_Write(char COMMAND_DATA)
               {
                                char i;
                                bit SPI_IN_BIT;
                                for(i=0;i<=8;i++)
                                       {
                                                SPI_IN_BIT = (COMMAND_DATA&0x80);// bit isolation 7 times
                                            SPI_CLK = 0;// clk is low
                                                SPI_DIN = SPI_IN_BIT;// data on data din sends
                                                COMMAND_DATA <<= 1;
                                                _nop_();
                                                SPI_CLK = 1;// clk is high
                                           }
                                SPI_CLK = 1; // the clk line is high
                           }

/**********************************************************************/
void SPI_Read()
                {
                        char i;
                        for (i=0;i<=16;i++)
                             {

                                  SPI_CLK = 0;
                                  SPI_OUTDATA_BUFFER = (SPI_OUTDATA_BUFFER | SPI_DOUT);
                                  _nop_();
                                  _nop_();
                                  _nop_();
                                  _nop_();
                                  _nop_();
                                  _nop_();
                                  _nop_();
                                  _nop_();
                                 SPI_CLK =      1;
                                  if(i < 16)
                                       {SPI_OUTDATA_BUFFER <<= 1;}
                                  }
                        SPI_CLK =       1;
                }



As DIN and SCLK waveform i saw on the CRO that are proper i dont no where i am makeing mistake.

list of problem are as follow
1. i am not comfirm that AD7705 getting the data or not
2. is my spi routine is proper
3. after AD7705 configuraton DRDY high and it remains on that state
4. i am using 4 MHz crystal but as per data sheet they said to use 4.9152MHz or 2MHz.

help me to solve this

0