Birden fazla SPI portunu senkronize kullanmak

Başlatan elektronart, 14 Haziran 2014, 13:47:09

elektronart

2 veya daha fazla modüle SPI ile veri göndermek istiyorum ama bunların hepsinin CLKları tek sinyalle sürülsün istiyorum.
Yani SPI portların datalarını ayrı ayrı kullanıp CLK olarak sadece bir tanesini kullanacağım.
Farklı SPI portları nasıl senkronize edilir?
SW SPI ile mümkün ama hızı bir hayli düşürdüğü için son tercih. Donanımsal olarak kullanılabilecek alternatifler de olabilir.
Açık Elektronik

Kabil ATICI

SPI iletişiminde veri ve saat hatları ortak olabilir. Çünkü iletişimde master slave çiplerin çip seçme uçlarına aktifleyerek iletişimi yönetir.
master çip iletişim kurmak istediği  slave çip CS ( çip seçme) ucunu aktifleyerek iletişimi sağlar. (özellikle birden fazla SPI çip varsa)

Zaten birçok işlemci üzerinde bu donanım bulunmaktadır.

ambar7

z

Clocklari senkronlasan bile start islemini de senkronlamadigin surece bunun onemi yok.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

elektronart

Tam anlatmak istediğimi anlatamadım sanırım,
İtediğim şöyle birşey; A ve B SPI ile çalışan iki modül olsun. Ben A'ya 0x55 gönderirken B'ye 0xAA göndermek istiyorum ve bu iki veri tam olarak aynı anda gitsin istiyorum. Tek bir CLK'un çıkan kenarı ile A 0 aldığında B 1 alacak, diğer CLK çıkan kenarla A 1 alacak ve B 0 alacak vs. Senkronlamaktan kastettiğim de buydu farklı veriler aynı anda gidecek. Umarım daha açık olmuştur.
Açık Elektronik

Müh. müh.

Mcu nun spi1 ve spi2 diye iki iletişim portu olduğunu varsayalım.

Spi1 in clock unu spi2 nin slave cihazına kullanıp, spi2 nin clockunu boşta bıraktığımızı düşünelim.



Yazılım kısmında spi1 in data registerına ve spi2 nin data registerına gönderilecek verileri yükledikten sonra, gönder bitlerini

spi1 gönder,set
spi2 gönder,set

şeklinde yaparsak, arada nano saniyelik bir fark oluşacaktır ama istediğin şeyde olacaktır. Öyle değil mi?



Eskiden senin bu istediğini yazılımla 5 spi şeklinde yapmıştım diye hatırlıyorum. Tek clk 5 ayrı DO, DIN vs. Aynı anda gönderim yapıyorlardı.

Destiny of white is dirtied. Destiny of black is found guilty...

Tagli

elektronart, neden böyle bir şey yapmak istiyorsun? Emir gönderdiğin modüllerin aynı anda harekete geçmesini istiyorsan şöyle de yapabilirsin: Hepsine emir verisini arka arkaya gönder ama bunlar bir "başla" komutu almadan işe başlamasınlar. Bu "başla" komutunu ise aynı anda hepsine gönderebilirsin (broadcast).
Gökçe Tağlıoğlu

z

Alıntı yapılan: Müh. müh. - 14 Haziran 2014, 16:06:50
.....
spi1 gönder,set
spi2 gönder,set

şeklinde yaparsak, arada nano saniyelik bir fark oluşacaktır ama istediğin şeyde olacaktır. Öyle değil mi?

Donanimsal anlamda senkronlayamazsan dedigin cozum her zaman ise yaramaz.
Nanosanilyelik gecikmeyi interruptlardan dolayi garanti edemezsin.
Interruptlari kapatirim dersende cozum yakisikli olmaz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

elektronart

Alıntı yapılan: Müh. müh. - 14 Haziran 2014, 16:06:50
spi1 gönder,set
spi2 gönder,set
şeklinde yaparsak, arada nano saniyelik bir fark oluşacaktır ama istediğin şeyde olacaktır. Öyle değil mi?

Bilmiyorum, olabilir de olmayabilir de, Z hocamın dediği sorunlar benim de aklıma geldi, her durumu test edemeyeceğim için deneyenler olmuş mu diye sordum ben de. Bir deneme yapmak farz oldu.

Alıntı yapılan: Tagli - 14 Haziran 2014, 16:48:29
elektronart, neden böyle bir şey yapmak istiyorsun? Emir gönderdiğin modüllerin aynı anda harekete geçmesini istiyorsan şöyle de yapabilirsin: Hepsine emir verisini arka arkaya gönder ama bunlar bir "başla" komutu almadan işe başlamasınlar. Bu "başla" komutunu ise aynı anda hepsine gönderebilirsin (broadcast).
Slavelere de ben kod yazsaydım çok güzel bir yöntem olurdu ama malesef bunu yapamıyorum. Veri gönderdiğim modül bir dot matrix led panel. Kırmızı ve yeşil için iki ayrı data girişi var ama ikisi için tek clock girişi ve tek enable girişi var. Senkronize data göndermekten başka alternatifim yok.
SW ile deniyorum, şimdilik HW SPIın 1/4 hızına kadar yükseltebildim.
Açık Elektronik

Müh. müh.

Alıntı yapılan: z - 14 Haziran 2014, 18:35:59
Donanimsal anlamda senkronlayamazsan dedigin cozum her zaman ise yaramaz.
Nanosanilyelik gecikmeyi interruptlardan dolayi garanti edemezsin.
Interruptlari kapatirim dersende cozum yakisikli olmaz.

Garanti ederim. Şöyle ki, interruptın,

spi1 gönderbiti, set
spi2 gönderbiti, set

bu iki kodu kesmesi gerekir. Bu bitler set olduktan sonra, mcu nun spi için yapacağı birşey yok. Gerisi spi modülünün işi. İki komut arası çok küçük bir zaman dilimi.. Madem böyle birşey yapacak, interruptlarını ve algoritmalarını bu olasılığı düşünerek kuracak.


Yada, eğer interruplar spi iletişimden daha önemli ise, spi ları yazılımsal olarak yapacak,

interrupt gelince, iletişim kısa bir sekteye uğrayıp, yine devam edecek.
Destiny of white is dirtied. Destiny of black is found guilty...

z

Garanti edemezin.

spi1 gönderbiti, set
Interrupt bu arada gelecek.
spi2 gönderbiti, set
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Müh. müh.

Alıntı yapılan: z - 14 Haziran 2014, 19:17:07
Garanti edemezin.

spi1 gönderbiti, set
Interrupt bu arada gelecek.
spi2 gönderbiti, set


İşte bende dedim ki,

iki asm komutu arası 1/mcu frekansı. Bu çok ama çok küçük bir değerdir dedim vede ayrıca ekledim. Eğer böyle birşey yapılacaksa, algoritma ona göre kurulacak. İnterruptlar ona göre tasarlanacak.

Ayrıca,

int. off
spi1 gönderbiti, set
spi2 gönderbiti, set
int. on

İki cycle yapar. İnterrputlar iki saykıllık kapansa da çok sorun olmayabilir.



Software yaparsada, asm kullansın. En yüksek hızda iletişimi ancak böyle yapabilir ama bu seferde interruptlar iletişimi keser.
Destiny of white is dirtied. Destiny of black is found guilty...

elektronart

interruptları dert etmenize gerek yok, bu işlem zaten bir interruptın içinde yapılıyor. Kullandığım işlemcide interrupt içinde interrupt çalıştırma özelliği de olmadığı için başka bir interruptın bunu bölmesi söz konusu değil.
Ama şöyle sorun olabilir diye düşünüyorum, SPI tx bufferına bir veri koyduğunuzda otomatik olarak çalışmaya başlıyor. Ben birince SPI tx bufferına veriyi koyduğumda o iletime başlayacak ve ben ikinciyi koyduğumda 1 belki daha fazla bit gitmiş olacak, bu da benim için sorun olacak. Neyse deneyince göreceğiz.
Açık Elektronik

Müh. müh.

Deneyin, olmazsa gönderim kısmını asm ile kodlayın.

Asm ile spi ya çok yakınlaşabilirsiniz ama geçemezsiniz. Hız yetersiz kalırsa, daha hızlı bir mcu ya geçin.

Destiny of white is dirtied. Destiny of black is found guilty...

elektronart

ve korkulan başa gelir.
void spi_send_byte(char spi_data){

	while (!(IFG2 & UCB0TXIFG));              // USCI_A0 TX buffer ready?
	UCB0TXBUF = spi_data;			// Load Data
	UCA0TXBUF = spi_data;
}

SPI'ı 8MHz ayarladığımda iki SPI arasında 0,5usec gecikme oluyor, A0SPI clock başladığında B0SPI 4 kez çalışmış oluyor,
tahmin edileceği üzere 4MHz de gecikme yine aynı 0,5usec, ve iki SPI arasında 2 CLK'luk fark oluyor.
işte görüntüler:



Açık Elektronik

berat23

böyle bir uygulama mcu ile mümkün değil,  fpga ile mümkün. anlamadığım konu niye böyle birşeye ihtiyaç olduğu?