MMC'de Sektor Numarası ?

Başlatan YARGICH, 04 Mayıs 2006, 23:50:40

YARGICH

Selam,


     MMC ile ilgili bir çalışmam var, MMC'ye veri yazarken bir sorun yaşıyorum. İstediğim Sektöre İstediğim veriyi yazamıyorum. Açıkcası tam olarakta içerisinde nasıl bir sektör yapısı olduğunu anlamadım, anladığımında doğu olup olmadığını bilmiyorum. Bildiğim kadarıyla 4 Byte'lık bir sector numarası var. Bu da şöyle hesaplanıyor;

1. Sektör Numarası = 1*512=512   =0x00000200
2. Sektör Numarası = 2*512=1024 =0x00000400
3. Sektör Numarası = 3*512=1536 =0x00000600
4. Sektör Numarası = 4*512=2048 =0x00000800

Bu böyle devam ediyor. Tabi bunlar benim bildiğim kadarıyla. Ben bu adresleri Hex olarak direkt verdiğim zaman yazıp okuyabiliyorum. Yalnız sırayla adresleri de vererek yaz, oku dediğimde sorun çıkıyor. Hatta bazen yanlış sektör numarası hatası veriyor. Komut olarak hep CMD24'ü yani Tek block yazma komutunu kullanıyorum.

   Acaba MMC de Lcd gibi, ilk adresten sonra otomatik olarak bir sonraki adrese kendi mi geçiyor. Çünkü peş peşe aynı sectore veri yazdırdım ve yazdırdığım kadarıyla MMC nin içerisine aynı veriden doldur muş 8O Acaba yazılımın başka yerlerinde hata varda buna mı neden oluyo. Kullandığım MMC.h dosyası burda.

@mp3dragon, hocam söylediğiniz bir kaç şeyi yaptım ama yine olmadı. Size de fazla ÖM dan yüklenmeyeyim dedim ve yeni başlık altında sordum. Bir türlü bu MMC yi verimli bir şekilde kullanamadım. 1 sektör yazıyorum ama peş peşe yazamıyorum. Sorun çıkıyor.


 Tecrübelerinizi ve bilgilerini paylaştığınız için şimdiden Teşekkürler.
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.

mp3dragon

@YARGICH,

Açıkçası benimde takıldığım konular var ve sebebini tam çözemedim.
MMC yazma işine daha girmedim. Ama okurken sebebini çözemediğim bazı aksaklıklar var örneğin;

BMP_Oku(unsigned int FileNumber){

OpenFile (FileNumber );

// burada farklı kodlar var ama asıl aşağıdaki kod önemli ilk 54 bayt .bmp dosyasının başlığı

for (i=0; i<54;i++){
Get_MMC_Data();  // fonksiyon her çağrıldığında adres 1 artar 512 kez    
                           //  çağrılınca bir sonraki sektöre geçer   
}

// .bmp sıkıştırma olmadan 24 bit RGB (8 bit R, 8 bit G, 8 bit B)
// satır sonu 00 00 olarak algılanıyor yani 130 satır varsa 130 x 3 = 390 
// bayt sonra 00 00 geliyor. buna göre;

for(i=0;i<Sutun_Sayısı;i++){

do{
    B=Get_MMC_Data();
       G=Get_MMC_Data();    
// üst üste 2 adet bayt 0x00 olursa satır başına geç 
          if(!(B|G)) break;// bmp tersten okuyor yani alt sütundan BGR formatı!!

              R=Get_MMC_Data();  
                 Put_LCD_Data (R,G,B);
     }while(1);

}


Yukardaki kod çalışıyor mu? hayır sanki satır sonu kontrolünü yapmıyormuşum gibi davranıyor. Tabi bu sektör değişirken de bir hata varsa oluşabilir. Daha bende çözemedim ama 17 ve 24 komutunda sektör LCD satırlarındaki gibi otomatik artmıyor (18 ve 25 komutları var onun için)
İyilik Yap, Denize At, Balık Bilmezse, Halik Bilir.

mp3dragon

@YARGICH
senin kod böyle;
void MMC_write_block(unsigned char Block_Number){

int i=0;

     BlockAddress.L=Block_Number*512;

/*varl=((block_number&0x003F)<<9);
varh=((block_number&0xFFC0)>>7);

a=(varh>>8) & 0x00FF;
b=varh & 0x00FF;
c=(varl>>8) & 0x00FF;*/
	
	CHIP_SELECT = 0;
	SPI_rxtx(BlockAddress.AddressLong.Address3);
	SPI_rxtx(BlockAddress.AddressLong.Address2);
	SPI_rxtx(BlockAddress.AddressLong.Address1);
	SPI_rxtx(BlockAddress.AddressLong.Address0);
	SPI_rxtx(0xFF);
	while((SPI_rxtx(0xFF)&0x00FF)!=0x0000);

	SPI_rxtx(0xFE);
	for(i=0;i<512;i++){
		SPI_rxtx(Buffer[i]);
	}
	SPI_rxtx(0xFF);
	SPI_rxtx(0xFF);
	while((SPI_rxtx(0xFF)&0x001F)!=0x0005);

	CHIP_SELECT = 1;
	SPI_rxtx(0xFF);
}


şu şekilde olması gerekmezmi?

[/code]

void MMC_write_block(unsigned char Block_Number){

int i=0;

     BlockAddress.L=Block_Number*512;

/*varl=((block_number&0x003F)<<9);
varh=((block_number&0xFFC0)>>7);

a=(varh>>8) & 0x00FF;
b=varh & 0x00FF;
c=(varl>>8) & 0x00FF;*/
	
CHIP_SELECT = 0;


do{ //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!	

                SPI_rxtx(BlockAddress.AddressLong.Address3);
	SPI_rxtx(BlockAddress.AddressLong.Address2);
	SPI_rxtx(BlockAddress.AddressLong.Address1);
	SPI_rxtx(BlockAddress.AddressLong.Address0);
	SPI_rxtx(0xFF);
while((SPI_rxtx(0xFF)&0x00FF)!=0x0000);

	SPI_rxtx(0xFE);
	for(i=0;i<512;i++){
		SPI_rxtx(Buffer[i]);
	}
	SPI_rxtx(0xFF);
	SPI_rxtx(0xFF);
	while((SPI_rxtx(0xFF)&0x001F)!=0x0005);

	CHIP_SELECT = 1;
	SPI_rxtx(0xFF);
}

kolay gelsin
İyilik Yap, Denize At, Balık Bilmezse, Halik Bilir.

YARGICH

@mp3dragon

  Sizin bu eklediğiniz sürekli denemesine yarıyor herhalde. :roll: hımm evet olabilir. Yalnız onun while'ı yok mu? göremedim de.

  Hocam bu arada orda komutu yazmayı unutmuşum, adresin üzerinde komut da olacak :D

  Biraz önce bu kodu denedim oldu gibi;
varl=((Block_Number&0x007F)<<9);
varh=((Block_Number&0xFF80)>>7);

a=(varh>>8) & 0x00FF;
b=varh & 0x00FF;
c=(varl>>8) & 0x00FF;

	CHIP_SELECT = 0;
	SPI_rxtx(0x58);
	SPI_rxtx(a);
	SPI_rxtx(b);
	SPI_rxtx(c);
	SPI_rxtx(0x00);
	SPI_rxtx(0xFF);
	while((SPI_rxtx(0xFF)&0x00FF)!=0x0000);

 
Daha önce bu yöntem ile 63. sektörden sonrasında sorun yaşıyordum. Sorunlu olan hesaplama kısmı şöyle idi;
varl=((Block_Number&0x003F)<<9);
varh=((Block_Number&0xFFC0)>>7);

Zaten neden böyle yapıldığınıda anlamamıştım. Gerçi şu an bile acaba sorun bu muydu diye düşünüyorum, hala hakim olamadım şu merete :) O yüzden buraya yazıyı yazarken bi deneme daha yaptım odaaa ;
varl=((Block_Number&0x00FF)<<9);
varh=((Block_Number&0xFF00)>>7);

bununla da 41. sektörden sonra düzgün yazıyor 8O valla hiç bişi anlamadım.

ben şimdilik bunu kullanacağım;
varl=((Block_Number&0x007F)<<9);
varh=((Block_Number&0xFF80)>>7);

en azından 170 sektörlük veriyi düzgün yazdı. Daha sonra sorun çıkacak gibi görünüyo :( Şu sektrör adreslemeyi de hala anlamadım.

Hocam bu arada sen MMC'ye veri yazmadım dedin ama ben 85Kb için yaklaşık 5dk bekliyorum :roll: Harbi bişiler yanlış gidiyo :D bi MMC nin datasheet'inde 50MB/sn yazıyo 8O Verileri PC'den aktarıyorum, 115.200 boud da gönderiyorum. Neyse hızı şimdilik kalsın, bi doğru düzgün kullanayım da :D

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

mp3dragon

Pardon yukarıda yanlış olmuş doğrusu aşağıda editleyemediğim için tekrar gönderiyorum

void MMC_write_block(unsigned char Block_Number){ 

int i=0; 

     BlockAddress.L=Block_Number*512; 
    
CHIP_SELECT = 0; 


do{ //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    

   SPI_rxtx(BlockAddress.AddressLong.Address3); 
   SPI_rxtx(BlockAddress.AddressLong.Address2); 
   SPI_rxtx(BlockAddress.AddressLong.Address1); 
   SPI_rxtx(BlockAddress.AddressLong.Address0); 
   SPI_rxtx(0xFF); 
}while((SPI_rxtx(0xFF)&0x00FF)!=0x0000); 

   SPI_rxtx(0xFE); 
   for(i=0;i<512;i++){ 
      SPI_rxtx(Buffer[i]); 
   } 
   SPI_rxtx(0xFF); 
   SPI_rxtx(0xFF); 
   while((SPI_rxtx(0xFF)&0x001F)!=0x0005); 

   CHIP_SELECT = 1; 
   SPI_rxtx(0xFF); 
}
İyilik Yap, Denize At, Balık Bilmezse, Halik Bilir.

mp3dragon

@YARGICH,

varl=((Block_Number&0x007F)<<9); 
varh=((Block_Number&0xFF80)>>7);


yapmaya çalıştığı 32 bitlik veriyi 512 ile çarpıp bayt bayt ayırmak, uzun yolu seçmiş. Yani en azından amacının bu olması lazım.

ben typedef struct ile bayt bayt ayırıp 512 ile çarptım sen de öyle yapmışsın anladığım kadarı ile bu şekilde sorun olmaması gerekmekte.



benim denemediğim yazma rutini ise şöyle;

 unsigned char WritePhysicalSector(){
   unsigned char c;  
  
   //RED_LED = LED_ON;
   sectorAddress.l = sectorAddress.l * 2; //convert to bytes (combined with 8bit shift)
   c=MmcCommand(24 | 0x40 ,sectorAddress.b.b2,sectorAddress.b.b1,
                sectorAddress.b.b0, 0);
   sectorAddress.l = sectorAddress.l >> 1; //convert back to blocks
   MMC_XCS = MMC_SELECTED;
 
 
  dataBufPtr = diskSect.raw.buf;
   SPIPutCharWithoutWaiting(0xFE);
   SPIWait();
   
   for (c=0;c<128;c++){
    SPIPutCharWithoutWaiting(*dataBufPtr++);   
     SPIWait();
    SPIPutCharWithoutWaiting(*dataBufPtr++);   
    SPIWait();
    SPIPutCharWithoutWaiting(*dataBufPtr++);   
   SPIWait();
    SPIPutCharWithoutWaiting(*dataBufPtr++);   
     SPIWait();
  }

   MmcWaitForData(); //Wait for 0xFE token
   while (SPIGetChar()==0) 
    ; // Wait until MMC not busy.     
   
   SPI8Clocks(16);
  MMC_XCS = MMC_NOT_SELECTED;
  SPI8Clocks(16);
 
  //RED_LED = LED_OFF;
   return (0);
 }



yavaşlığa gelince,

45 kb .bmp dosyasını  3.66 mips hızında çalışan 8051 ile 24 bit -->8 bit dönüşümü de yaparak yavaş epson lcd ye göndermek ~2 -3sn sürüyor.

renesas veya IAR dan şüphelenmeye başladım. Benzer yavaşlık sorununu tatlısukurnazı arkadaşımız ile LCD data gönderiminde de tartışmıştık. Ben 3.66 mips 8051 ile 1 sn altında (şu an 0.5 sn) ekran rengi değiştirirken tatlısukurnazı 16 bit 16 mips renesasta ekranın dolmasını seyrediyordu???

ortada bir gariplik gerçekten var
İyilik Yap, Denize At, Balık Bilmezse, Halik Bilir.

YARGICH

tatlisukurnazi hocam Renesas'ın Clock ayarlarını yapmamış olabilir. Bende bi ara hız sorunu yaşadığımda tatlisukurnazi hocamın söylemiyle bir kaç şey yaptım, o anki hızını 10'a katlamıştı. Ama bende arada bir sorun yaşıyorum gibi :D Sonucta renesas'ın içerisinde CISC işlemci var, bu renesas için bir dezavantaj olsa gerek. Hız konusunda bende emin değilim, osilaskop ile bir kaç ölçüm almak gerekiyor.

  MMC'ye veriyi kaç boud ile gönderiyorsunuz acaba?

  Birde MMC'den okuma yaparken 512 byte okumak zorunlu değil galiba dimi? tek tek okuma yapmadan önce herhalde ne kadar okuyacağımızı daha önce belirlemek gerekecek herhalde. Onuda şu şekilde yaparsak;
SPI_rxtx(0x50);
		SPI_rxtx(0x00);
		SPI_rxtx(0x00);
		SPI_rxtx(0x00);
		SPI_rxtx(0x01);
		SPI_rxtx(0xFF);

tek tek okuyabiliriz herhalde. 512 byte'ı geçince de bir sonraki adresi vermemiz gerekecek herhalde :roll: Ben yine bu şekilde bir deneyeyim.




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

mp3dragon

rs232 ile haberleşmiyorum o yüzden baud hızı yok ama SPI hızı diyorsan CPU clock/128 ile CPUclock/8 arasında değer değiştirdim hız çok farketmedi darboğazım lcd, mmc değil gibi. Bu arada SPI ile maksimum 2.5 Mb haberleşebilirsin.

okumada CMD16 ile sektör büyüklüğünü 1 ile 512 bayt arasında değiştirebilirsin

kolay gelsin
İyilik Yap, Denize At, Balık Bilmezse, Halik Bilir.

YARGICH

Hocam geliba bu mmc işimi görmeyecek gibi. Yani Renesas'ı bi şekilde hızlandırsam bile, kullanacağım düzenekte yavaş kalacak gibi. Anladığım kadarıyla benim 1sn'de yaklaşık 200KB'ı mmc den okumuş ve aktarmış olmam gerekiyor. Belki yardımcı hafıza olarak kullanabilirim, o yüzden bana paralelden çalışan bi RAM gibi bişi lazım. ??? Hani MMC ile birlikte kullanırsam belki Flash olmasada olabilir ama MMC yi opsiyonel yaparsam aynı zamanda Flash bir hafıza olması lazım. Dert bir değil ki, bi de bu çıktı :roll: Yani en azından 1MB'a yakın bişi olsa fena olmaz. Buralarda bulabilirmiyiz acaba. Neyse ben bunu ayrı bir başlık altında sorayım belki kullanmış biri vardır.



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