29F040 Kullananlardan Yardım

Başlatan YARGICH, 16 Aralık 2006, 18:24:09

YARGICH

Selam,

   Elimdeki AMD 29F040 hafıza entegresini kullanmaya çalışıyorum. Yalnız şu an Trabzonda öğrenci yurdunda kalıyorum ve burda osilaskopsuz bu işler çok zor oluyo. Kör gibiyim. Yazdıklarımın ne kadarı doğru, problem nerde var bulamıyorum. Application not da bulamadım. Elinde bu entegre için Write/Read altrutinlerini veya driverını gönderen olursa çok sevinirim.

  Donanım olarak hata yok. Yazılımda bir problem olduğunu düşünüyorum. Belki okuma yapıyorum ama yazamadığım için onuda anlayamıyor olabilirim. Dediğim gibi işin neresinde olduğumuda tam kestiremiyorum. Aslında çok zor görünmüyor ama hatamı bulamadım. Şu an internet kafeden yazıyorum. C kodu yanımda değil ama ekleyeceğim.

  29Fxxx serisini yada 28Fxxx serisi programlamış arkadaşlardan yardım bekliyorum. İncelediğim kadarı ile 28F serisi 29F serisine çok yakın bir mantıkta. Farkını tam olarak bilmiyorum. O yüzden ikisi için olan kod da işime yarayabilir.

  Renesas M16C ile çalışıyorum, IAR da ANSI-C ile yazıyorum ama PIC-ASM, PIC-C, ANSI-C ile ilgili bütün kodlar işime yarar. KEIL, PBP ve AVR-ASM lerden pek anlamıyorum.

Yardımlarınız için şimdiden teşekkürler.
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.

diot

Devrede hata olmadığını yazmışsın . Devreyide görseydik iyiydi. Datasheet ini http://pdf1.alldatasheet.com/datasheet-pdf/view/55581/AMD/29F040.html  linkinden indirebilirsin.

Esasında zor bişey değil.  verdiğim linkteki 30 sayfalık dökümanda okuma, silme ve programlama rutinleri var.
Başarılar.

YARGICH



Resimde diğer elemanların bağlantıları ayrınyılı olarak çizilmemiştir.

Aşağıda 29F040 için pin tanımlamaları, BYTE veya Komut yazma ve Okuma rutinleri var. Yazma rutininde
Data Polling kısımlarını yapamadığımı düşündüğüm için çıkardım. Zaten Data polling sadece
yazıp yazmadığını kontrol etmek için sanırım. Onun yerine uzun zaman gecikmesi koyarak yazma
işlemi için gerekli zamanı tanımayı denedim. Sonuçta ikiside olmadı. Bir de bu yazma işlemi yapıldıktan
sonra data uclarının bazı bitlerinden status bilgisi geri alınıyor. Bunlardan DQ7 yazıldığını
bildiriyor galiba. Bu kısımları pek anlayamadım açıkcası. Yazma işlemi bittikten bir müddet
sonra aynı adresi otomatik olarak okuyup çıkışlara aktarmıyor mu? Bu durumda ben yazdığım
adresi hiç değiştirmeden okuma moduna geçerek yazdığım ile aynı mı diye karşılaştırmam doğrulama
yapmama yetmiyormu?

 Yazma işlemi icin belli komutları peş peşe Flaş belleğe göndermem gerekiyor. Flaş Belleğe
1 Byte yazmak için gerekli komut dizisi;
         FLASH_Byte_Yaz(0x5555,0xAA);
          FLASH_Byte_Yaz(0x2AAA,0x55);
          FLASH_Byte_Yaz(0x5555,0xA0);

          FLASH_Byte_Yaz(adres,data);	// yazılmak istenen adres ve data...


Aynı şekilde okumak içinde benzer bir komut dizisi var. Yalnız 29F040 enerji verildikten sonra hemen
okuma moduna geçebiliyor ve hiç bir komut göndermeye gerek kalmadan okuma yapılabiliyor. Bunun için
1 byte yazdıktan sonra Reset Komutunu kullanarak bellek okuma moduna geçirilebiliyor. Bundan dolayı
okumak için komut göndermeye gerek kalmıyor.

Benim bildiklerim ve yaptıklarım bundan ibaret. Yukarıya yazdıklarımın hepsi bir soru niteliği taşımaktadır. Doğruluğunu
iddia edemem. Etse idim yapmış olurdum. Yazdığım kodlar aşağıdadır. Eksikler mutlaka var. Yardımlarınızı bekliyorum.


İyi Çalışmalar.



//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//             FLASH 29F040-120 512KB Driver
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
#define FLASH_WR            P2_bit.P2_3
#define FLASH_CE1           P2_bit.P2_4
#define FLASH_CE2           P2_bit.P2_6 // for 1024 KB
#define FLASH_CE3           P2_bit.P2_7 // for 1536 KB

#define FLASH_OE1           P2_bit.P2_5

#define FLASH_DATA          P3

#define FLASH_ADRES_L       P0          //
#define FLASH_ADRES_H       P9          //
#define FLASH_ADRES_128     P2_bit.P2_0 //
#define FLASH_ADRES_256     P2_bit.P2_1 //
#define FLASH_ADRES_512     P2_bit.P2_2 //
//......................................................
#define FLASH_WR_D          PD2_bit.PD2_3
#define FLASH_CE1_D         PD2_bit.PD2_4
#define FLASH_CE2_D         PD2_bit.PD2_6 // for 1024 KB
#define FLASH_CE3_D         PD2_bit.PD2_7 // for 1536 KB

#define FLASH_OE1_D         PD2_bit.PD2_5

#define FLASH_DATA_IN       (PD3=0x00)
#define FLASH_DATA_OUT      (PD3=0xff)

#define FLASH_ADRES_L_D     PD0          //
#define FLASH_ADRES_H_D     PD9          //
#define FLASH_ADRES_128_D   PD2_bit.PD2_0 //
#define FLASH_ADRES_256_D   PD2_bit.PD2_1 //
#define FLASH_ADRES_512_D   PD2_bit.PD2_2 //

//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//               FLASH 512KB Flash Tanımlamaları yapılır
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
void FLASH_512KB_Kur(void)
{

FLASH_WR_D=1;           // OUT
FLASH_CE1_D=1;          // OUT
FLASH_CE2_D=1;          // OUT
FLASH_CE3_D=1;          // OUT
FLASH_OE1_D=1;          // OUT

FLASH_ADRES_L_D=0xFF;   // OUT
FLASH_ADRES_H_D=0xFF;   // OUT
FLASH_ADRES_128_D=1;    // OUT
FLASH_ADRES_256_D=1;    // OUT
FLASH_ADRES_512_D=1;    // OUT

FLASH_WR=1;     // Low aktif oldukları için default değerleri "1" olacaktır.
FLASH_CE1=1;
FLASH_OE1=1;
FLASH_CE2=1;   //.........................................................


}


//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//                    Flash Belleğe byte yazar
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
void FLASH_Byte_Yaz(long adres, unsigned char data)
{
  unsigned char temp1,adres2,adres1,adres0;

  FLASH_DATA_OUT;

  adres0=adres;
  adres=adres>>8;
  adres1=adres;
  adres=adres>>8;
  adres2=adres;

  FLASH_ADRES_L=adres0;
  FLASH_ADRES_H=adres1;

  temp1=adres2 & 0x01;
  if (temp1==1) { FLASH_ADRES_128=1; } else { FLASH_ADRES_128=0; }
  temp1=adres2 & 0x02;
  if (temp1==2) { FLASH_ADRES_256=1; } else { FLASH_ADRES_256=0; }
  temp1=adres2 & 0x04;
  if (temp1==4) { FLASH_ADRES_512=1; } else { FLASH_ADRES_512=0; }

  FLASH_CE1=0;
  FLASH_WR=0;

  DelayUs(1);

  FLASH_DATA=data;

  DelayUs(1);

  FLASH_WR=1;
  FLASH_CE1=1;

}


//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//                    Flash Bellekten 1 byte okunur
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
unsigned char FLASH_Byte_Oku(long adres)
{
  unsigned char temp1,adres2,adres1,adres0;

  FLASH_DATA_IN;

  adres0=adres;
  adres=adres>>8;
  adres1=adres;
  adres=adres>>8;
  adres2=adres;

  FLASH_ADRES_L=adres0;
  FLASH_ADRES_H=adres1;

  temp1=adres2 & 0x01;
  if (temp1==1) { FLASH_ADRES_128=1; } else { FLASH_ADRES_128=0; }
  temp1=adres2 & 0x02;
  if (temp1==2) { FLASH_ADRES_256=1; } else { FLASH_ADRES_256=0; }
  temp1=adres2 & 0x04;
  if (temp1==4) { FLASH_ADRES_512=1; } else { FLASH_ADRES_512=0; }

  FLASH_WR=1;
  FLASH_CE1=0;
  FLASH_OE1=0;

  DelayUs(1);

  temp1=FLASH_DATA;

  FLASH_CE1=1;
  FLASH_OE1=1;
  FLASH_WR=1;

  return(temp1);

}
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//                              END
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.

YARGICH

Selam,

  Bu ve benzeri flash serisinden (29Fxxx-28Fxxx) olan ürünleri kullanan arkadaşlardan data-polling kısmı konusunda yardım bekliyorum. Data kontrolünü veriyi yazdıktan sonra okuma moduna geçerek mi? yoksa Flash'ın ürettiği status bitlerinden mi kontrol ediyorsunuz?

İyi Çalışmalar.
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.

YARGICH

@diot,

  Selam, hocam kolay dedin ama eksiklerimi söylersen bende denemeler yaparım. Veya ne kadarını doğru yapmışım veya minik bir program parçası verebilirsen sevinirim.


İyi Çalışmalar.
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.