Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

pic18f2620 spi haberleşme

Başlatan sawyer, 15 Mart 2016, 13:03:11

sawyer

Merhaba,
serdar çiçeğin kitabındaki spi örneklerinden "CCS C Fonksiyonlarını Kullanarak Donanımsal SPI İletişim İle 25640 Harici EEPROM Uygulaması"  adlı örneğindeki pic16f877 ile 18f2620 değiştirdim. fakat spi haberlşeme yapamadım. yardımcı olurmusunuz.

teşekkür.

kodlar aşağıdaki linktedir.

/******************************************************
PIC16F877 ile CCS C Dosyalarını Kullanarak Donanımsal SPI İletişim İle 25640 Harici EEPROM Uygulaması
*******************************************************/

#include <18F2620.h>



#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları

#use delay(clock=20000000)   // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) // RS232 iletişim ayarları belirtiliyor

#include <input.c>   // input.c dosyası programa ekleniyor
#include <stdlib.h>  // stdlib.h dosyası programa ekleniyor

#define CS PIN_C2    // CS ifadesi PIN_C2 pini yerine atanıyor

#define SPI_MODE_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H) 
#define SPI_MODE_1 (SPI_L_TO_H) 
#define SPI_MODE_2 (SPI_H_TO_L) 
#define SPI_MODE_3 (SPI_H_TO_L | SPI_XMIT_L_TO_H) 

int8 _adres[4],veri,adres_high,adres_low,i;  // int8 tipinde değişkenler tanımlanıyor
int16 adres;                                 // int16 tipinde değişken tanımlanıyor
char islem;                                  // char tipinde değişken tanımlanıyor

#int_ssp // SPI iletişiminde yazma veya okuma yapıldığında meydana gelen kesme
void SPI_kesmesi()
{
   output_high(pin_c0); // RC0'a bağlı LED yansın
   delay_ms(250);       // Gecikme veriliyor
   output_low(pin_c0);  // RC0'a bağlı LED sönsün
}


/******************* ANA PROGRAM FONKSİYONU *************************/
void main ()
{
  // setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   setup_spi(spi_master| SPI_MODE_1 | spi_clk_div_16);  // SPI iletişim ayarları belirtiliyor

   enable_interrupts(int_ssp);   // SPI kesmesi aktif yapılıyor
   enable_interrupts(GLOBAL);    // Aktif edilen tüm kesmelere izin ver  

   printf("\n\r***********************************************************");
   printf("\n\r   25LC640 Harici EEPROM Bilgi Okuma ve Yazma Programi     ");
   printf("\n\r***********************************************************");
   printf("\n\r");

   output_high(cs); // Harici EEPROM CS ucu lojik-1 yapılıyor

   while(1) // Sonsuz Döngü
   {
      do  // do-while döngüsü tanımlanıyor
      {
         printf("\n\r\r\r1-Belirtilen adresteki veriyi oku");
         printf("\n\r2-Belirtilen adresten itibaren sona kadar tum adresleri oku");
         printf("\n\r3-Belirtilen adrese istenen veriyi yaz");
         printf("\n\r4-Tum bellege ayni veriyi yaz");
         printf("\n\r5-Durum (Status) kaydedicisi degerini oku");
         printf("\n\r\rBir islem seciniz (1,2,3,4,5) >");

         islem=getc();  // RS232 portundan gelen veri alınıyor
         putc(islem);   // "islem" değişkeni içeriği RS232 portuna gönderiliyor
      }  while ( (islem!='1') && (islem!='2') && (islem!='3') && (islem!='4') && (islem!='5')); // Girilen karakter 1,2,3,4 dışında ise döngü başına dön

      if (islem=='1')  // Eğer okunan karakter "1" ise
      {
         printf("\n\r\rOkumak istediginiz adresi giriniz>");

         get_string(_adres,4);      // Seri porttan gelen adres bilgisi string olarak alınıyor
         adres=atol(_adres);        // String olarak alınan adres bilgisi tam sayıya çevriliyor
         adres_high=make8(adres,1); // Adres değerinin 8 bitlik MSB değeri adres_high değişkenine kaydediliyor
         adres_low=make8(adres,0);  // Adres değerinin 8 bitlik LSB değeri adres_low değişkenine kaydediliyor

         printf("\n\r\rVeri okunuyor...");

         output_low(cs);         // Entegre seçiliyor
         spi_write(0x03);        // Okuma komutu (READ) gönderiliyor
         delay_ms(5);            // Gecikme veriliyor
         spi_write(adres_high);  // Okunacak adres değerinin 8 bitlik MSB değeri gönderiliyor
         delay_ms(5);            // Gecikme veriliyor
         spi_write(adres_low);   // Okunacak adres değerinin 8 bitlik LSB değeri gönderiliyor
         delay_ms(5);            // Gecikme veriliyor
         printf("\n\r\rAdres=%04lu    Deger=0x%02X",adres,spi_read(0) );  // İstenen adresteki değer okunuyor
         output_high(cs);        // Entegre bekleme konumuna getiriliyor
         delay_ms(5);            // Gecikme veriliyor
      }

      if (islem=='2')  // Eğer okunan karakter "2" ise
      {
         printf("\n\r\rOkumaya baslamak istediginiz adresi giriniz>");

         get_string(_adres,4);      // Seri porttan gelen adres bilgisi string olarak alınıyor
         adres=atol(_adres);        // String olarak alınan adres bilgisi tam sayıya çevriliyor
         adres_high=make8(adres,1); // Adres değerinin 8 bitlik MSB değeri adres_high değişkenine kaydediliyor
         adres_low=make8(adres,0);  // Adres değerinin 8 bitlik LSB değeri adres_low değişkenine kaydediliyor

         output_low(cs);         // Entegre seçiliyor
         spi_write(0x03);        // Okuma komutu (READ) gönderiliyor
         delay_ms(5);            // Gecikme veriliyor
         spi_write(adres_high);  // Okunacak adres değerinin 8 bitlik MSB değeri gönderiliyor
         delay_ms(5);            // Gecikme veriliyor
         spi_write(adres_low);   // Okunacak adres değerinin 8 bitlik LSB değeri gönderiliyor
         delay_ms(5);            // Gecikme veriliyor

         for(;adres<=0x1FFF;adres++)   // Belleğin sonuna gelene kadar döngü dönsün
         {
            printf("\n\r\rAdres=%04lu    Deger=0x%02X",adres,spi_read(0)); // İstenen adresteki değer okunuyor
            delay_ms(5);         // Gecikme veriliyor
         }         

         output_high(cs);  // Entegre bekleme konumuna getiriliyor
      }


      if (islem=='3')  // Eğer okunan karakter "3" ise
      {
         printf("\n\r\rBilgi yazmak istediginiz adresi giriniz> ");

         get_string(_adres,4);      // Seri porttan gelen adres bilgisi string olarak alınıyor
         adres=atol(_adres);        // String olarak alınan adres bilgisi tam sayıya çevriliyor
         adres_high=make8(adres,1); // Adres değerinin 8 bitlik MSB değeri adres_high değişkenine kaydediliyor
         adres_low=make8(adres,0);  // Adres değerinin 8 bitlik LSB değeri adres_low değişkenine kaydediliyor

         printf("\n\r\rBilgiyi giriniz> ");
         veri=gethex();          // Yazılacak veri heksadesimal olarak alınıyor
         printf("\n\r\rVeri yaziliyor...");

         output_low(cs);         // Entegre seçiliyor
         spi_write(0x06);        // Yazmaya izin ver komutu (WREN) gönderiliyor
         delay_ms(5);            // Gecikme veriliyor
         output_high(cs);        // Entegre bekleme konumuna getiriliyor

         output_low(cs);         // Entegre seçiliyor
         spi_write(0x02);        // Yazma komutu (WRITE) gönderiliyor
         delay_ms(5);            // Gecikme veriliyor
         spi_write(adres_high);  // Okunacak adres değerinin 8 bitlik MSB değeri gönderiliyor
         delay_ms(5);            // Gecikme veriliyor
         spi_write(adres_low);   // Okunacak adres değerinin 8 bitlik LSB değeri gönderiliyor
         delay_ms(5);            // Gecikme veriliyor
         spi_write(veri);        // Belirtilen adrese yazdırılacak veri gönderiliyor
         delay_ms(5);            // Gecikme veriliyor
         output_high(cs);        // Entegre bekleme konumuna getiriliyor
         printf("\n\r\rYazma islemi bitti.");
      }

      if (islem=='4')  // Eğer okunan karakter "4" ise
      {
         disable_interrupts(GLOBAL);    // Tüm kesmeleri pasif hale getirir. Tüm belleğe yazma işlemi daha hızlı yapılsın diye.  
         printf("\n\r\rBilgiyi giriniz> ");
         veri=gethex();             // Yazılacak veri heksadesimal olarak alınıyor

         printf("\n\r\rVeri yaziliyor...");

         for(adres=0;adres<8192;adres=adres+32) // Her sayfa (page) yazımı bitince adres değeri diğer sayfa başlangıcı olsun
         {
            adres_high=make8(adres,1); // Adres değerinin 8 bitlik MSB değeri adres_high değişkenine kaydediliyor
            adres_low=make8(adres,0);  // Adres değerinin 8 bitlik LSB değeri adres_low değişkenine kaydediliyor

            output_low(cs);         // Entegre seçiliyor
            spi_write(0x06);        // Yazmaya izin ver komutu (WREN) gönderiliyor
            delay_ms(5);            // Gecikme veriliyor
            output_high(cs);        // Entegre bekleme konumuna getiriliyor

            delay_ms(5);            // Gecikme veriliyor
            output_low(cs);         // Entegre seçiliyor
            spi_write(0x02);        // Yazma komutu (WRITE) gönderiliyor
            delay_ms(5);            // Gecikme veriliyor
            spi_write(adres_high);  // Okunacak adres değerinin 8 bitlik MSB değeri gönderiliyor
            delay_ms(5);            // Gecikme veriliyor
            spi_write(adres_low);   // Okunacak adres değerinin 8 bitlik LSB değeri gönderiliyor
            delay_ms(5);            // Gecikme veriliyor

            for(i=0;i<=32;i++)      // Her sayfa (page) 32 byte olduğundan 
            {
               spi_write(veri);     // Belirtilen adrese yazdırılacak veri gönderiliyor
               delay_ms(5);         // Gecikme veriliyor
            }
            output_high(cs);        // Entegre bekleme konumuna getiriliyor
            delay_ms(20);           // Gecikme veriliyor
         }

         printf("\n\r\rYazma islemi bitti.");
         enable_interrupts(GLOBAL);    // Aktif edilen tüm kesmelere izin ver 
      }

      if (islem=='5')      // Eğer okunan karakter "5" ise
      {
         output_low(cs);   // Entegre seçiliyor
         spi_write(0x06);  // Yazmaya izin ver komutu (WREN) gönderiliyor
         delay_ms(5);      // Gecikme veriliyor
         output_high(cs);  // Entegre bekleme konumuna getiriliyor

         output_low(cs);   // Entegre seçiliyor
         spi_write(0x05);  // Durum kaydedicisi okuma komutu (WRSR) gönderiliyor
         delay_ms(5);      // Gecikme veriliyor
         printf("\n\r\rDurum (Status) Kaydedicisi Degeri=0x%02X",spi_read(0));   // Durum kaydedicisi değeri okunuyor
         output_high(cs);  // Entegre bekleme konumuna getiriliyor
      }
   }
}


https://www.dropbox.com/s/dn0l7zw8lth3oi1/CCS%20C%20Fonksiyonlar%C4%B1n%C4%B1%20Kullanarak%20Donan%C4%B1msal%20SPI%20%C4%B0leti%C5%9Fim%20%C4%B0le%2025640%20Harici%20EEPROM%20Uygulamas%C4%B1.rar?dl=0

Eren Eraslan

Derledi mi , hata ne verdi? Skopla sinyallere baktınız mı , clock sinyali vs?
insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan

rree

CCS nin kendi 25640.c  kütüphanesi  var onu denesen.