Si5351 Clock osilatör I2C problem

Başlatan onurinci, 29 Mart 2026, 14:09:32

onurinci

hocam selam , piyasada hazır modül halinde satılan Si5351 Clock üretme modülü ile uğraşıyorum. iki gün yapay zekaya sordum registerler nasıl doldurulur öğrenmeye gayret ettim. elimde 12F1840 vardı. bu entegre ile ilk defa çalışıyorum. bunda donanım olarak I2C var görünüyor.bir şeyler karaladım ama hiç I2C bilgisi çıkmadı. donam olarak I2C komutu ayrımı acaba . yorunlarınıza açığım.

' --- 12F1840 Donanım Ayarları ---
#CONFIG
    __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF
    __CONFIG _CONFIG2, _PLLEN_OFF & _LVP_OFF
#ENDCONFIG

OSCCON = %01111000  ' 16MHz Dahili Osilatör


SDA VAR PORTA.2       ' SDA Pini
SCL VAR PORTA.1       ' SCL Pini
SI_ADDR CON $C0       ' Si5351 Yazma Adresi


; Reg 177 PLL RESET
; Reg 183  XTAL CAP Select
; Reg 149 SS Disable
; Reg 16-23 (MS0): Sets MultiSynth 0 to divide the PLL frequency.
; Reg 3: Enable CLK0 output



' --- Başlatma ---
PAUSE 100            ' Si5351'in kararlı hale gelmesi için bekle

' 1. Tüm Çıkışları Kapat
I2CWrite SDA, SCL, SI_ADDR, 3, [%11111111]

' 2. PLLA Yapılandır (900 MHz için)
' Register 26-33 (P1=0x1000, P2=0, P3=1)
I2CWrite SDA, SCL, SI_ADDR, 26, [$00, $01, $00, $10, $00, $00, $00, $00]

' 3. CLK0 Multisynth Yapılandır (10 MHz için)
' Register 42-49 (P1=0x2B00, P2=0, P3=1)
I2CWrite SDA, SCL, SI_ADDR, 42, [$00, $01, $00, $2B, $00, $00, $00, $00]

' 4. CLK0 Kontrol ve Spread Spectrum Kapat
I2CWrite SDA, SCL, SI_ADDR, 16, [$4F]       ' CLK0 Power Up, PLLA, 8mA
I2CWrite SDA, SCL, SI_ADDR, 149, [$00]      ' SS Disable

' 5. PLL Reset ve Çıkış Etkinleştir
I2CWrite SDA, SCL, SI_ADDR, 177, [$A0]      ' PLLA & PLLB Reset
I2CWrite SDA, SCL, SI_ADDR, 3, [%11111110]  ' Sadece CLK0 Açık

;Main:
    ' Sabit 10MHz çıkış devam eder
;    GOTO Main
;End

ete

İlk bakışta device adresi yanlış kullandığını görebiliyorum.
Bir data sheet buldum ve orada 7 bit üzerinden dresi şu şekilde vermişler.
%1100000 dikkat edersen 7 adet bit var. Bunu bizim 8 e tamamlamamız gerekir.
Bu durumda device adres %01100000 şeklinde gelir. Bit-0 biliyorsun okuma yapılırken 1 yazma yapılırken 0 olur. Ancak bunu Basic kendisi hallettiği için sen %01100000 şeklinde kullanabilirsin.
Bu şekilde bir dene bakalım. Bir register map bulamadım. Bu nedenle şimdilik programda ne yaptığınla ilgilenemedim. Açılış gecikmesi pic işlemciler içinen azından 150ms olmalıdır. Daha iyisi sen 200-300ms aralığında bir değer ver.

Ete,

onurinci

anladım hocam yarın ilk iş olarak gerçek donanıma yollayıp görürürüm. simimulasyon SCL Transitrion hatalı diyor.

ete

Bende o hatayı vermiyor da indirek adres hatası veriyor.
Bu yeni nesil işlemcilerde bu şekilde hata alıyorum her nedense ve kesinlikle düzeltemiyorum.
Aslında hatayı yaratan OSCCON komutu ama onu kapatırsam bir müddet hata gelmiyr sonra geliyor.
Gerçek devrede bu hatayı vereceğini sanmam.

Programın başına bazı komutlar eksik. Bunları da ekleyip programı yeniden verdim. Device adresi de düzelttim. Bunu denersin artık.

' --- 12F1840 Donanım Ayarları ---
#CONFIG
    __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF
    __CONFIG _CONFIG2, _PLLEN_OFF & _LVP_OFF
#ENDCONFIG
DEFINE OSC 16
OSCCON = %01111011  ' 16MHz Dahili Osilatör

OSCSTAT=0
OSCTUNE=0
PORTA=0:TRISA=0:LATA=0
ANSELA=0

SDA VAR PORTA.2       ' SDA Pini
SCL VAR PORTA.1       ' SCL Pini
SI_ADDR CON $60       ' Si5351 Yazma Adresi


; Reg 177 PLL RESET
; Reg 183  XTAL CAP Select
; Reg 149 SS Disable
; Reg 16-23 (MS0): Sets MultiSynth 0 to divide the PLL frequency.
; Reg 3: Enable CLK0 output



' --- Başlatma ---
PAUSE 100            ' Si5351'in kararlı hale gelmesi için bekle

' 1. Tüm Çıkışları Kapat
I2CWrite SDA, SCL, SI_ADDR, 3, [%11111111]

' 2. PLLA Yapılandır (900 MHz için)
' Register 26-33 (P1=0x1000, P2=0, P3=1)
I2CWrite SDA, SCL, SI_ADDR, 26, [$00, $01, $00, $10, $00, $00, $00, $00]

' 3. CLK0 Multisynth Yapılandır (10 MHz için)
' Register 42-49 (P1=0x2B00, P2=0, P3=1)
I2CWrite SDA, SCL, SI_ADDR, 42, [$00, $01, $00, $2B, $00, $00, $00, $00]

' 4. CLK0 Kontrol ve Spread Spectrum Kapat
I2CWrite SDA, SCL, SI_ADDR, 16, [$4F]       ' CLK0 Power Up, PLLA, 8mA
I2CWrite SDA, SCL, SI_ADDR, 149, [$00]      ' SS Disable

' 5. PLL Reset ve Çıkış Etkinleştir
I2CWrite SDA, SCL, SI_ADDR, 177, [$A0]      ' PLLA & PLLB Reset
I2CWrite SDA, SCL, SI_ADDR, 3, [%11111110]  ' Sadece CLK0 Açık

;Main:
    ' Sabit 10MHz çıkış devam eder
;    GOTO Main
;End

aRci

Merhaba adres konusunda sürekli sorun yaşayan biri olarak her zaman verilen adres verisini sola bir kaydırarak cihaz adresini buluyorduk bu cihaz adresi 7 bit olarak $60 verilmiş bu nu 7 bit sola kaydırınca $C0 olması gerektiğini düşünüyorum.

ete

7 bit olarak adres bilgisi %1100000 şeklinde verilmiş ve data sheet de sıfır nolu bit için A0 denilmiş üstelik bu bit (01) şeklinde yazılmış. Bu şu anlama geliyor o ilk bit okumada 1 yazmada sıfır olan bit bu durumda sekizinci bit en sağa eklenecek demektir. Ben bu bilgiye DATA SHEET okuyarak ulaştım. Anlaşılan sen burada yazılanlara bakarak buna karar verdin. Yanlışlık buradan geliyor.
 

onurinci


aRci

#7
Cihazın bir A0 pini var bu pin adres değişimi için kullanılıyor. A0 pini low yapılırsa adres $60 high yapılırsa $61 oluyor. Okuma ve yazma bitini de dahil edince $C0 - $C2 slave adresleri olmalı. Datasheet de bu şekilde görsel var



ete

Arci, haklı olabilirsin. Bu durumda Onur; A0 bitine ne verdi isen onuda adreste belirtmen ve Adreside ona göre belirlemende yarar var. A0 pinine Pullup uygulamış isen Device address %11000010 yani $C2 yada A0 bitine Pulldown uygulamış isen adres değerin $C0 olarak uygulanmalı.

Ete

Pepe

#9
ejemplo en proton basic

İlyas KAYA

Anladığım kadarıyla karmaşık bir kayıtsici var. Hazir kütüphaneleri kullanmak daha avantajlı olacak. Arduino ile yapılmış kütüphaneleri pic için yapay zekayı kullanarak çevirebilirsiniz yada kütüphaneyi inceleyerek kayitcilari bulabilirsiniz.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

istinaf duvarı

#11
Alıntı yapılan: ete - 29 Mart 2026, 17:33:33İlk bakışta device adresi yanlış kullandığını görebiliyorum.
Bir data sheet buldum ve orada 7 bit üzerinden dresi şu şekilde vermişler.
%1100000 dikkat edersen 7 adet bit var. Bunu bizim 8 e tamamlamamız gerekir.
Bu durumda device adres %01100000 şeklinde gelir. Bit-0 biliyorsun okuma yapılırken 1 yazma yapılırken 0 olur. Ancak bunu Basic kendisi hallettiği için sen %01100000 şeklinde kullanabilirsin.
Bu şekilde bir dene bakalım. Bir register map bulamadım. Bu nedenle şimdilik programda ne yaptığınla ilgilenemedim. Açılış gecikmesi pic işlemciler içinen azından 150ms olmalıdır. Daha iyisi sen 200-300ms aralığında bir değer ver.

Ete,


Yapılandırmayı Assembly ile yapsanız belki olur. Derleyiciler bazen verdiğin komutu yanlış çevirebilir. En garanti yöntem assembly ile manuel giriş yapmak.

Zaten şu 7 bit adres kullananlara ayar oluyorum. Bu işi ilk kim baslattıysa tanrı evlerine ateşler salsın.  :) Çok kafa karıştırıyor.

CH341A programlayıcı varsa adres bulmak çok basit. Aygıtı CH341A'ya bağlayıp I2C detect fonksiyonunu çalıştırınca bulunan adresleri listeliyor.
https://tomeko.net/software/CH341A_tool/index.php?lang=en

Powered by EzPortal
▲