ja1yaz’s diary

感動したいおやじの備忘録的ブログ 

Si5351Aを使えるようになりたい(6)

ググったArduino のスケッチと見比べて、Pythonのプログラムを見直してみた。

PLLA/Bのリセットのタイミングがおかしかったのと、レジスタのReserveされている部分を無視して値を入力しているのを見直して、一度読み込んだうえで、レジスタの値をセットするようにした。Clock1だけ動作がおかしかったのは、MS1_P2の値を設定するレジスタが間違っていたようだった。

OUT_div=60とすることで、Arduinoの例と同じように10MHzを出力できるので、まず試してみた。

Phase offset CLOCK1の方にOUT_div=60を設定することで、下記のように90度位相シフトすることができた。

Si5351A_python_Phase_shift

では、OUT_div=12として50MHzを出力してみた。

出力はしているみたいだが、振幅が違うし、位相もなんだかなーだな。

オシロ50MHzだし、プローブもリード線伸ばしっぱなしなので、位相が回ってもおかしくないようには思う。

Si5351A_python_Phase_shift 50MHz

試しに、プローブはそのまま、噛んでいる信号を交換してみると、下記のように変化した。位相も変わっているのがわかる。まあ50MHzオシロスコープ50MHzを見るのはなかなか無理があるようだ。

Si5351A_python_Phase_shift50MHz CH交換

ということで、まあ良しとしよう。

やっぱもう少し周波数帯域の高いオシロスコープが欲しいな。

下記は、今回使用したコードだ。

 

from machine import Pin, I2C
import time
import math

I2C = I2C(0, scl=Pin(17), sda=Pin(16), freq=400000)

addr = I2C.scan()
print( "address is :" + str(addr) )
# I2Cに使うピンの設定です
#p0=Pin(15,Pin.IN)  #A (rotary encorder)
#p1=Pin(14,Pin.IN)  #B (rotary encorder)
#p2=Pin(13,Pin.IN)
# デバイスのアドレスをスキャンします
#I2C1 = I2C(1, scl=Pin(13), sda=Pin(12), freq=200000)
#addr1 = I2C1.scan()
#print( "address is :" + str(addr1) )
PLL_m=24
PLL_n=0
#External Ref n_zero=180
#internal n_zero=206
PLL_d=625000

OUT_div=12
OUT_n=0
OUT_d=1
OUT_Rdiv=1

OUT1_div=12
OUT1_n=0#225
OUT1_d=1#625000
OUT1_Rdiv=1

 

def Si5351A_init():

    I2C.writeto_mem(96,3,b'\xff')#Disable OUTPUT
    I2C.writeto_mem(96,16,b'\x80')#CLOCK0 Power down
    I2C.writeto_mem(96,17,b'\x80')#CLOCK1 Power down
    I2C.writeto_mem(96,18,b'\x80')#CLOCK2 Power down
    I2C.writeto_mem(96,183,b'\x92')#XTAL_CL CL=8pf
    
def Si5351A_out():
    I2C.writeto_mem(96,16,b'\x4c')#CLOCL0 Power up
    I2C.writeto_mem(96,17,b'\x4c')#CLOCL1 Power up
    I2C.writeto_mem(96,18,b'\x4c')#CLOCK2 Power up
    I2C.writeto_mem(96,3,b'\xfc')#Enable CLOCK0 CLOCK1
    I2C.writeto_mem(96,177,b'\xa0')#Rest PLLA and PLLB    

def Si5351A_set_MSNA_Px(PLL_m,PLL_n,PLL_d):
    MSNA_P1=128*PLL_m+int(128*PLL_n/PLL_d)-512
    MSNA_P2=128*PLL_n-PLL_d*int(128*PLL_n/PLL_d)
    MSNA_P3=PLL_d
    
    #MSNA_p1=2560:18bit
    #MSNA_p1_17_16:28_[1:0]=0
    #MSNA_p1_15_8:29[7:0]=10
    #MSNA_P1_7_0:30[7:0]=0

    MSNA_P11=int(MSNA_P1/256/256)
    MSNA_P12=int(MSNA_P1/256)-256*MSNA_P11
    MSNA_P13=MSNA_P1 % 256

    data=I2C.readfrom_mem(96,28,1)
    data=int.from_bytes(data,"big")
    data= int(data & 0xfc)+int(MSNA_P11)

    I2C.writeto_mem(96,28,data.to_bytes(1,"big"))
    I2C.writeto_mem(96,29, bytes([MSNA_P12]))
    I2C.writeto_mem(96,30, bytes([MSNA_P13]))

    #MSNA_P2=0:20bit
    #MSNA_P2=0
    #MSNA_p2_19_16:31_[3:0]=0
    #MSNA_p2_15_8:32[7:0]=0
    #MSNA_P2_7_0:33[7:0]=0

    MSNA_P21=int(MSNA_P2/256/256)
    MSNA_P22=int(MSNA_P2/256)-256*MSNA_P21
    MSNA_P23=MSNA_P2 % 256
    
    data=I2C.readfrom_mem(96,31,1)
    data=int.from_bytes(data,"big")
    data= int(data & 0xf0)+int(MSNA_P21)

    I2C.writeto_mem(96,31,bytes([MSNA_P21]))
    I2C.writeto_mem(96,32,bytes([MSNA_P22]))
    I2C.writeto_mem(96,33,bytes([MSNA_P23]))

    #MSNA_p3=625000:20bit
    #MSNA_P3=625000
    #MSNA_p3_19_16:31_[7:4]=9    
    #MSNA_p3_15_8:26[7:0]=137                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
    #MSNA_P3_7_0:27[7:0]=104

    MSNA_P31=int(MSNA_P3/256/256)
    MSNA_P32=int(MSNA_P3/256)-256*MSNA_P31
    MSNA_P33=MSNA_P3 % 256

    data=I2C.readfrom_mem(96,31,1)
    data=int.from_bytes(data,"big")
    data= int(data & 0x0f)+int(MSNA_P31*16)

    I2C.writeto_mem(96,31,data.to_bytes(1,"big"))
    I2C.writeto_mem(96,26,bytes([MSNA_P32]))#                
    I2C.writeto_mem(96,27,bytes([MSNA_P33]))#CLK_0 Enable=1
    
def Si5351A_set_MS0_Px(OUT_div,OUT_n,OUT_d):
    
    data=I2C.readfrom_mem(96,44,1)
    data=int.from_bytes(data,"big")

    data= int(data & 0x8f)+int(math.log2(OUT_Rdiv)*16)
    I2C.writeto_mem(96,44,data.to_bytes(1,"big"))

    data=I2C.readfrom_mem(96,165,1)
    data=int.from_bytes(data,"big")
    data= int(data & 0x80)+int(0)
    I2C.writeto_mem(96,165,data.to_bytes(1,"big"))


    
    #MS0_P1=1024:18bit
    #MS0_P1_17_16:44[1:0]=0
    #MS0_P1_15_8:45[7:0]=4
    #MS0_P1_7_0:46[7:0]=0
    
    MS0_P1=128*OUT_div+int(OUT_n/OUT_d)-512
    MS0_P2=128*OUT_n*int(OUT_n/OUT_d)
    MS0_P3=OUT_d

    MS0_P11=int(MS0_P1/256/256)
    MS0_P12=int(MS0_P1/256)-256*MS0_P11
    MS0_P13=MS0_P1 % 256

    data=I2C.readfrom_mem(96,44,1)
    data=int.from_bytes(data,"big")
    data= int(data & 0xfc)+int(MS0_P11)

    I2C.writeto_mem(96,44,data.to_bytes(1,"big"))
    I2C.writeto_mem(96,45,bytes([MS0_P12]))
    I2C.writeto_mem(96,46,bytes([MS0_P13]))

    #MS0_P2=0:20bit
    #MS0_P2_19_16:47[3:0]=0
    #MS0_P2_15_8:48[7:0]=0
    #MS0_P2_7_0:49[7:0]=0

    MS0_P21=int(MS0_P2/256/256)
    MS0_P22=int(MS0_P2/256)-256*MS0_P21
    MS0_P23=MS0_P2 % 256


    data=I2C.readfrom_mem(96,47,1)
    data=int.from_bytes(data,"big")
    data= int(data & 0xf0)+int(MS0_P21)

    I2C.writeto_mem(96,47,bytes([MS0_P21]))
    I2C.writeto_mem(96,48,bytes([MS0_P22]))
    I2C.writeto_mem(96,49,bytes([MS0_P23]))

    #MS0_P3=1:20bit
    #MS0_P3_19_16:47[7:4]=0
    #MS0_P3_15_8:42[7:0]=0
    #MS0_P3_7_0:43[7:0]=1

    MS0_P31=int(MS0_P3/256/256)
    MS0_P32=int(MS0_P3/256)-256*MS0_P31
    MS0_P33=MS0_P3 % 256

    data=I2C.readfrom_mem(96,47,1)
    data=int.from_bytes(data,"big")
    data= int(data & 0x0f)+int(MS0_P31*16)


    I2C.writeto_mem(96,47,data.to_bytes(1,"big"))
    I2C.writeto_mem(96,42,bytes([MS0_P32]))
    I2C.writeto_mem(96,43,bytes([MS0_P33]))

def Si5351A_set_MS1_Px(OUT1_div,OUT1_n,OUT1_d):
    
    data=I2C.readfrom_mem(96,60,1)
    data=int.from_bytes(data,"big")

    data= int(data & 0x8f)+int(math.log2(OUT1_Rdiv)*16)
    I2C.writeto_mem(96,60,data.to_bytes(1,"big"))

#Phase Shift
    data=I2C.readfrom_mem(96,166,1)
    data=int.from_bytes(data,"big")
    data= int(data & 0x80)+int(OUT1_div)
    I2C.writeto_mem(96,166,data.to_bytes(1,"big"))


    
    #MS1_P1=1024:18bit
    #MS1_P1_17_16:52[1:0]=0
    #MS1_P1_15_8:53[7:0]=4
    #MS1_P1_7_0:54[7:0]=0
    
    MS1_P1=128*OUT1_div+int(OUT1_n/OUT1_d)-512
    MS1_P2=128*OUT1_n*int(OUT1_n/OUT1_d)
    MS1_P3=OUT1_d

    MS1_P11=int(MS1_P1/256/256)
    MS1_P12=int(MS1_P1/256)-256*MS1_P11
    MS1_P13=MS1_P1 % 256

    data=I2C.readfrom_mem(96,52,1)
    data=int.from_bytes(data,"big")
    data= int(data & 0xfc)+int(MS1_P11)

    I2C.writeto_mem(96,52,data.to_bytes(1,"big"))
    I2C.writeto_mem(96,53,bytes([MS1_P12]))
    I2C.writeto_mem(96,54,bytes([MS1_P13]))

    #MS1_P2=0:20bit
    #MS1_P2_19_16:55[3:0]=0
    #MS1_P2_15_8:56[7:0]=0
    #MS1_P2_7_0:57[7:0]=0

    MS1_P21=int(MS1_P2/256/256)
    MS1_P22=int(MS1_P2/256)-256*MS1_P21
    MS1_P23=MS1_P2 % 256

    data=I2C.readfrom_mem(96,55,1)
    data=int.from_bytes(data,"big")
    data= int(data & 0xf0)+int(MS1_P21)

    I2C.writeto_mem(96,55,data.to_bytes(1,"big"))
    I2C.writeto_mem(96,56,bytes([MS1_P22]))
    I2C.writeto_mem(96,57,bytes([MS1_P23]))

    #MS1_P3=1:20bit
    #MS1_P3_19_16:55[7:4]=0
    #MS1_P3_15_8:50[7:0]=0
    #MS1_P3_7_0:51[7:0]=1

    MS1_P31=int(MS1_P3/256/256)
    MS1_P32=int(MS1_P3/256)-256*MS1_P31
    MS1_P33=MS1_P3 % 256

    data=I2C.readfrom_mem(96,55,1)
    data=int.from_bytes(data,"big")
    data= int(data & 0x0f)+int(MS1_P31*16)


    I2C.writeto_mem(96,55,data.to_bytes(1,"big"))
    I2C.writeto_mem(96,50,bytes([MS1_P32]))
    I2C.writeto_mem(96,51,bytes([MS1_P33]))
    
    
Si5351A_init()
Si5351A_set_MSNA_Px(PLL_m,PLL_n,PLL_d)
Si5351A_set_MS0_Px(OUT_div,OUT_n,OUT_d)
#data=I2C.readfrom_mem(96,44,1)
#data=int.from_bytes(data,"big")

#data= int(data & 0x8f)+int(math.log2(OUT_Rdiv)*16)
#I2C.writeto_mem(96,44,data.to_bytes(1,"big"))

#data=I2C.readfrom_mem(96,165,1)
#data=int.from_bytes(data,"big")
#data= int(data & 0x80)+int(0)
#I2C.writeto_mem(96,165,data.to_bytes(1,"big"))

Si5351A_set_MS1_Px(OUT1_div,OUT1_n,OUT1_d)
#data=I2C.readfrom_mem(96,60,1)
#data=int.from_bytes(data,"big")

#data= int(data & 0x8f)+int(math.log2(OUT1_Rdiv)*16)
#I2C.writeto_mem(96,60,data.to_bytes(1,"big"))

#data=I2C.readfrom_mem(96,166,1)
#data=int.from_bytes(data,"big")
#data= int(data & 0x80)+int(OUT_div)
#I2C.writeto_mem(96,166,data.to_bytes(1,"big"))
Si5351A_out()