SPI iletişimde gönderilen ve çalışan data ile bit sorunu

Başlatan dyonizos, 12 Haziran 2016, 13:33:15

dyonizos

Selamlar linkte datasheeti bulunan malzemede SPI ile aşağıdaki şekilde işlem yaptırabiliyorum.

http://www.datasheet-pdf.com/datasheet-download.php?id=785220

Bulduğum bir arduino kaynaktan yararlanarak kendi yazdığım komut. Ancak Datasheet SPI bölümündeki data formatı ile benim gönderdiğim arasındaki bağlantıyı çözemedim.
Şöyle
Dökümanda toplam 25bit data göndermeniz gerekiyor diyor. Bu data

4 Bit Adres , 1 Bit RW biti ve 20 Bit Data biti şeklinde

Benim gönderdiğim ve çalışan komut

 SHOut spiDataPin, spiClockPin,LsbFirst, [%10001\5,$0x2A05 \ 16,%0000\4 ] 


Ancak datasheet de bu komut için Adres biti 0x01 verilmiş ve gönderdiğim datada datasheette örnek verilen  02A05H ( 0x2A05 )
Madem 20bit data istiyorlar neden örnekte 16bit data verilmiş. Biz bu nedenlemi sonuna 4bit 0 ekliyoruz.
2A05 16 Bit 0x2A05 24Bit bu fark nedir. Ben 0x2A05 gönderiyorum ve sonuna 4 bit 0 ekliyorum çalışıyor.
Ayrıca başta gönderilmesi gereken 0x01 adres biti ve RW biti nasıl 10001 olabiliyor.
Terstenmi okumamız gerekiyor.

Yani anlıycağınız benim kafam iyice karıştı.
Benim gönderdiğim datanın bu datasheetdeki örneğe göre nasıl çaıştığını bana açıklayabilirmisiniz.

Teşekkürler

ete

Verilen komut satırı toplamda 25 bit data göndermektedir. /5 şeklindeki ifade o bilginin yalnızca 5 bitinin yollanmasını sağlıyor.
Komut satırında LSB first parametresi kullanıldığı için de %10001 ifadesine ilk bit olan 1 bilgisi en önce gönderilmektedir.
2A05 bir Hex formatlı sayıdır. Bu sayının gösterilişi aslında $2A05 şeklinde olmalıdır. Asm de 0x2A05 şeklinde de hex formatı gösterilmektedir. Ama $0x2A05 şeklinde ilk defa görüyorumki bu bana kalırsa yanlış.
Madem 4 adres biti bir adet R/W biti var bu durumda A0 - A1 -A2 -A3 - R/W - Data bitleri 0-19 arasında yerleşmeli. Şekil bu.
Bu durumda sen ADres olarak 8 ve R/W biti olarak 1 yollamış oluyorsun. Bu 1 nolu adres değil hiç bir zaman.
1 nolu adres için %00011 bilgi verilmeli bana kalırsa.

Ete


dyonizos

Evet haklısınız,
Datasheette 8 görünüyor adres biti. Ancak bu kısımda bir tuhaflık yokmu?
Yani 8 değeri Address 0x00 yazan kısımda yazılmış ve bu bölümde gönderdiğim data
SHOut spiDataPin, spiClockPin,LsbFirst, [%0001000000000000\16,%000000000\9 ]

Bu durumda buradaki kod ile Address olarak 1 ve RW biti olarak 0 göndermiş olmuyormuyuz. Burada 8 nerede ben bulamadım.

Yani çalışan kodda sırayla önce
SHOut spiDataPin, spiClockPin,LsbFirst, [%0001000000000000\16,%000000000\9 ]

sonra
SHOut spiDataPin, spiClockPin,LsbFirst, [%10001\5,$2A05 \ 16,%0000\4 ] 

gönderiliyor ve sorunsuz çalışıyor.

Peki alttaki fotoğrafta (datasheetin bir sayfasının goruntusu) Address 0x00 ve Address 0x01 olarak yazan ibareler neyi kastediyor. Ben bunları adres bilgisi olarak düşünmüştüm.
Bu arada dediğiniz gibi $0x2A05 i $2A05 değiştirdim kod yine çalışıyor. Sanırım ben \16 eklediğim için 0x2A05 24 bit olsa da sadece 16 biti gönderdiği için sorunsuz çalışıyordu.


ete

%1000 bilgisi desimal 8 dir. Sonda yer 1 biti de r/w bitidir.
Sonuçta %10001 şeklindeki bilgi %1000 %1 şeklinde yollanıyor.
Ete

Hattuşa

slm ete hocam; bir arkadaşıma projesinde yardımcı olmak adına MCP4812 (dual 10 bit DAC) aldırdım.amacım başka bir kanaldan okuduğum 10 bitlik ADC yi bu DAC entegresi ile çıkışa vermek,  DAC ın datasheetinde 16 bitlik data içerisinde 15. bit iki dacları seçmek,13. bit GA (kazanc seçim biti), D9 yani 9. bitten sonraki ise dataları temsil etmekte. benim anlamadığım ise word tipi bir değişkenimde 15. ve 13. bitleri sabit 9. bitten itibarende adc den okuyacağım değerleri içerecek şekilde nasıl yazmalıyım?  yada bir yerde mantık hatası mı yapıyorum. veriyi yollarken 2 byte olarak vereceğimi biliyorum.

misal elimde 512 adc değeri var, bu değeri 1. dac çıkışında GA=0 iken nasıl formulüze etmeliyim? bu işlem 1 kez olacak olsa sıkıntı yok bi şekilde yollayacağım datayı configre ederim. ancak sonsuz döngüde okunan adc kadar DAC a çıkış verdirilecek, kopma noktası burda başlıyor

saygılarımla....

ete

Verdiğin resme bakılırsa;
DAC datası 10 bitlik data olacak. Bunu 2 bit sola kaydıracaksın. Çünki başında XX şeklinde iki bitlik dikkate alınmayacak bit mevcut.
BILGI=BILG<<2
Bu aşamadan sonra önce A ve B yi seçmen gerek.
BILGI.15=0  (veya BILGI.15=1) şeklinde yapıyorsun
Daha sonra GA seçimi yapıyorsun.
BILGI.13=0 veya BILGI.13=1 şeklinde birini seçip yapıyorsun.
Birde SHDN biti var ne işe yarıyor bilmiyorum. Onuda seçmek gerekiyor ise BILGI.12=0 veya BILGI.12=1 şeklinde seçebilirsin. Sonrasında bu bilgiyi SPI yolu ile vermek yeterli olacaktır.
Dikkat etmen gereken diğer bir nokta da MSB_First yollama yapıldığı dır. Önce MSB bitleri sonra LSB bitleri yollanıyor.

Ete

Hattuşa

Alıntı YapBILGI.13=0

hocam ben neden düşünemedim  :D :D :D

teşekkür ederim

ete


Powered by EzPortal