Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

SPI işlem sırası

Başlatan pcb, 01 Eylül 2011, 15:58:03

pcb

merhaba arkadaşlar

18F452 nin dahili SPI protokolünü kullanmaya çalışıyorum ancak default 8bit iletişim yapıyor, 5bit gönderme ve 12bit alma yapmak istiyorum, bu ayarı hangi register dan yapıyoruz ?

Tagli

Benim bildiğim kadarıyla böyle bir ayar yok. Mecburen 8 bit gönderip 16 bit alacaksın. İşine yaramayan bitleri maskelersin. Kendi işini görecek şekilde bir protokol oluşturman gerekebilir.
Gökçe Tağlıoğlu

pcb

proton da aşağıdaki kodda ki gibi 6bit gönderebiliyoruz ama hız ayarı yapmak mümkün değil, hız ayarı için işlemcinin dahili SPI pinleri kullanılmalı bu seferde 6bit gönderemiyoruz

SHOut   DTA ,   CLK ,   msbfirst_h   ,   [%000000\6]

-Hasan-

Tagli Hocamızın dediği gibi donanımsal SPI ' da böyle bir şey yok.

pcb arkadaşım "SHout" yazılımsal SPI komutudur, hız ayarı yapamazsın ama yazılımsal SPI ' da hız ayarı yapılmaz diye bir şey de yok. ASM bilginiz var ise ASM ile bu işi çözebilirsiniz.

Tagli

pcb, Proton'da o şekilde gönderebilmenin sebebi senin de bahsettiğin gibi olayı tamamen yazılımsal olarak yapması. Yani derleyici, standart dışı bir kullanıma izin veriyor. Ancak donanımda bu esneklik yok.

Yine de, bence fazladan birkaç bit gitmesinin sorun yaratmaması gerekiyor. Ancak, 16 bit, yani 2 byte alman gereken durumda, aldığın iki byte'ın sıralarını karıştırmamak önemli. Örneğin bir hatadan dolayı, yollayan tarafın ilk byte'ını kaçırıp ikinciyi yakalarsan, ve bunu ilk byte olarak değerlendirirsen sorun çıkar. Ben olsam bu iki byte'ı büyük bir özenle doldurup, birer bitlerini sıra biti yapardım. Alıcı tarafında da bunu kontrol ederek işlem yapardım. Bazı durumlarda bu da yeterli olmayabilir, ama ilk denenmesi gereken şey bu bence.
Gökçe Tağlıoğlu

pcb

#5
haberleşilmek istenilen bir adc, 6 clock dan sonraki 2. clock da  veriyi göndermeye başlıyor yani 6. bitten sonraki 2. bit MSB15.

Asm bilgim yok ne yazık ki.

adc nin sample aldığı ilk 6 clock kısmını manuel veri alış kısmını ise spi ile yapmaya çalışayım o zaman.

Tagli

Bahsettiğin ADC'nin modelini yazarsan bir datasheet'ine bakayım. Belki aklıma bir yöntem gelir. Bu tür şeyleri genelde standartlara uyacak şekilde üretirler çünkü.
Gökçe Tağlıoğlu

pcb


pcb

#8
datasheet te şöyle bir bilgi daha var, ilk gönderilen veriyi aldıktan sonra(16bit) CS low da kalırsa 16bit veri tekrar LBS başta olmak üzere tekrar gönderilir.
ilk seferde tam okunamayan veri için, belki spi protokolü olan 8bit e uygun olmayan adc yaptıkları ve ilk bit MSB15  kaçırılacağı içindir.

ama buda iletişim süresini 2 katına çıkarır

Tagli

Anladığım kadarıyla, SPI modülünü uygun şekilde ve hızda master modunda ayarlayıp CS hattını 0 yaptıktan sonra arka arkaya 3 byte okuman gerekiyor. Okuduğun ilk 6 bit ve son 2 bit çöp niteliğinde olacağından maskelenmesi gerekiyor. Bunu değişik şekillerde yapabilirsin, ama sanırım 3 byte'ı bir bütün olarak düşünüp hep beraber 6 kez sola kaydırmak en iyi yöntem olacaktır. Sonra sadece büyük 2 byte'ı değerlendireceksin. 3 byte'ı aldıktan sonra CS hattını 1 yapmayı da unutmamak lazım tabi.

Donanımsal SPI ile deneyimim olmadığından bu konuda kesin konuşmam zor. Ancak datasheetten anladığım kadarıyla, başta yapman gereken bazı ayarlar var. Bu modülü kontrol eden register'ları gözden geçirmeni öneririm.

Proton'un kendi kütüphanesinde bu ayarları yapmanı ve modülü kullanmanı kolaylaştıracak fonksiyonlar vardır mutlaka.
Gökçe Tağlıoğlu

pcb

#10
arkadaşlar donanımsal SPI işlem sırası tam olarak nasıl acaba ? aşağıda kendi anladığım kadarı ile kod u ekliyorum. ilave veya düzeltmelere açığın herzaman.

;-------------SSPxSTAT-------------------------------------------------------
Symbol  BF = SSP2STAT.0         '0 = Receive not complete, SSPxBUF is empty
Symbol  CKE = SSP2STAT.6        '0 = Transmit occurs on transition from Idle to active clock state      
Symbol  SAMPLE = SSP2STAT.7     '0 = Input data sampled at middle of data output time
BF = 0
CKE = 0
SAMPLE = 0
;-------------SSPxCON1-------------------------------------------------------
SSP2CON1.0 = 0                  '0010 = SPI Master mode, clock = FOSC/64
SSP2CON1.1 = 1
SSP2CON1.2 = 0
SSP2CON1.3 = 0  

Symbol  CKP = SSP2CON1.4        'Clock Polarity Select bit
Symbol  SSP2EN = SSP2CON1.5     'Synchronous Serial Port Enable bit
Symbol  SSP2OV = SSP2CON1.6     'Receive Overflow Indicator bit(1)   
Symbol  WCOL = SSP2CON1.7       'Write Collision Detect bit

CKP = 1
SSP2EN = 0
SSP2OV = 0
WCOL = 0 
;-------------SSPxCON3-------------------------------------------------------
Symbol  BOEN = SSP2CON3.4       'Buffer Overwrite Enable bit

BOEN = 1
           
           
            Low CS
            SSP2BUF = %000000     'SSP2BUF ADC nin sample alabilmesi için clock gönderiliyor
            While   BF = 0  :Wend    'sample aldıktan sonra BF nin 1 olması bekleniyor
            OKUMA = SSP2BUF        'SSP2BUF a yüklenen değer okumaya aktarılıyor
            BF = 0                            'BF temizleniyor
            High    CS

-Hasan-

Registerlerin başında hep "SSP2" (SSP2CON1, SSP2STAT, SSP2BUF) var. Sadece SSP olması gerekiyor (SSPCON1, SSPBUF, SSPSTAT). SSP2 olması için, ikinci bir MSSP modülünün olması gerekiyor. 18F452 ' de yok. Bu kodu nereden aldınız?

pcb

işlemciyi 18F46K22 ile değiştirdim, 2 adet SPI var, 2. sini kullanıyorum bu sebepten SSP2

işlemci değiştirdiğimi eklemeyi unutmuşum kusura bakmayın

-Hasan-

Tagli ' nin dediği gibi 3 byte okuma yapacaksınız. Gelen byte ' larda:

1. Byte ' ın 1. ve 0. bitleri, 16 bitlik datanın 15. ve 14. bitleri olacak.
2. Byte, 16 bitlik datanın 13. -- 6. bitleri olacak.
3. Byte ' ın 7. -- 2. bitleri, 16 bitlik datanın 5. -- 0. bitleri olacak.

BF=0


Bir de SSPSTAT ' ın 0. biti olan BF ' yi sıfırlamanıza gerek yoktur. Kendisi otomatik olarak sıfırlar, zaten BF bitine yazma yapılamaz çünkü sadece okunabilen (yazılamayan) bittir. Bu yüzden BF=0 demenin bir manası yok.

Bakınız Datasheet Sayfa 255

SSP1 veya SSP2 ' yi hangi modülü kullanmak istiyorsanız o şekilde ayarlayın.

pcb

peki SPI döngü kısmı böyle mi yapılıyor ? BF düzeltildiği taktirde