DMA ile Paralel veri aktarımı Fikir alışverişi

Başlatan Mucit23, 22 Mayıs 2017, 11:32:34

Mucit23

Selamlar

DMA ile RAM'deki bir alanı GPIO ile Dışarıya aktarmak istiyorum. Bu konuda biraz fikir alışverişine ihtiyacım var.

Bu arada RGB paneller ile uğraşıyorum. Panele veri Aktarırken Ram'de ayırmış olduğum alanı sırayla panele göndereceğim. Bu işi otomatik yaptırmak istiyorum ama takıldığım bir nokta var.

Panele Veri aktarıyorum ama her bir aktarım işlemi sonunda Panele Clock uygulamam lazım. İşte burada takılıyorum. Normalde PSoC'larda DMA kullanımı zor değil. Aynı STMlerde olduğu gibi çalışıyor. DMA interrupt kesmesi var ama sadece Transfer Complete kesmesi oluşuyor. Yani örneğin Ben 1kbyte veri aktaracaksam DMAyı tetikledikten sonra Veri otomatikmen gönderiliyor. Ardından DMA Transfer Complete kesmesi oluşuyor.

PSoC'da bu işi yapmak zor değil. Aşağıdaki gibi bir kullanımı mevcut.


Timer her DMA yı tetiklediğinde 1 byte veri aktarıyor. 1kbyte veri için timer'in 1024 defa DMA'yı tetiklemesi gerekiyor. DMA verinin tamamını aktarınca TC kesmesi oluşturuyor.

İşte takıldığım nokta burası. DMA bütün veri gönderildikten sonra kesme oluşturuyor. Başka kaynak yok. Her bir aktarım işleminden sonra kesme oluştursa aslında kesme içerisinde clock uygulayacağım. Aynı sorun ARM mimarisinde de var. STM'lerde de bu işi yapamıyorum.

Bu konuda fikir alışverişine ihtiyacım var. Çok hızlı bir şekilde Clock sinyali üreterek paralel veri aktarımı yapabilmek için ne tür donanımlar kullanılır? Yada nasıl bir yöntem uygulayabilirim? Fikir verebilecek olan varmı?

Zoroaster

Yanlış hatırlamıyorsam LCD vs ye data basarken external data portunu 6800  uyumlu yapabilmek mümkündü.

Bu modda data external porta yüklenirken donanmımsal olarak Wr sinyali de eşzamanlı oluşuyordu.

Wr sinyali de senin üretmeye çalıştığın Clk sinyali oluyor.

Dokümanlardan external portun 6800 uyumluluğunun anlatıldığı bölüme bir bak. Eğer DMA bu external data interface birimi ile çalışıyorsa
istediğin mümkün.

6800 Modu benim yakıştırmam da olabilir. Belki dokümanda daha farklı isimlendirme yapılmış olabilir.

Seytan deliginden kacti.

Zoroaster

Tamam iste istedigin  "LCD parallel interface, 8080/6800 modes"

Bu modda porta datayi yazdiginda WR sinyali de kendiliginden olusur. (Diye dusunuyorum. STM32F4xx de denemedim ama 6800 islemciyi kullanmistim)
Seytan deliginden kacti.

Mucit23

Abi paralel LCD interface diyince aklıma bir şeytanlık geldi sayende. Şimdi psoc'larda 6800 veya 8080'a dair bir haberleşme birimi yok. Ama en çok kullanılan SSD1289, ILİ9325 gibi TFT lcd'ler için doğrudan haberleşme arayüzü var. Bunun için UDP birimlerini yazmışlar daha önceden. Bu modülleri DMA ile ilişkilendirirsem eğer istediğim işi yapmış olacam.

kenan_re

İki farklı DMA ve iki farklı değişken kullanabilirsin. Birincisi 1byte için ikincisi 1024kbyte için; her 1 byte için 1 kesme alırsın bunu hem 1024 byte DMA için hem clock için kullanarak 1 aktarımı tamamlarsın. Son olarak 1024 byte DMA çıktısını yine bir kesmeye bağlar 1Byte DMA kaynak adresini 1 arttırır ve bu döngüyü 1024 kez yaparsın mesela  ;D

Mucit23

Hocam tam olarak anlayamadım.

Graphic LCD sürücüleri işimi görmedi. Çok yavaş çalışıyor. Yani basit bir for döngüsü ile daha yüksek hızlı aktarım yapabiliyorum. Anlam veremedim.

kenan_re

#6
Yanlış anlamadıysam soruna bir örnek yaptım ama başka bi şekilde
Pin_2 çıkışı255 clock üretir. Pin_1 çıkışı 255 adet bittiğinde 1 Pulse üretir.
Alttaki sayıcı 255 adet aktarım bittiğinde Timer'ı durdurur ve istenilirse kesme içinde başka şeylerde yaptırılabilir.

https://drive.google.com/file/d/0BxhWYol8RFSaTExsbmx2UE9VTm8/view?usp=sharing


minicihazlar

STM32 üzerinde FSMC bloğu kullanırsanız datayı zaten paralel çıkartacaktır, artı clock sinyalinide kendi üretecektir. FSMC sadece RAM/ROM/FLASH bağlamak için değil böyle uygulamalarda da kullanılabilir.

PSoC için is Smart I/O (http://www.cypress.com/file/369066/download) özelliği olan PSoC'larda clock üretilmesini bu Smart I/O blok ile yapılabilir diye tahmin ediyorum, denemek lazım.