PIC18F25K50 ile SPI haberleşme sorunu

Başlatan istinaf duvarı, 27 Mart 2024, 10:37:17

istinaf duvarı

PIC18F25K50 ile SPI haberleşmesi yaptıramıyorum. Pull-Up'lar kapalı. SPI modülü init edilmeden önce ilgili pinler 0 datası latch edilerek temizlendi. Ancak boşta iken SPI pinlerinde 5V görüyorum. Normalde 0V olması lazım. İletim yapmaya çalıştığımda SCK hattında 2.5 3V civarı bir voltaj okumam gerekirken 5V okuyorum. Aynı şekilde SDO ve SDI hatlarındaki voltajların data iletimi nedeniyle süreki dalgalanması gerekirken sabit 5V olarak kalıyor. Hiç bir şekilde iletim olmuyor. Çok baş belası bir sorun. FOSC 48MHz, SPI saat hızı FOSC/64 = 750KHz

    // ------
    // Port B
    // ------

#define tris_SDI            TRISBbits.TRISB0    
#define SDI                 LATBbits.LATB0
#define SDI_pin              PORTBbits.RB0

#define tris_SCK            TRISBbits.TRISB1    
#define SCK                 LATBbits.LATB1
#define SCK_pin              PORTBbits.RB1

    // ------
    // Port C
    // ------


#define tris_CS        TRISCbits.TRISC6    
#define CS             LATCbits.LATC6

#define tris_SDO        TRISCbits.TRISC7 
#define SDO           LATCbits.LATC7
#define SDO_pin        PORTCbits.RC7

ANSELB = 0x00;               // set all port B pins to digital
WPUB = 0x0C;                  //enable weak pull-ups except B0 abd B1

CS = 1;
    SCK = 0;
    SDI = 0;
    SDO = 0;
    SSP1CON2 = 0;
    SSP1STAT = 0x00;                 // SPI master, Input data sampled at middle of data output time,Transmit occurs on transition from Idle to active clock state 
    SSP1CON1 = 0x22;                 // SSP enabled, SPI master mode, FOSC/64      
    
    Delay10KTCYx(6);    // wait 5ms for init.

/******************************************************************************
* Function         unsigned char spi_read()
*                  Read one byte from SPI bus
*******************************************************************************/
unsigned char spi_read()
{
SSP1BUF = 0x00;
while(!SSP1STATbits.BF);
return(SSP1BUF);
}

/******************************************************************************
* Function         void spi_read(unsigned char i)
*                  Send one byte to SPI bus
*******************************************************************************/
void spi_write(unsigned char i)
{
unsigned char flush;
SSP1BUF = i;
while(!SSP1STATbits.BF);
flush = SSP1BUF
}

fide

#1
https://www.hepsiburada.com/barry-century-kingst-la1010-100m16kanal-usb-logic-analyzer-p-HBCV000006JXTY?magaza=direnc

Bu biraz tuzlu kaçabilir. 8 kanal ve bu ürünün 1/10 fiyatlı klonları da var ama sizin çözümünüz lojik analyzer.
Bu cihaz yoksa iş samanlıkta iğne aramaktan beter hale gelir.

Bu da ucuz olanı.
https://www.robotistan.com/usb-lojik-analizor-24-mhz-8-kanal?language=tr&h=ea3f70f9&gad_source=4&gclid=Cj0KCQjwzZmwBhD8ARIsAH4v1gUHZkDUlMyksLDERpXfV9Ao3ToMs_t66L_si5YRu0rzFPZadY-cXzUaAtL8EALw_wcB
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

alikeskinkilic

#2
diğer modüllerle ortak kullanılan pinlerde olur öyle şeyler o pinlerin hangi modüllerle ilişkilendirildiğine bakın genellikle bu tarz sorunlara ADC veya  Comparetor modülleri neden olur ANSEL registerler fabrika çıkışı açık olur kullanmadıklarınızı kapatın 0 vererek siz bir kontrol edin varsa diğer modülleri de kapatın çalışır
Hep meraktan

alikeskinkilic

şimi bakabildim datasına da sdo nun pin atamaları CONFIG3H yapılıyor birde ona bakın
Hep meraktan

istinaf duvarı

#4
Alıntı yapılan: alikeskinkilic - 30 Mart 2024, 10:49:11şimi bakabildim datasına da sdo nun pin atamaları CONFIG3H yapılıyor birde ona bakın

Baktım. C7 olarak ayarlı hocam.
Ama fide beyin dediği gibi bu iş lojik analizör olmadan olmayacak gibi.

alikeskinkilic

Lojik analizörün işe yaraması için ilk önce haberleşmeyi başlatabilmen lazım ki akan veriyi okuyasın sorun başlatamamış olman değilmi ben mi yanlış anladım.
Hep meraktan

alikeskinkilic

Alıntı yapılan: istinaf duvarı - 30 Mart 2024, 16:11:16Baktım. C7 olarak ayarlı hocam.

sdo2 yi seçmişsin ama Anselb yi temizlemişsin bak ama C7 analog olarak duruyor.biraz kurcala bilgi sayfalarını bulursun kesin sorunun nerde olduğunu
Hep meraktan

istinaf duvarı

Alıntı yapılan: alikeskinkilic - 30 Mart 2024, 17:34:54sdo2 yi seçmişsin ama Anselb yi temizlemişsin bak ama C7 analog olarak duruyor.biraz kurcala bilgi sayfalarını bulursun kesin sorunun nerde olduğunu

Kodları kontrol ettim. Daha öncesinde C portu dijital yapılmıştı zaten. Kodun yukarıdaki satırlarında ANSELC=0x00 ifadesi yer alıyor.

mr.engineer

MPLAB MCC den bir kod üretip onu deneyin. SPI ile haberleşeceğiniz IC'de bir status register gibi bir şey vardır. Sabit bir cevap verir. Önce onu okumayı deneyin

istinaf duvarı

#9
Alıntı yapılan: mr.engineer - 30 Mart 2024, 22:00:03MPLAB MCC den bir kod üretip onu deneyin. SPI ile haberleşeceğiniz IC'de bir status register gibi bir şey vardır. Sabit bir cevap verir. Önce onu okumayı deneyin
Teşekkürler.
Maalesef bunu yapma şansım yok. Üzerinde modifikasyon yapmak istediğim kod Legacy MPLAB IDE ile yazılmış. Bunda MCC olayı yok. Her şeyi en low levelinden elle ayarlıyorsun.

Önceki operasyonlardan kalan statik voltajları temizlemek için 0x00 latch ettiğim portlarda normalde voltaj çıkmaması gerekirken voltaj çıkıyor. Sadece B portunda dahili pull-up var. Onu da B0 ve B1 pinleri için kapadım. C portunda zaten pull-up yok. Ama boşta iken 0 yerine 5V çıkıyor.

alikeskinkilic

Alıntı yapılan: istinaf duvarı - 30 Mart 2024, 18:56:36Kodları kontrol ettim. Daha öncesinde C portu dijital yapılmıştı zaten. Kodun yukarıdaki satırlarında ANSELC=0x00 ifadesi yer alıyor.
eğer paylaşmadığın kısımda ise bilemem ama paylaştığın kısımda anselb temizlenmiş durumda.
ayrıca spi pinleri illede boşta 0 verecek diye bir kaide yok spi modlarından yüksekte başlama seçili olabilir.bence bilgi sayfalarında çözümünüz.ASM için iletişim bittimi diye kontrol etmek gerekli C için öylemi bilmiyorum  buffere göndereceğimiz veriyi attıktan sonra PIR1 sspif bayrağı döngüye sokulup kalktımı diye kontrol edilir kalktı ise iletişim bitmiş anlamına gelir indiririz bayrağı yola devam ederiz.

aynı işi denemedim ama sspstat bf pini ile de yapabilirsiniz sanırım ama SMP biti 1 olmalı yanılmıyorsam  alttaki kodda amacınız örnekleme bitene kadar beklemek sanırım
while(!SSP1STATbits.BF); şu while komutuna bir alışamadım bit 0 ise bekle mi demek yoksa 0 ise devam et mi demek 0 ise devam et demek ise yanlış bir olduğunda gelen data alınmış oluyor bence sspıf bayrağı ile deneyin birde .SPI MODE WAVEFORM (MASTER MODE) şu şemayı inceleyin birde iletişim kurmak istediğiniz donanım hangi modu destekliyor ise ayarını öyle yapın genellikle o karışır.kolay gelsin


Hep meraktan

istinaf duvarı

#11
Alıntı yapılan: alikeskinkilic - 31 Mart 2024, 03:01:15aynı işi denemedim ama sspstat bf pini ile de yapabilirsiniz sanırım ama SMP biti 1 olmalı yanılmıyorsam  alttaki kodda amacınız örnekleme bitene kadar beklemek sanırım
while(!SSP1STATbits.BF); şu while komutuna bir alışamadım bit 0 ise bekle mi demek yoksa 0 ise devam et mi demek 0 ise devam et demek ise yanlış bir olduğunda gelen data alınmış oluyor bence sspıf bayrağı ile deneyin birde .SPI MODE WAVEFORM (MASTER MODE) şu şemayı inceleyin birde iletişim kurmak istediğiniz donanım hangi modu destekliyor ise ayarını öyle yapın genellikle o karışır.kolay gelsin.




Içerideki değer doğru ise oldugun yerde bekle. Yanlış işe devam et. While'ın bu kullanımı bu şekilde. Burada BF biti 0 ise sonraki satıra geçmeden while satırında bekle, BF biti 1 olduğunda devam et anlamına geliyor. Kodun çalışan kısımlarında bir sürü uygulaması var, hatalı bir kullanım değil. Ama alıştığımız tarz bir kullanım şekli olmadığı için kafa karıştırıyor evet. İnsanlara while'ı hep şu şekil öğrettiler, tek satırlık while'ları öğretmediler:
while(koşul)
{
Yapılacaklar
}

SSPIF ile BF biti temel olarak aynı işi yapıyor. SSPIF biti kesme uretirken, BF biti kesme üretmez. Benim kullanımımda arka plan haberleşmesi yok. Okuma komutu gönderilecek, hemen ardından okuma fonksiyonuna gecilip veri okunacak. Kesmelik bir şey yok.
SSPIF bitini her kullanımdan önce (her ihtimale karşı) ve okuma/yazmadan sonra temizlemek gerekirken, BF biti SSPUF'daki veriyi okuyunca kendiliğinden sıfırlanır. Zaten datasheette de SSPIF bayragini kullanmak istiyorsanız öncesinde temizlememiz lazım diyor. SSPIF bayrağının birde kalmasi iletişime engel değil. Datasheet böyle diyor. Ben daha pratik olduğu için BF bitini tercih ettim.

SPI'i Mod0'a göre ayarladım. Bu modda başta iken data ve saat pinleri lojik 0 seviyesindedir. SPI mod ayarlarını yukarıda belirtmiştim. Kullandığım aygıt Winbond SPI flash entegresi.

SMP biti SDI pininden giren verinin örneklemenin SPI saatinin ortasında mı sonunda mi olacağını seçmeye yarıyor. SDO pininin çıkış vermemesi sorunu ile alakası yok.






alikeskinkilic

herşey kuralına göre ise ve hala data çıkışını alamıyor clk üretemiyorsanız farklı bir işlemciyle deneyin.çünkü ssp shift register çok fazla doğru ayar yapmasan bile içine attığın veriyi clk üretip kaydırıyor donanımsal. spi için iki donanımsal seçenek var işlemcinizde diğerini deneyebilirsizin belki bir arıza vardır kolay gelsin
Hep meraktan