CCS C ile spi haberleşme(ADS1261)

Başlatan samedkutuk, 22 Şubat 2020, 18:52:09

samedkutuk

Arkadaşlar merhabalar  öncelikle herkese iyi çalışmalar dilerim :)
Proje olarak 24 bitlik TI nin ADS1261 entegresi ile ağırlık ölçümü yağmak niyetindeyim
Projem bittiğinde de geliştirmek isteyenler için buraya paylaşacağım inşallah :)
Şimdi Pic 18f serisi bir pic ile Bu entegreyi haberleştirmek istiyorum.
Entegreyi gerekli bağlantılarını yaparak bir devre üzerine yerleştirdim ve sağlam yaptığımı düşünüyorum ölçümlerim ile bunu sağladım.
CCS C fonksiyonları ile Spı da veri okuma ve veri yazma nasıl yapılıyor daha önce yapmıştım.
Sormak istediğim sorular;
Örneğin Bu entegrenin 0x12 Registerini okumak istiyorum bunu ccs c fonksiyonları ile nasıl yapabilirim.
Bunun  için önce cihaz adresi tanımlamam gerekmez mi ?
bir de datasheet de bir okuma diyagramı verilmiş bunu nasıl uygularım fikir verirseniz çok sevinirim
herkese iyi çalışmalar dilerim.








samedkutuk

devrecii

#1
Spi aynı anda read write  yapan fonkiyon olması lazım, bunu kullnmalısın

cs pini 1 iken 0 yapıyorsun
Spi read write fonksiyonu ile bir byte (20H+regadres) gönderiyorsun çipten  cevap olarak FFH geliyor.
Spi read write fonksiyonu ile bir byte (herhangi sayı) gönderiyorsun çipten cevap olarak (20H+regadres) geliyor.
Spi read write fonksiyonu ile bir byte (0) gönderiyorsun çipten cevap olarak registerdeki sayı geliyor.
cs pinini tekrar 1 yapmak zorundasın.

DRY pini adc okuma bittiğinde bir pals üretiyor bu palsı dilersen inteerupt olarak kullanabilrisin aynı zamanda çipin adc çalışıp işlem yaptığını anlayablirsin , verdiğin diagramda  çipin ilk açışta konrol edilmesi setup edilmesi var.

DRY pini plas üretiyorsa  adc değerini okumak için

cs pini 1 iken 0 yapıyorsun
Spi read write fonksiyonu ile bir byte (12H) gönderiyorsun çipten  cevap olarak FFH geliyor.
Spi read write fonksiyonu ile bir byte (herhangi sayı) gönderiyorsun çipten cevap olarak (12H) geliyor.
Spi read write fonksiyonu ile bir byte (0) gönderiyorsun çipten cevap olarak adc 24bit değernin son 8 biti.
Spi read write fonksiyonu ile bir byte (0) gönderiyorsun çipten cevap olarak adc 24bit değernin son 8 biti.
Spi read write fonksiyonu ile bir byte (0) gönderiyorsun çipten cevap olarak adc 24bit değernin ilk 8 biti.
cs pinini tekrar 1 yapmak zorundasın.

crc konrolu veri akışı aktifmi pasifmi bakmak ona göre bilgileri alman gerekir taminimce cpu ilk enerji verildiğinde pasifdir.
dry pini pals veriyormu buna bakman lazım tahminimce çip default hazırdır değilde setup yapmalısın diagrama göre

samedkutuk

@devrecii Hocam merhabalar yanıtınız teşekkür ederim.
SPIread write (20H+register)
burayı anlayamadım neden 20H göndeeriyorum ?

Alıntı yapılan: devrecii - 23 Şubat 2020, 14:50:58Spi aynı anda read write  yapan fonkiyon olması lazım, bunu kullnmalısın

cs pini 1 iken 0 yapıyorsun
Spi read write fonksiyonu ile bir byte (20H+regadres) gönderiyorsun çipten  cevap olarak FFH geliyor.
Spi read write fonksiyonu ile bir byte (herhangi sayı) gönderiyorsun çipten cevap olarak (20H+regadres) geliyor.
Spi read write fonksiyonu ile bir byte (0) gönderiyorsun çipten cevap olarak registerdeki sayı geliyor.
cs pinini tekrar 1 yapmak zorundasın.

DRY pini adc okuma bittiğinde bir pals üretiyor bu palsı dilersen inteerupt olarak kullanabilrisin aynı zamanda çipin adc çalışıp işlem yaptığını anlayablirsin , verdiğin diagramda  çipin ilk açışta konrol edilmesi setup edilmesi var.

DRY pini plas üretiyorsa  adc değerini okumak için

cs pini 1 iken 0 yapıyorsun
Spi read write fonksiyonu ile bir byte (12H) gönderiyorsun çipten  cevap olarak FFH geliyor.
Spi read write fonksiyonu ile bir byte (herhangi sayı) gönderiyorsun çipten cevap olarak (12H) geliyor.
Spi read write fonksiyonu ile bir byte (0) gönderiyorsun çipten cevap olarak adc 24bit değernin son 8 biti.
Spi read write fonksiyonu ile bir byte (0) gönderiyorsun çipten cevap olarak adc 24bit değernin son 8 biti.
Spi read write fonksiyonu ile bir byte (0) gönderiyorsun çipten cevap olarak adc 24bit değernin ilk 8 biti.
cs pinini tekrar 1 yapmak zorundasın.

crc konrolu veri akışı aktifmi pasifmi bakmak ona göre bilgileri alman gerekir taminimce cpu ilk enerji verildiğinde pasifdir.
dry pini pals veriyormu buna bakman lazım tahminimce çip default hazırdır değilde setup yapmalısın diagrama göre
samedkutuk

devrecii

Dostum çipi üretenler öyle üretmiş (0x20 + adres) gönderirsen  çip regiteri okuma yaptığını anlıyor ,  (0x40+adres) gönderirsen çip  registere yazma yaptığını anlıyor, read/write pininden kurtulmuş oluyor yoksa bazı çiplerde bu pin var.

Yani bu spi haberleşmesi kuralı değil çipi üretenler böyle üretmiş.

samedkutuk

Alıntı yapılan: devrecii - 26 Şubat 2020, 14:12:55Dostum çipi üretenler öyle üretmiş (0x20 + adres) gönderirsen  çip regiteri okuma yaptığını anlıyor ,  (0x40+adres) gönderirsen çip  registere yazma yaptığını anlıyor, read/write pininden kurtulmuş oluyor yoksa bazı çiplerde bu pin var.

Yani bu spi haberleşmesi kuralı değil çipi üretenler böyle üretmiş.

Anladım hocam çok teşekkür ederim datasheeti okumaktan bir hal oldum ama o kısmını sizin yazdıklarınızla da birleştirince bişeyler çıktı ortaya
1-Cs Pin i ni 0 dan 1 e çekiyorum
2-Sonra 12H göndereceğim fakat entegre bunun veri mi adres mi olduğunu nasıl anlayacak(Yani ben 0x04 adresine 0x15 yazmak istersem nasıl yazacağım bir türlü oturtamadım o kısmı) ?
3- Aynı şekilde ben 0x03 adresini okumak için örneğin Spi_xfer(0x23); mü yazmam gerekiyor?
4-Ve 24- bit i mantıksal olarak nasıl okuyacağımı da anlayamadım :(

samedkutuk

samedkutuk

@devrecii  hocam bir de ccs c de
result = spi_xfer(data)

result = spi_xfer(stream, data)

result = spi_xfer(stream, data, bits)
Şu şekilde bir kullanım var
Stream dediği SPI1 mi SPI2 mi o sanırım
birde data kısmından adres veya veri gönderebiliyoruz
samedkutuk

devrecii

Yine çiple alakalı 12h gönderdiğin zaman adc bufferi okumak istediğini anlıyor çip ve sana 24biti 8 8 8 parça olarak gönderiyor ilk mesajımda var , bir de unutma bu çipde 1 adc var ve 1 tane adc sonucunun yazıldığı 24bit buffer var yani her giriş için ayrı register yok, registerler çipn hangi girişi hızı stup  vsvs ayarlamak için var.

result = spi_xfer(data)  eğer result çipten gelen veri ise doğrudur bu fonksiyon.


Aynı şekilde ben 0x03 adresini okumak için örneğin Spi_xfer(0x23);  bir seferde olmuyor ilk mesajımda var

cs pini 1 iken 0 yapıyorsun
result=Spi_xfer(0x23); 
///result ff olmalı kontrol amaçlı
result=Spi_xfer(0); 
///result 0x23 olmalı kontrol amaçlı
result=Spi_xfer(0); 
///result 3 nolu registerin değeri

cs pinini tekrar 1 yapmak zorundasın.

devrecii

Soru sorarken pdf dosyası linkini de paylaşırsan daha fazla kişiden cevap alabilirsin , kimse google gireyimde pdf bulayım diye uğraşmaz bu sitede  :)

samedkutuk

Alıntı yapılan: devrecii - 26 Şubat 2020, 16:25:55Yine çiple alakalı 12h gönderdiğin zaman adc bufferi okumak istediğini anlıyor çip ve sana 24biti 8 8 8 parça olarak gönderiyor ilk mesajımda var , bir de unutma bu çipde 1 adc var ve 1 tane adc sonucunun yazıldığı 24bit buffer var yani her giriş için ayrı register yok, registerler çipn hangi girişi hızı stup  vsvs ayarlamak için var.

result = spi_xfer(data)  eğer result çipten gelen veri ise doğrudur bu fonksiyon.


Aynı şekilde ben 0x03 adresini okumak için örneğin Spi_xfer(0x23);  bir seferde olmuyor ilk mesajımda var

cs pini 1 iken 0 yapıyorsun
result=Spi_xfer(0x23); 
///result ff olmalı kontrol amaçlı
result=Spi_xfer(0); 
///result 0x23 olmalı kontrol amaçlı
result=Spi_xfer(0); 
///result 3 nolu registerin değeri

cs pinini tekrar 1 yapmak zorundasın.

Hocam teşekkür ederim bu şekilde yaptığımda 32 bit result değişkeni tanımlamış olsam adc değerimi almış mı oluyorum yoksa 8 8 8 şeklinde 3 biti sıralı nasıl alacağım
datasheetlink;
[url]https://dosyayukle.club/fzc/ads1261.pdf[/url]
samedkutuk

devrecii

Yok öyle değil şu şekilde

DRY pini plas üretiyorsa  adc değerini okumak için

int32 adcdeger=0;

cs pini 1 iken 0 yapıyorsun
result=Spi_xfer(0x12);
///result ff olmalı kontrol amaçlı
result=Spi_xfer(0);
///result 00x12 olmalı kontrol amaçlı
adcdeger=Spi_xfer(0);
adcdeger<<=8;   
adcdeger+=Spi_xfer(0);
adcdeger<<=8;
adcdeger+=Spi_xfer(0);



cs pinini tekrar 1 yapmak zorundasın.

samedkutuk

Alıntı yapılan: devrecii - 26 Şubat 2020, 17:06:39Yok öyle değil şu şekilde

DRY pini plas üretiyorsa  adc değerini okumak için

int32 adcdeger=0;

cs pini 1 iken 0 yapıyorsun
result=Spi_xfer(0x12);
///result ff olmalı kontrol amaçlı
result=Spi_xfer(0);
///result 00x12 olmalı kontrol amaçlı
adcdeger=Spi_xfer(0);
adcdeger<<=8;   
adcdeger+=Spi_xfer(0);
adcdeger<<=8;
adcdeger+=Spi_xfer(0);



cs pinini tekrar 1 yapmak zorundasın.
@devrecii  hocam teşekkür ederim dediğiniz şekilde deneyeceğim bir de osiloskop ile kontrol edeyim spi hattının bilgi akışını
samedkutuk