Spi aracılığıyla bir atmega162'yi master ve bir atmega16a'yı slave olarak kullanarak assembly dilinde seri iletişim kurmaya çalışıyorum ama bir türlü başarılı olmadı. Kodu ekledim bana nerede hata yaptığımı söyleyebilir misiniz? Master'ın MOSI'si Slave'in MOSI'sine,Master'ın MISO'sU Slave'in MISO'suna, Master'ın SCK'yi Slave'in SCK'ine bağlı ve iki breadbord'daki groundlar birbirine bağlı. Slave'in SS pini Master'ın A.0 pinine bağlı.
Master
.include "m162def.inc"
.def SAYAC1 = R17
.def GECICI = R16
.def SAYAC2 = R18
.def temp = r20
.cseg
.org 0
ldi temp, low(RAMEND)
out SPL, temp
ldi temp, high(RAMEND)
out SPH, temp
LDI GECICI,0b11111111
OUT DDRA,GECICI
SPI_MasterInit:
; Set MOSI and SCK output, all others input
ldi temp, (0<<UMSEL0)
out UCSR0C, temp
ldi r17,(1<<DDB5)|(1<<DDB7)
out DDRB,r17
; Enable SPI, Master, set clock rate fck/4
ldi r17,(1<<SPE)|(1<<MSTR)|(0<<SPR0)|(0<<SPR1)|(1<<CPOL)|(1<<CPHA)
out SPCR,r17
ldi r18,0b11111010
SPI_MasterTransmit:
RCALL ZAMAN_GEC
LDI GECICI,0x00
OUT PORTA, GECICI
; Start transmission of data (r16)
out SPDR,r18
Wait_Transmit:
; Wait for transmission complete
sbis SPSR,SPIF
rjmp Wait_Transmit
in r23,SPDR
LDI GECICI,0x01
OUT PORTA, GECICI
rjmp SPI_MasterTransmit
ZAMAN_GEC:
LDI SAYAC2, 255
SAY2:
LDI SAYAC1, 255
SAY1:
DEC SAYAC1
NOP
NOP
BRNE SAY1
DEC SAYAC2
BRNE SAY2
RET
Slave:
.include "m16adef.inc"
.def SAYAC1 = R17
.def GECICI = R19
.def SAYAC2 = R18
.def temp = r20
.def dummy = r22
.cseg
.org 0
ldi temp, low(RAMEND)
out SPL, temp
ldi temp, high(RAMEND)
out SPH, temp
ldi GECICI,0b11111111
out DDRA,GECICI
ldi r22,0b11111010
SPI_SlaveInit:
; Set MISO output, all others input
ldi temp, (0<<UMSEL)
out UCSRC, temp
ldi r17,(1<<DDB6)
out DDRB,r17
; Enable SPI
ldi r17,(1<<SPE)|(1<<CPOL)|(1<<CPHA)
out SPCR,r17
ret
SPI_SlaveReceive:
; Wait for reception complete
sbis SPSR,SPIF
rjmp SPI_SlaveReceive
; Read received data and return
in r16,SPDR
rcall YAK
;CP r16,r22
;BRBS 1,YAK
rjmp SPI_SlaveReceive
YAK:
LDI GECICI,0xFF
OUT PORTA, GECICI
rcall ZAMAN_GEC
LDI GECICI,0x00
OUT PORTA, GECICI
;rjmp SPI_SlaveReceive
RET
ZAMAN_GEC:
LDI SAYAC2, 127
SAY2:
LDI SAYAC1, 255
SAY1:
DEC SAYAC1
BRNE SAY1
DEC SAYAC2
BRNE SAY2
RET
Merhaba.
Kodları [ c o d e] ile [/ c o d e ] etiketleri arasına almanız gerekir.
Kodlarınızı tag içene almanız önemli.
MOSI Master Output Slave Input Efendi Çıkışı Köle Girişi
MISO Master Input Slave Output Efendi Girişi Köle Çıkışı
(NOT: Alttaki 3 satırı yanlış yazmışım, en altta doğrusunu ekledim)
MASTER SLAVE
Yani MOSI MISO ya
MISO MOSI ye bağlanacak,
SCK SCK
ve en önemlisi
GND GND ye bağlanacak.
Doğrusu:
MASTER SLAVE
Yani MOSI MOSI ya
MISO MISO ya bağlanacak,
SCK SCK
ve en önemlisi
GND GND ye bağlanacak.
Ben önceden MicroBasic Pro ile spi iletişimi yaptım bir atmega162 ve atmega16a arasında. MicroBasic'le yazdığımda MOSI'Yİ MOSI'YE MISO'yu MISO'ya bağladım ve sorunsuz çalıştı. Evet groundlar bağlı ve SCK'ler de bağlı.
Tamam sorunu hallettim. Master olarak kullandığım atmega162'de sorun varmış. Onu yeni bir atmega162'yle değiştirdim. Ayrıca her iletinin başlamasından önce veriyi master'ın SPDR'ına yeniden yüklemem gerektiğini anladım. Şu anda SPI iletişim sorunsuz çalışıyor.
Alıntı yapılan: RaMu - 04 Ekim 2017, 20:43:03
MASTER SLAVE
Yani MOSI MISO ya
MISO MOSI ye bağlanacak,
SCK SCK
ve en önemlisi
GND GND ye bağlanacak.
Bu ifade de bir yanlışlık var. SPI haberleşmelerinde MOSI -> MOSI ve MISO -> MISO şeklinde bağlanır. Zaten bu ifadelerin de açılımını verdiğiniz üzre Master için çıkış, Slave için giriş olan pin aynı pin (Ya da tam tersi) olduğu için SPI'da, UART'da olduğu gibi çaprazlama yapılmaz.
@sitkitanseltunc@XX_CİHAN_XXDoğru söylüyorsunuz. Düzeltme için teşekkürler.
Merhaba,
Başka başlık açmadan SPI hakkında sorayım dedim.Master datayı yolladıktan sonra slave'in verilen datayı işlemesini anladım ama işlemi gerçekleştirdikten sonra mastere bilgi(data)yollaması gerekir mi? Yoksa programlayıcının isteğine mi kalmıştır.Profesyonel işlerde standart nedir?
Bu aralar spı ilgimi çekti yeni öğrenmekteyim.Teşekkürler.
https://www.youtube.com/watch?v=hBBW4KfuSg0
https://youtu.be/hBBW4KfuSg0
Alıntı yapılan: kudretuzuner - 05 Ekim 2017, 11:46:02
Merhaba,
Başka başlık açmadan SPI hakkında sorayım dedim.Master datayı yolladıktan sonra slave'in verilen datayı işlemesini anladım ama işlemi gerçekleştirdikten sonra mastere bilgi(data)yollaması gerekir mi? Yoksa programlayıcının isteğine mi kalmıştır.Profesyonel işlerde standart nedir?
Bu aralar spı ilgimi çekti yeni öğrenmekteyim.Teşekkürler.
I2C'deki ACK bilgisi gibi birşeyden mi bahsediyorsunuz tam anlamadım ama bunu kastediyorsanız böyle bir şey gerekmiyor. Burada işin espirisi master ve slave'in eş zamanlı olarak aynı clock sinyalinde birbirlerine veri iletebilmeleridir. Senkron veri iletimi söz konusudur. Veri sonunda herhangi bir ACK sinyali üretmek gerekmemektedir. I2C ye göre çok daha yalın bir protokoldür.
Burada iletişimin ne şekilde yürütüleceği size kalmış. Eğer yapılması gereken işlem kritik değilse arkasını aramaya gerek yoktur. Ama yapılması gereken işlem kritik bir öneme sahipse, o zaman slave 'den bir geri bildirim alınması gerekebilir.
Kaldı ki böyle bir haberleşmede çoğu kez birden fazla slave tarafından spi hattının paylaşılacağı anlamına gelir ki bu (slave aletlerden) her yapılan işlem için geri bildirim istemek sistemi yavaşlatacaktır. Hangi slave aletden geri bildirim isteyeceğiniz size kalmıştır. Örneğin bir led yandı bilgisini istemezsiniz, yada LED ekrana yazıldı bilgisini istemezsiniz. Ama bir flash üzerine yazılan bilginin onayına ihtiyaç duyabilirsiniz.
Merhaba,
spi haberleşmede mesafe nedir? RS485'in max mesafesi nedir? Teşekkürler.
RS-485 de sadece iki sinyal arasındaki
fark 200mV dan fazla olduğu sürece
mesafenin bir önemi yok. 100 metreden
bile uzun mesafelerle haberleşmek
mümkün olabilmektedir.
Harici gürültüden etkilenmesi çok
düşüktür.
Spi de harici gürültüler verileri etkileyecektir.
Uygun blendajli kablo ile sinyal
seviyeleri fazla düşmeden taşınabilir.
Ancak mesafenin 10 metrenin üzerine
çıkabileceğini sanmıyorum.
RS-485 in güzel yanı; gndler
birlestirilmedigi için farklı besleme
kaynakları kullanmak mümkün olmaktadır.
spi mesafe olarak birkaç 10 cm üzerinde önerilmez.