AD7791 SPI Driver Hakkında

Başlatan Bahadır AYDINOĞLU, 14 Ekim 2015, 14:05:54

Bahadır AYDINOĞLU

Merhaba arkadaşlar,
Elektronik Terazi yapmak istiyorum. Load Cell'den gelen veriyi, AD7791 (24 bit) entegresi ile PIC'e göndereceğim. Sürücü oluşturmak istedim ve CCS C'nin driverları arasından AD7715 (16 bit) sürücü yazılımını gördüm ve bu yazılıma bakarak driver oluşturmaya çalıştım datasheete bakarak. Driver'ı Source File olarak oluşturdum ve #include ile ana programa dahil ettim.

2 driver yazılımı da aşağıdaki kodlarda.

AD7715 Driver
#define ADC_CS    PIN_C7
#define ADC_RESET PIN_C6
#define ADC_DRDY  PIN_C2
#define ADC_DI    PIN_C4
#define ADC_DO    PIN_C5
#define ADC_CLK   PIN_C3

void write_adc_byte(BYTE data);

adc_init()
{
	output_low(ADC_RESET);
        output_high(ADC_CLK);
	output_high(ADC_CS);	//Set low to AD7715 chip select low pin
	output_high(ADC_RESET);	//Set high to AD7715 reset low pin
	delay_ms(3000);

	write_adc_byte( 0x12 );			//Communications Register
	write_adc_byte( 0x62 );			//Setup Register info here
}

void write_adc_byte(BYTE data) {
   BYTE i;

   output_low(ADC_CS);
   for(i=1;i<=8;++i) {
      output_low(ADC_CLK);
      output_bit(ADC_DI, shift_left(&data,1,0));
      output_high(ADC_CLK);0
   }
   output_high(ADC_CS);
}


long int read_adc_word() {
   BYTE i;
   long data;

   output_low(ADC_CS);
   for(i=1;i<=16;++i) {
      output_low(ADC_CLK);
      output_high(ADC_CLK);
      shift_left(&data,2,input(ADC_DO));
   }
   output_high(ADC_CS);
   return data;
}



long int read_adc_value() {
        long int value;

	while ( input(ADC_DRDY) );
	while ( !input(ADC_DRDY) );
	while ( input(ADC_DRDY) );

	write_adc_byte(0x3a);
	value=read_adc_word();

	return value;
}


Yukardaki yazılıma bakarak aşağıdaki kodları yazdım.
AD7791
#define ADC_CS 		PIN_C1
#define ADC_SCLK	PIN_C3
#define ADC_DIN		PIN_C5
#define ADC_DOUT	PIN_C4

void write_adc_byte(BYTE data);

void adc_reset()
{
	BYTE i;
	int16 rst=0xFFFF;

   output_low(ADC_CS);
   for(i=1;i<=32;++i) {
      output_low(ADC_SCLK);
      output_bit(ADC_DIN, shift_left(rst,4,1));
      output_high(ADC_SCLK);
   }
   output_high(ADC_CS);
}	
void write_adc_byte(BYTE data)
{
      BYTE i;	

  	  output_low(ADC_CS);
   for(i=1;i<=8;++i)
   {
      output_low(ADC_SCLK);
      output_bit(ADC_DIN, shift_left(&data,1,0));
      output_high(ADC_SCLK); 
   }
   output_high(ADC_CS);
}
void adc_init()
{	
	output_high(ADC_SCLK);
	output_high(ADC_CS);	//Set low to AD7715 chip select low pin
	adc_reset();	//Set high to AD7715 reset low pin
	delay_ms(3000);

	write_adc_byte(0x10);			//Communications Register   
	write_adc_byte(0x82);			//Data Register info here  

}

int32 read_adc_word() {
   BYTE i;
   int32 data;

   output_low(ADC_CS);
   for(i=1;i<=24;++i) {
      output_low(ADC_SCLK);
      output_high(ADC_SCLK);
      shift_left(&data,3,input(ADC_DOUT));
   }
   output_high(ADC_CS);
   return data;
}

int32 read_adc_value() {
    
    int32 value;

	while ( input(ADC_DIN) );
	while ( !input(ADC_DIN) );
	while ( input(ADC_DIN) );

	write_adc_byte(0x3); // ???
	value=read_adc_word();

	return value;
}

main.c dosyasında ise sadece reset,init,read_adc_value fonksiyonlarını ekledim adc ile haberleşip haberleşemediğimi görmek için ve sonuç haberleşemedim :(.

Yardım istediğim konu bu kısım hakkında aranızda hiç AD7791 kullanan veya SPI haberleşmesi kullanıp ADC'den veri okuyan var mı, varsa bana yardımcı olabilir misiniz ?