spi haberlesme

Başlatan fuzulidark, 09 Ağustos 2012, 13:43:51

fuzulidark

arkadaslar merhaba

max6675 entegresini kullanmam gerekiyor devrede bu entegre spi habrlesmesini kullaniyor. spi haberlesme sisteminde pic'in spi cikisinda chip select islemi islemi ile ayni spi cikisinda birden cok entegre baglanabiliyormus. Fakat bu konu ile hic bir bilgi bulamadim chip select islemi nasil yapiliyor yardimci olabilirmisiniz?

fgokcegoz

SPI ile haberleşen cihazlarda CS(chip select) hattı vardır. Bir mikrodenetleyicinin SPI hattına bağlı birden fazla slave cihaz olabilir. Mikrodenetleyici hangi slave cihaz ile haberleşmek istiyorsa, o cihazın CS pinini lojik0 a çeker ve datayı gönderir. Diğer slave cihazların CS pini lojik1 de kaldığı için haberleşme sadece o cihaz ile olur. Mikrodenetleyiciyinin spi hattına kaç adet slave cihaz bağlayacaksan o kadar pinini slave cihazların her birinin cs pinine bağlamalısın. Fazla cihaz varsa işlemciden çok pin harcanacağı için kaydırmalı kaydedicide kullanabilirsin, CS pinlerini sürmek için...
"Vicdanın ziyası, ulûm-u diniyedir. Aklın nuru, fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder." (Bediüzzaman Said Nursi)

fuzulidark

[table]
[tr]
[td]

#include <16f877.h>


#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use fast_io(d)

#define LCD_ENABLE_PIN PIN_d0
#define LCD_RS_PIN PIN_d1
#define LCD_RW_PIN PIN_d2
#define LCD_DATA_PORT d
#define LCD_TYPE 2
#define LCD_TRIS_LOCATION 88
#include <lcd.c>

unsigned int8 data1,data2;
//long x,m,n,k,ahmet;
unsigned int16 bilgi;
float sicaklik;



 read_max6675(void)
{
[b]output_high(pin_c0);
delay_ms(10);
output_low(pin_c0);[/b]
data1=spi_read(10);
//data1=spi_write(10);
//data2=spi_write(10);
data2=spi_read(10);
output_high(pin_c0);

bilgi=make16(data1,data2);
bilgi=bilgi&(0b0111111111111000);
bilgi=bilgi>>3;
//bilgi=data1;
//bilgi=bilgi<<8;
//bilgi=bilgi|data2;
//bilgi=bilgi>>2;
bilgi=bilgi/4;
sicaklik=bilgi;
//return sicaklik;
}


 
void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

   // TODO: USER CODE!!
set_tris_d(0x00);
 lcd_init();

 
   while(1)
   {
   read_max6675();
   
   printf(lcd_putc,"\fsicaklik=%3.1f%cC",sicaklik,0XDF);
   delay_ms(300);
   }
}[/td]
[/tr]
[/table]


output_high(pin_c0);
delay_ms(10);
output_low(pin_c0);
bu kodun oldugu yer entegrenin cs ucu diger baglayacak oldugum entegrelerinde cs ucunun bagli oldugu yerlerde bu islemi yaptigimda okuma olacak. Dogru anladim sanirim dimi?

fgokcegoz

#3
Evet aynen öyle... Bu işlem haberleşme için ön şart diyebiliriz yani. Kullanacağın entegrenin datasheetini incelersen, timing diagram larında CS pininin önemini daha net görürsün. Ayrıca haberleşmeye başlamadan önce bu pin lojik0 a çekildikten sonra, haberleşme bittikten sonra lojik1 e çekilir. Sadece haberleşme esnasında lojik0 da kalır...

"Vicdanın ziyası, ulûm-u diniyedir. Aklın nuru, fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder." (Bediüzzaman Said Nursi)

fuzulidark

cok tesekkurler verdiginiz bilgiler icin gercekten cok yarari oldu :)