Stm32f4xx FSMC

Başlatan yldzelektronik, 25 Ağustos 2014, 23:21:23

yldzelektronik

Selamlar.

Elimde tft donanımı var ve onu inceliyorum.Ra8875 sürücüyle tftyi kontrol etmeye çalışıyorum.Bu işi fsmc ile yapmaya çabalıyorum.

Ancak dikkatimi bir konu çekti.Biraz araştırdım ancak kafam iyice karıştı.Şöyle;

Bütün tft sürücülerin driver dosyalarında şu ibareleri (makroları) görebiliyorum;

typedef struct
{
  __IO uint16_t LCD_RAM;
	__IO uint16_t LCD_REG;
} LCD_TypeDef;
     
#define Bank1_SRAM1_ADDR  ((uint32_t)0x60000000)
#define Bank1_SRAM2_ADDR  ((uint32_t)0x64000000) 
#define Bank1_SRAM3_ADDR  ((uint32_t)0x68000000)
#define Bank1_SRAM4_ADDR  ((uint32_t)0x6C000000)

#define LCD_BASE           Bank1_SRAM3_ADDR
#define LCD                ((LCD_TypeDef *) LCD_BASE)
	 
#define RA8755_CMD_ADDR	(volatile uint16_t *)(Bank1_SRAM3_ADDR | 2)
#define RA8755_DATA_ADDR	(volatile uint16_t *)(Bank1_SRAM3_ADDR | 0)


Fsmc adresini vs vermiş.Sorunlar şöyle;

Kullanırken şöyle kullanıyor;

void LCD_DataWrite(uint16_t reg, uint16_t data)
{
	LCD->LCD_REG = reg;
  LCD->LCD_RAM = data;	
}


Bu kullanımı çok anlayamadım.Biraz izah edebilir misiniz?

Aslında en önemli kısım fsmc adreslerinin olduğu kısım.

Debug ile verilen adrese bakıyorum beklediğim değişiklikler olmuyor.Örneğin bir fonksiyonda;

LCD_DataWrite(0x88, 0x0A);


şeklinde bir çağırım var.Ancak fonksiyona girdiğinde fsmc adreslerine

(RA8755_CMD_ADDR   (volatile uint16_t *)(Bank1_SRAM3_ADDR | 2) ki oda --->>>>RA8755_CMD_ADDR   (volatile uint16_t *)(0x68000000 | 2) olur,

#define RA8755_DATA_ADDR   (volatile uint16_t *)(Bank1_SRAM3_ADDR | 0) ki  oda--->>>#define RA8755_DATA_ADDR   (volatile uint16_t *)(0x68000000 | 0) olur.)

baktığımda olması gereken değişiklikler olmuyor.

Örneğin yukarıdaki çağırımda 0x68000000 adresine;

LCD->LCD_REG = reg;
satırıyla 0x0A yüklendiğini görüyorum.

LCD->LCD_RAM = data;
satırının hiç bir yeri değiştirmediğini düşünüyorum.Çünkü işareet ettiği adrese ve ileriki adreslere bakıyorum değişiklik yok.Ancak program olması gerektiği gibi lcd üzerinde resim gösteriyor.

Ben nereyi atlıyorum?Fsmcde işler nasıl yürüyor?

Reference manueli karıştırdım ancak konuyu kavramamı sağlayacak bir şeyler bulamadım.

Teşekkürler
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Burak B

Özelden yazdım buraya da yazayım;

1- RAIO8875 datasheetini sürekli açık tutacaksın. Okuyacaksın. Anlayacaksın.
2- FSMC denen şey basitçe LCD' nin data hattı ve kontrol hatlarını bir hafıza adresine map etmekten başka birşey yapmıyor.

    Yani  LCD_REG dediğinde LCD nin A0 veya C/D dediğimiz pini low oluyor. LCD_RAM deyince  aynı pin high oluyor. Buda o adrese yazılan bilginin komut mu veri mi olduğunu ayırt ediyor. Eğer sen LCD_REG= 0x5555 dediğinde LCD data hattında 01010101... olarak okuyorsan ve  A0(C/D) pini de low da ise FSMC de sorun yoktur. Olsa olsa çok hızlı veri gönderiyor olabilir. Bunuda FSMC init ederken ayarlamak yeterli olur.

  Uzun lafın kısası FSMC adresi dediğimiz şey LCD'mizin kontrol + data hatlarını ifade eden bir adresten ibaret. Bu da kullandığım MCU' nun datasheet ve uygulama notlarında gayet iyi bir şekilde anlatılmış.

"... a healthy dose of paranoia leads to better systems." Jack Ganssle