ccs c ile spi haberleşmesi hakkında

aporeis123

Üye
Katılım
11 Eki 2017
Mesajlar
15
Puanları
1
Yaş
26
Herkese öncelikle hayırlı çalışmalar.Şimdiden destekleri için teşekkürler.İnternetten araştırmalarıma göre 2 pic arasında spi haberleşmesi yapılabiliyormuş.Bununla ilgili pek fazla örnek kod bulamadım.Spi haberleşmesi ile ilgili örnek kod atabilecek var mı.Açıkçası bu konu üzerine çalışmak istiyorum.Bilgisi olan varsa lütfen iletişime geçsin...
 
Cevap için gec olmus ancak belki baskabirilerinin işine yarar diye ögrendiklerimi aktarayım.
spi haberlesme ile birden cok pic ile haberlesme yapabilirsiniz.
çalısma mantıgını anlatınca jetonlar dusecek ve yerlerını bulacaktır.
iki adet pic i birbiri ile seri haberlestirmenin mantıgı.
piclerden biri master(yani ana yonetici),digeri ise slave olarak ayarlanacaktır.slavelerin sayısı artabilir,yani birden cok slave ic secebilirsiniz.işte hangi slave ile haberlesşilecekse master tarafından uretilen cip secme sinyalı (serial select) secilen cipe gonderilir.Bu sayede sadece secilen cip ile bilgi alısverisi gercekleşebilir olacaktır.
Master ile slave arasındaki olması gereken baglatılar
masterın serial data out'u (SDO) --------> slaveni serial data in'ine(SDI)
masterin serial data in'i (SDI) ------------> slavenin serial data out'una(SDO)
masterin clock(SCK) ucu------------->slavenin SCK ucuna
masterin cip secme(herhangibir cıkıs) ucu------->slavenin serial selec(SS cip secme ucuna)

master cip secme sinyalini sıfıra cekerek karsı taraftaki cipi secmiş olur.
masterin her SCK sinyalinde masterin bufferindeki bilgi slaveye gider ve aynı sıradada slavenin bufferindeki bilgi mastere gelir.
haberlesme hızını secen masterın SCK sinyalidir,slave hangi hızda calısıyorsa calıssın masterden her bilgi geldiginde kendiside bir bilgiyi mastere gonderir.(8 bitlik shift registeri düşünün,soldan yeni bir bilgi girdimi,sagdan bir bilgi cıkar ve bu bilgi diger ic ye gider).

Hangi cip in master,hangisinin slave olarak ayarlamak istiyorsak gerekli ayarlamaları yapmak için gerekli ayarlamalar yapılır .
uzun sozun kısası:işte benim kullandıgım spi haberlesmesi.

spi.c (master)*******************************************
#include "spi.h"
#include "PORTLAR.c"

void spiInit(Spi_Type sType, Spi_Data_Sample sDataSample, Spi_Clock_Idle sClockIdle, Spi_Transmit_Edge sTransmitEdge) //spi ayarlaması yapılıyor
{
TRISC5 = 0;
if(sType & 0b00000100) //If Slave Mode
{
#asm
CLRF SSPBUF
#endasm
}
else //If Master Mode
{

OSCCON= 0b01100111;
TRISA = 0b00011111;
TRISB=0b11111111;
TRISC=0b10010000;
TRISD=0b00000000;
TRISE=0b00001011;
OPTION_REG=0b11000101;

SSPBUF=0x0;
PIR1=0x0;

ANSEL=0x0;
ANSELH=0x0;

ADCON1=0x06;

SSPSTAT=0x0;
SSPCON=0x33; //33 TMR2 --0X32 FOSC/64 (haberlesme hızını belirlemede kullanılıyor)

T2CON =0b00000100;//0b00000100 1/2 101==1/4 111==1/16 //spi de kullaniliyor(haberlesme hızını belirliyor)

T1CON=0b00110001; //0b00110001 iken 500 ms 250ms de bir timeout
TMR1IE=1;

IOCB=0b11111111; //PORTB PIN CHANGE INTERRUP
RBIE=1;


}
}

static void spiReceiveWait()
{

while ( !SSPSTATbits.BF ); // Wait for Data Receive complete
}

void spiWrite(char dat) //Write data to SPI bus
{
SSPBUF = dat;
spiReceiveWait(); // wait until the all bits receive
}

unsigned spiDataReady() //Check whether the data is ready to read
{
if(SSPSTATbits.BF)
return 1;
else
return 0;
}

char spiRead() //REad the received data
{
// spiReceiveWait(); // wait until the all bits receive
return(SSPBUF); // read the received data from the buffer
}

/*************************************************************************
//**************************************
void SLAVE_GONDER_AL() // deneme2 --------------->
{
RA5 = 0; //Slave Select
SSPBUF = SPI_GIDEN.byte_SPI_GIDEN; // komut gonderildi(gidecek bilgi buffere konuyor)
while ( !SSPSTATbits.BF ); // (gittimi diye kontrol ediliyor)
SPI_GELEN.byte_SPI_GELEN=SSPBUF; // veri okundu (gitmisse gelen okunuyor)
RA5 = 1; //Slave Deselect
}
//************
RA5 = 1;
spiInit(SPI_MASTER_OSC_DIV4, SPI_DATA_SAMPLE_MIDDLE, SPI_CLOCK_IDLE_LOW, SPI_IDLE_2_ACTIVE);
////////////////////////////////////////////////////
SLAVE YE YAZILACAK KODLAR:
spi.c kısmı:
/*
* File : spi.c
* Author : Ligo George
* Company : electroSome
* Project : SPI Library for MPLAB XC8
* Microcontroller : PIC 16F877A
* Created on April 15, 2017, 5:59 PM
*/

#include "spi.h"

void spiInit(Spi_Type sType, Spi_Data_Sample sDataSample, Spi_Clock_Idle sClockIdle, Spi_Transmit_Edge sTransmitEdge) //spi ayarlaması yapılıyor
{

if(sType & 0b00000100) //If Slave Mode
{
ANSEL=0;
ANSELH=0;
SSPSTAT = 0x00;
SSPCON=0X34;
TRISA5 = 1;
SSPIE = 1;
SSPIF = 0;
PEIE = 1;
GIE = 1;


}
else //If Master Mode
{
SSPSTAT = sDataSample | sTransmitEdge;

}


}

static void spiReceiveWait()
{
while ( !SSPSTATbits.BF ); // Wait for Data Transmit/Receipt complete
}

void spiWrite(char dat) //Write data to SPI bus
{
SSPBUF = dat;
}

unsigned spiDataReady() //Check whether the data is ready to read
{
if(SSPSTATbits.BF)
return 1;
else
return 0;
}

char spiRead() //REad the received data
{
// spiReceiveWait(); // wait until the all bits receive
return(SSPBUF); // read the received data from the buffer
}

main.c kısmında

spiInit(SPI_SLAVE_SS_EN, SPI_DATA_SAMPLE_MIDDLE, SPI_CLOCK_IDLE_LOW, SPI_IDLE_2_ACTIVE);

//**********************************************************
void interrupt ISR()
{
if(SSPIF == 1)
{
SPI_GELEN=SSPBUF; //BUFFERDA GIDECEK BILGI ONCEDEN VARKEN (gelen bilgi alınıyor,zaten bufferde onceden kayıtlı olan bilgide gönderilmiş oluyor)
SSPBUF=SPI_GIDEN.byte_SPI_GIDEN; (karsı tara
SSPIF = 0;

TMR1_COUNT=0;
if(SPI_GELEN==SPI_TEMP) //IKI KERE AYNI BILGI GELmısse ıselm yapılıyor
{
ISLEM_YAP();
SPI_TEMP=0;
}
else
{
SPI_TEMP=SPI_GELEN;
}

}}

////////////////////////
spi.h dosyası
/*
* File : spi.h
* Author : Ligo George
* Company : electroSome
* Project : SPI Library for MPLAB XC8
* Microcontroller : PIC 16F877A
* Created on April 15, 2017, 5:59 PM
*/

#ifndef SPI_H
#define SPI_H

#include <xc.h>

typedef enum
{
SPI_MASTER_OSC_DIV4 = 0b00100000,
SPI_MASTER_OSC_DIV16 = 0b00100001,
SPI_MASTER_OSC_DIV64 = 0b00100010,
SPI_MASTER_TMR2 = 0b00100011,
SPI_SLAVE_SS_EN = 0b00100100,
SPI_SLAVE_SS_DIS = 0b00100101
}Spi_Type;

typedef enum
{
SPI_DATA_SAMPLE_MIDDLE = 0b00000000,
SPI_DATA_SAMPLE_END = 0b10000000
}Spi_Data_Sample;

typedef enum
{
SPI_CLOCK_IDLE_HIGH = 0b00010000,
SPI_CLOCK_IDLE_LOW = 0b00000000
}Spi_Clock_Idle;

typedef enum
{
SPI_IDLE_2_ACTIVE = 0b00000000,
SPI_ACTIVE_2_IDLE = 0b01000000
}Spi_Transmit_Edge;


void spiInit(Spi_Type, Spi_Data_Sample, Spi_Clock_Idle, Spi_Transmit_Edge);
void spiWrite(char);
unsigned spiDataReady();
char spiRead();

#endif /* SPI_H */


Ben bilgi alışverisi yaparken kontrol için iki kere aldım ve birbirlerinin aynıysa veri dogru gelmıs diyerek işlem yaptırdım.
Çogu kişi karsı taraftan bilgi okumak için sahte bilgi gönderir ve karsı taraftan bilgi okur,halbusiki full dublex(aynı anda alma verme) haberlesmesi spi ile yapılabiliniyor.masterden bir bit gittimi slavedende bir bit bilgi gelmis oluyor.
Umarım yardımcı olabilmişimdir,hala basaramdım diyen olursa yinede yardımcı olmaya calısırım.
selamlar.
 
ÇOK teşekkür ederim cevabınız için bende biraz geç cevaplıyorum ama sorularımı sorarsam birileri de bakar beraber cevaplar bulmaya çalışırız herkes öğrenmiş olur neyse
Master ile slave arasındaki olması gereken baglatılar
masterın serial data out'u (SDO) --------> slaveni serial data in'ine(SDI)
masterin serial data in'i (SDI) ------------> slavenin serial data out'una(SDO)
masterin clock(SCK) ucu------------->slavenin SCK ucuna
masterin cip secme(herhangibir cıkıs) ucu------->slavenin serial selec(SS cip secme ucuna)

burada yazdıklarınızdan kablolu haberleşme yaptığınızı anlıyorum peki nrf24l01 ile kablosuz spi haberleşmesi yapamaz mıyız?
 
ÇOK teşekkür ederim cevabınız için bende biraz geç cevaplıyorum ama sorularımı sorarsam birileri de bakar beraber cevaplar bulmaya çalışırız herkes öğrenmiş olur neyse
Master ile slave arasındaki olması gereken baglatılar
masterın serial data out'u (SDO) --------> slaveni serial data in'ine(SDI)
masterin serial data in'i (SDI) ------------> slavenin serial data out'una(SDO)
masterin clock(SCK) ucu------------->slavenin SCK ucuna
masterin cip secme(herhangibir cıkıs) ucu------->slavenin serial selec(SS cip secme ucuna)

burada yazdıklarınızdan kablolu haberleşme yaptığınızı anlıyorum peki nrf24l01 ile kablosuz spi haberleşmesi yapamaz mıyız?
Kardes zaten bu nrf modulu inceledigim kadarıyla rf uzerinden iki cihaz arasında bilgi alısverisi yapmada kullanılıyor,bunlardan gelen bilgileride zaten spi uzerinden yapıyor.İnternette epeyce kullanımı ile ilgili bilgi var.Biraz kafa yorarsanız eminim cozersiniz.
 

Forum istatistikleri

Konular
128,098
Mesajlar
914,955
Kullanıcılar
449,798
Son üye
jsons

Yeni konular

Geri
Üst