18f87K22 SPI Haberleşmesi Problemi

Başlatan Faruk53, 02 Mayıs 2017, 03:15:24

Faruk53

Arkadaşlar merhaba 18F87K22 işlemcisi kullanarak RC522 modülü ile ufak bi kart okuma devresi yapmak için kolları sıvadım. Fakat vaktinde CCS C ile yazmış olduğum kodu gerekli düzenlemeleri yaparak XC8 ile yazmaya kalktım fakat hiçbir şekilde modül ile haberleşmeyi gerçekleştiremedim. Modül için kullanmış olduğum kütüphaneden eminim çünkü bu kütüphaneyi CCS C ile kullanmıştım. İlk defa register düzeyinde SPI haberleşmesi yapmaya çalışıyorum. Acaba nerede hata yapıyorum. İşlemcim şuan için 32Mhz dahili osilatörde çalışıyor. SPI kütüphanem aşağıdaki gibi

#include <xc.h>
#include "config.h"
#include "spi.h"
#include "gpio.h"

void spi_init(void)
{   
    SSP2STATbits.SMP=1;     // Giriş verileri veri çıkış zamanının sonunda örneklenir.
    SSP2STATbits.CKE=1;     //Transfer etkin saat durumundan boşta saat durumuna geçerken gerçekleşecek
    SSP2STATbits.BF=0;      // Başlangıçta tampon boş
    
    SSP2CON1bits.WCOL=0;    //Başlangıçta veri al/ver çarpışma yok.
    SSP2CON1bits.SSPOV=0;   //Başlangıçta taşma yok.
    SSP2CON1bits.SSPEN=1;   //SPI pinleri etkinleştirildi.
    SSP2CON1bits.CKP=0;     //Düşen kenarda haberleşme yapılacak.
    
    SSP2CON1bits.SSPM3=0;   //Haberleşme Hızı Fosc/16 oranında.
    SSP2CON1bits.SSPM2=0;
    SSP2CON1bits.SSPM1=0;
    SSP2CON1bits.SSPM0=0;
    
}

unsigned char SPI_SendRecByte(unsigned char data) 
{ 
    unsigned char c ; 

    c = SSP2BUF ;             
    SSP2BUF = data ;        
    while(SSP2STATbits.BF==0) {} 
    return SSP2BUF ;                      
} 
  

/*void spi_write( char data)//,unsigned char data)
{
    SSP2CON1bits.WCOL = 0;
    SSP2BUF = data;
    while(!SSP2STATbits.BF);   
}

unsigned char spi_read( char adres)
{
    SSP2CON1bits.WCOL = 0;
    SSP2BUF = adres;  
    while( !SSP2STATbits.BF );   
    return SSP2BUF;  
}*/


Aşağıdakide main.c dosyasındaki giriş çıkış portlarmın ayarlandığı kısım;
//****************************İŞLEMCİYİ HAZIRLA*******************************//
void mcu_init()
{
    ADCON0 = 0x00;
    ADCON1 = 0x00;
    ADCON2 = 0x00;
    ANCON0= 0x00;
    ANCON1= 0x00;
    ANCON2= 0x00;
    
    OSCCONbits.IRCF = 0b110; // OSSCON registerının IRCF bayrağı kullanılarak 8Mhz RC osilatör seçildi. 
    OSCTUNEbits.PLLEN = 0b1; //OSCTUNE registerının PLLEN bayrağı kullanılarak 4XLL aktif edildi.
    while(!OSCCONbits.HFIOFS); //Frekans kararlı olana kadar bekle
    
    TRISF=0x00;                  
    TRISJbits.TRISJ3=0;
      
    TRISDbits.TRISD4=0; // SDO2 çıkış
    TRISDbits.TRISD5=1; // SDI2 giriş
    TRISDbits.TRISD6=0; // SCK2 çıkış
    TRISDbits.TRISD7=0; // SS çıkış
    TRISAbits.TRISA5=0; // Reset çıkış
    mavi_led=0;
}
//****************************************************************************//


RC522'ye veri yazdığm ve okuduğum döngü;

void MFRC522_Wr(unsigne char adress,unsigned char value)
{
    SPI_CS=0;    
    SPI_SendRecByte((adress <<1 )& 0x7E);
    SPI_SendRecByte(value);
    SPI_CS=1;
}

char MFRC522_Rd (unsigned char adress)
{
   unsigned char value;
    SPI_CS=0;  
    SPI_SendRecByte( ( (adress<<1) &0x7E) |0x80 );
    value= SPI_SendRecByte(0x00);
    SPI_CS=1;
    return value;
}


Denemelerimde RC522'nin herhangi bir adresine bir değer yazıp daha sonra o adresteki değeri okumaya çalışıyorum. Fakat hiçbir türlü yazdığım değeri okuyamadım. Ya yazamıyorum ya da okuyamıyorum ya da her ikisi. Forumdaki bir çok konuya baktım. Bir çok yeri araştırdım. Yazdığım SPI kütüphanesinden daha farklı birşey bulamadım. Sanki kütüphanede bişeyleri eksik yaptım gibi. Forumdaki bi konuda 18F87K22 ile ENC arasında yapılan haberlşemeyle ilgili yazıyı okudum. SPI pinleri arasındaki mesafenin sorun olabiliceği konuşuluyordu. Fakat aradaki yollar 6cm. SPI hızıyla ilgilimi bi sorun var mı diye baktığımda ise RC522 10Mbit/s ' ye kadar destek veriyor. Ben 32Mhz'de SPI hızı bölme oranı Fosc/4'te çalışıyorum. Ne denediysem olmadı :) Saç baş yoldurttu bana :) Yardımlarınızı bekliyorum.

İşlemci ve modülün bağlantılarıda şu şekilde;

(RD4)SDO2----->MISO 
(RD5)SDI2------>MOSI
(RD6)SCK2----->SCK
(RD7)CS2------>SDA(CS)