SPI Slave Mode 32 Bit Receiver

Başlatan seco06, 18 Kasım 2011, 20:14:44

seco06

unsigned char SPI_RECEIVE()
{
  SSPBUF = 0;					
  while(!SSPIF);				
  SSPIF = 0;					
  return SSPBUF;				
}


unsigned int SPI_RECEIVE16()			
{
  return((unsigned int)(SPI_RECEIVE() << 8) + SPI_RECEIVE());
}


16f877 SPI haberleşmesinde slave mode da çalışıyor. Clock 32 bit boyutunda data için skop ile baktığımda yaklaşık 50ms ve daha sonra bir 50ms low seviyesinde boşluk var. Data alacağım cihazda SS (Slave Select) ucu yok. Sadece DATA ve CLOCK uçları var ve de master çalışıyor. Bu 32 bit sadece test sonuç çıktıları. İlk 8 bit ID , 12 bit SPEED , 12 bit PHASE. Bunları almak için 8 bit uzunluğundaki SSPBUF kullanıyorum ve sonra ise işlemle bunları düzenliyorum. Sorunum ise yukarıdaki SPI kodu ile yaptığımda 32 bitin doğru olarak başlangıcı kestirilmiyor. Çünkü SSPBUF dolana kadar bekleniyor. Yani datanın nereden alındığı anlaşılamıyor. Bahsedilen boş zamanda ise buffer dolmazsa bekleme yapılıyor. Doğru senkronu yakalamam için nasıl bir çözüm önerirsiniz. Farklı programlama dillerinde yapacağınız önerilerde kabulümdür. :) Saygılar.....



seco06

Şöyle birşey geldi aklıma; RB0/INT bacağına da clock u bağlayacağım RB0/INT ile aynı anda TMR0 da 50ms olarak ayarlayacağım.  50ms içinde 32 adet clock sayarsa senkron olmuş demektir. Eğer saymaz ise eksik veya fazla çıkarsa sayaçları sıfırlayıp yeniden başlayacak. İkinci defasında mutlaka senkron olur diye düşünüyorum. Senkron olmuş ise yani 32 clock saydıysa SPI yı aktif edeğim. Öneriniz.