18f87K22 SPI Haberleşmesi Problemi

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

Faruk53

02 Mayıs 2017, 06:15:24 Son düzenlenme: 02 Mayıs 2017, 14:04: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

Kod Seç

#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 

    
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;
Kod Seç

//****************************İŞLEMCİYİ HAZIRLA*******************************//
void mcu_init()
{
    
ADCON0 0x00;
    
ADCON1 0x00;
    
ADCON2 0x00;
    
ANCON00x00;
    
ANCON10x00;
    
ANCON20x00;
    
    
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ü;

Kod Seç


void MFRC522_Wr
(unsigne char adress,unsigned char value)
{
    
SPI_CS=0;    
    
SPI_SendRecByte((adress <<)& 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 );
    
valueSPI_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)