Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Si5351 + PIC16F1455 USB controller
(07-21-2017, 07:28 PM)progster Wrote: EDIT: Razmišljam, u TV tjunere bi trebalo da ugrađuju prescalere, pa ću pogledati šta imam, trebalo bi da imam par komada negde.

(07-22-2017, 11:15 AM)progster Wrote: Za prescaler ću sad potražiti da vidim čega ima na onim pločama i tjunerima. Za invertore, ulaz i zaštitu ćemo videti onda kasnije, imam sad dovoljno posla i sa ovim. Poterao sam juče AD9850, ali sam sinoć bio mrtav, pa ću sad da nastavim, nije mi nešto dobro računanje frekvencije.

Ako ne nadjes nista, kod mene imas sledece:
  -SP4740
  -SAB6456T
  -U666

Ovaj SP je po meni najbolji izbor jer mu je ulazna osetljivost tipicno 1mV i izlaz mu je TTL kompatibilan.
Dovoljno je da se stave dve diode za zastitu ulaza i to je sve, naravno ako je dovoljna ulazna impedansa od 50ohma.
Ako se zeli 1Mohm na ulazu neophodan je ulazni stepen koji se obicno izvodi sa nekim J-FET-om. 
Kad se vratim sa odmora potrazicu neku zgodnu semicu pa cu okaciti odje.

http://pdf.dzsc.com/SP4/SP4740.pdf
Novac je sredstvo a ne cilj.
Reply
Hvala Gošo, videću mogu li da nađem nešto. Smile

Evo sad baš tražim, imam tjunere (i ploče) od dva EI televizora, dva neka Goldstar, i tjuner iz nekog Thompson LCD-a, i nijedan od njih nema neko slično kolo. Ne znam da li je moguće da nijedan od njih nema takvo kolo?

Uglavnom svi imaju neki IC, recimo EI je stavljao TDA5030, u nekom starom tjuneru postoji mesto za SDA2101, ali nije na ploči, a prilično sam siguran da nisam to skidao. Ovi isto imaju neki IC, ali nije prescaller...
Tako da će verovatno da posluži neki od tih tvojih, ako u međuvremenu ne nađem ništa drugo. Smile
Reply
@progster

Imam neke male adeptercice za TSOP-10, tj neke plocice koja sam ja koristio za razvoj, ima izvode za napajanje 3.3V, tu se stavi Si i kristal, tu je I2C i tri izlaza. Za razvoj zavrsava posao.
Kasnije kada se bude crtala PCB to treba sve lepo sloziti ...
Reply
(07-22-2017, 07:47 PM)progster Wrote: Hvala Gošo, videću mogu li da nađem nešto. Smile

Evo sad baš tražim, imam tjunere (i ploče) od dva EI televizora, dva neka Goldstar, i tjuner iz nekog Thompson LCD-a, i nijedan od njih nema neko slično kolo. Ne znam da li je moguće da nijedan od njih nema takvo kolo?

Uglavnom svi imaju neki IC, recimo EI je stavljao TDA5030, u nekom starom tjuneru postoji mesto za SDA2101, ali nije na ploči, a prilično sam siguran da nisam to skidao. Ovi isto imaju neki IC, ali nije prescaller...
Tako da će verovatno da posluži neki od tih tvojih, ako u međuvremenu ne nađem ništa drugo. Smile

EI je uglavnom koristio tunere sa naponskom sintezom tako da nisu koristili prescalere. Ima samo jedna mala serija sa frekventnom sintezom i ti je korisceno SDA2101 ili neko iz te serije. Stari Grundig TV-i su uglavnom imali prescalere a i ostali nemci.
Ne muci se mnogo ja toga imam dosta pa nije problem spakovati u neko obicno pismo i da ti posaljem, samo da se vratim u Srbiju.
Novac je sredstvo a ne cilj.
Reply
@Miki
E to bi mi odgovaralo...
Mogao bih možda i foto postupkom da napravim nešto priručno, ali ako imaš jednu tu pločicu značilo bi da se ne zezam, nisam nikad radio tako tanke linije, pojma nemam kako bi ispalo.
Svakako će to kasnije sve lepo da se upakuje i oklopi, ovo je za razvoj.

@Gosha
E onda je to sigurno, nemam ništa od Nemaca, ovo je sve što imam. Važi, nije nikako hitno, kad se vratiš dogovorimo se, uživaj na odmoru. Smile



Pitanje za otvorenu diskusiju. Verovatno je još rano, ali razmišljam kako osmisliti korisnički interfejs na uređaju. Mislio sam prvo da koristim LCD 16x2, i kombinaciju dugmića i 4x3 tastature, možda neki enkoder, pošto sve to već manje više imam, ali nisam pametan kako bih to napravio a da valja, tj. da bude jednostavno i lako za upotrebu, a funkcionalno, mislim da bi tu trebao da čučne neki bolji displej u tom slučaju. Sve više razmišljam da taj displej koristim samo za brojač i eventualno da signalizira u kom modu radi sprava, koja frekvencija i sl. A da se glavna podešavanja obavljaju preko USB-a, to mi je nekako najfleksibilnije. Mogu da se prave razne korisne funkcije, tipa sweep i sl. Šta mislite?


Generalno, voleo bih da se još neki članovi uključe u diskusiju ako im to vreme i obaveze dozvoljavaju (ne mislim ovo oko interfejsa, nego generalno). Ja baš nisam siguran kako i šta najbolje odraditi, da li nešto treba dodati, izbaciti, izmeniti... Trenutno se držim Mikijeve originalne zamisli, uz naravno ostavljenu mogućnost za modifikacije. Nije da ne verujem Mikiju, da je on to dobro zamislio, samo bih voleo da čujem još neko mišljenje. Smile Znam da ljudi rade, meni se završila godina pa sad imam višak vremena...
Ja se trenutno upoznajem sa STM32, radim periferiju po periferiju, prešao dosta, još dosta je i ostalo, danas sam doveo u red AD9850, napisao neke funkcije i sl. To radi super.

Recimo, ja trenutno nemam potrebu za Ghz opsegom merenja frekvencije (nemam ni kako to da testiram), ali bih voleo da ako već radim da sprava bude zaokružena, ozbiljan brojač frekvencije, ne etalonski koji meri na neku sitnu decimalu, ne planiram ni rubidijum da koristim, ali da to radi dobro i stabilno. Recimo ovo što je Gosha rekao za ulaznu impedansu (50R ili 1Meg), nisam siguran na koju opciju ići... Možda da se ostavi mogućnost izbora? Itd...
Voleo bih da ovo preraste u još jedan forumski projekat. Smile
Reply
Evo nadjoh jednu semu sa SP4740:



Prilazem i kompletan SM od frekvencmetra SINCLAIR TF830.


.pdf   SINCLAIR TF830 FREQUENCY METER SERVICE.pdf (Size: 632,51 KB / Downloads: 9)
Novac je sredstvo a ne cilj.
Reply
Hvala Gošo, izučiću malo tu tematiku i taj SM. Smile




Muči me SPI nešto, ja sam naterao AD9850 da radi, koristio asinhronu komunikaciju (upišem, i onda samo uradim frequency update), i to radi dobro. Hteo sam malo da izučim SPI i da odradim to preko njega, ali nikako ne uspevam da upišem. Dešavalo mi se da na izlazu AD dobijem samo DC vrednost, ali nema sinusa. 


Evo kako sam radio, neću da zatrpavam tim delom koda za inicijalizaciju pinova, pošto ne sumnjam u njega, koristio sam te funkcije i ranije.

Pošto mi od SPI trebaju samo CLK i MOSI pinovi, njih sam uključio na PA5 i PA7 (po datasheet-u), kao alternate function push-pull, 50MHZ.
I pinove 4 i 6 kao reset i load (FR_UD), oni su obični push-pull 50Mhz.
NSS i MISO pinove nisam definisao, mislim da to nije ni bitno?


Evo samo definicije porta, pinova, i clock-a na AD9850 radi lakšeg snalaženja u kodu:

Code:
#define DDS_PORT GPIOA
#define DDS_CLK 5 //PA5
#define DDS_DATA 7 //PA7
#define DDS_RESET 4 //PA4
#define DDS_LOAD 6 //PA6
#define DDS_REF 125000000

Na početku sam uključio takt:
Code:
RCC->APB2ENR |= (RCC_APB2ENR_SPI1EN | RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPAEN);

Onda odradim pulse reset na RESET i LOAD:


Code:
//RESET pin
DDS_PORT->BRR = (1<<DDS_RESET);
DDS_PORT->BSRR = (1<<DDS_RESET);
DDS_PORT->BRR = (1<<DDS_RESET);
        
//LOAD pin
DDS_PORT->BRR = (1<<DDS_LOAD);
DDS_PORT->BSRR = (1<<DDS_LOAD);
DDS_PORT->BRR = (1<<DDS_LOAD);

I kreće konfiguracija:

Code:
//baud postavio na f/256
SPI1->CR1 |= (SPI_CR1_BR);
//clock polarity
SPI1->CR1 &= ~(SPI_CR1_CPOL | SPI_CR1_CPHA);
//16bit razmena podataka
SPI1->CR1 |= (SPI_CR1_DFF);
//LSB first pošto AD9850 tako učitava
SPI1->CR1 |= SPI_CR1_LSBFIRST;
    
//transmit onl, 2 line unidirectional data mode, i isključujem recieve only
SPI1->CR1 |= SPI_CR1_BIDIOE;
SPI1->CR1 &= ~(SPI_CR1_BIDIMODE | SPI_CR1_RXONLY);
    
//slave managment
SPI1->CR1 |= SPI_CR1_SSM; //softverski slave managment
SPI1->CR1 |= SPI_CR1_SSI; //slave select na 1
    
//MASTER configuration
SPI1->CR1 |= SPI_CR1_MSTR;
    
//uključujem pefirefiju
SPI1->CR1 |= SPI_CR1_SPE;


Slanje podataka:
Code:
uint32_t freq1 = 5000;
uint32_t freq = (freq1 * 4294967295UL)/DDS_REF;
    
while(!((SPI1->SR) & SPI_SR_TXE));
SPI1->DR = freq;
while(!((SPI1->SR) & SPI_SR_TXE));
SPI1->DR = (freq>>16);
while(!((SPI1->SR) & SPI_SR_TXE));
SPI1->DR = 0;

DDS_PORT->BSRR = (1<<DDS_LOAD);
delay_ms(1);
DDS_PORT->BRR = (1<<DDS_LOAD);

CRC nisam konfigurisao.
To bi po mom mišljenju trebalo da radi, ako neko ima vremena da pogleda, bio bih zahvalan. Smile
Reply
Da li si ispratio malo sa osiloskopom SPI?
Imas SPI dekoder na skopu, prikljuci CLK i DATA i isprati malo sta se na linijama fizicki desava.

Kolika ti je brzina SPI bus-a?
Reply
Ispravio sam malo pre još, nego ne stigoh da pišem, imao neke goste.
Sređeno, problem je bio što je LOAD nešto brljavio, a i slučajno sam na kraju slao 48bit, umesto 40bit (ova poslednja nula, slao sam 3 paketa po 16bit, a sad šaljem 5 po 8bit), pa moguće da je i to jedan od uzroka. Smile

Imao sam i problem da kad upišem program, Blue Pill se restartuje, ali tek nakon što ga ja manuelno restartujem AD9850 počinje da broji i pokazuje sinus, inače postoji samo DC komponenta, i ako nastavim da ga restartujem to se dešava, tačno svaki drugi put proradi. Big Grin
Rešio to tako što sam izbacio onaj puls u resetovanju, ne znam zašto mu je to pravilo problem, sad reset držim na 0.

Brzina SPI je bila 72Mhz/256, sad sam je popeo na 72Mhz/2, i radi odlično.
Reply
@progster
Da li si uspeo da poteras Si5351?

Uzgred, kad trebas da pokrenes neku novu periferiju, prvo "gadjas" neki fiksan registar koji uvek daje isti rezultat, najcesce neki ID koji oznacava model ili proizvodjaca. Sa tim proveris da li ti je to sve dobro povezano na HW nivou pa posle se bavis ostalim detaljima protokola.
Takodje to je zgodno recimo kod EEPROM memorija da proveris prilikom starta programa da li je ta periferija dobro prikljucena, ispravna i da je postavljen trazeni model.
Problem konekcija je cest kada se koristi proto-board i SPI, program tehnicki ne moze da detektuje neispranu konekciju jer imao/nemao periferiju iscitavanje nekog registra ce uvek vracati podatak 0 i onda ne znas da li stvarno treba da bude 0 ili nema konekcije.
Dodatno ta detekcija je korisna da bi eventualno mogao da nastavis izvrsavanje programa i nekako signaliziras da postoji problem.

Kod I2C je malkice bolja situacija jer bez periferije na bus-u ne mozes ni da posaljes podatak, tad trebas detektovati timeout i signalizirati gresku.
Reply
@Miki
Nisam, nisam bio kod kuće od četvrtka. Večeras ili sutra to probam, pa javljam šta sam uradio. Smile

Hvala na savetu, o tome nisam razmišljao, a dosta sam se mučio kad sam hteo da poteram 2x16 LCD sa i2c expanderom.
Reply
Moze biti nekom interesantno:

http://www.radista.info/oglasi/index.php...m&id=23295
Novac je sredstvo a ne cilj.
Reply
Malo sam zastao sa ovim, imao obaveza preko glave... Konačno uzeo malo pre da poteram pločicu koji mu je Miki poslao (nažalost, ima tome više od mesec dana). Proradilo je sve bez većih problema, samo sam malo proučio datasheet Si5351 i ref. manual. Samo osnovna konfiguracija, uključivanje izlaza, bez proračuna frekvencije i sl. Evo prvih slika sa Rigola. Smile Prvi signal je preko 330R otpornika, a drugi je sa izlaza. (imati u vidu da je korišćen protoboard, pa oblici i nisu baš verodostojni).
Reply
Danas sam radio i na podešavanju PLL-a, odnosno multisynth-a, nije ni tu bilo većih problema...
Jedino algoritam za racionalnu aproksimaciju nije još završen, tj. treba popraviti preciznost toga, ali bitno je da radi komunikacija, programiranje nije problem. Smile

Što se prvobitne zamisli tiče... Tu mi ostaje da se poigram sa interfejsom, kontrolom, USB komunikacijom. Ostaje da se uradi preamp, zaštita i prescaler. I ostaje mi da probam external clocking pomoću Si5351.
Bilo bi dobro da se neko iskusniji javi oko ulaznog stepena. Smile
Bilo bi lepo ako bi mogao da se odradi neki izlazni stepen za AD9850, i PWM sa STM32, da se dobije već ozbiljna sprava.


Attached Files Thumbnail(s)

Reply
@Progster

Da li mozes da postavis deo Code-a za I2C ili ceo source koji trenutno imas?
Potreban mi je I2C drajver na bare-metal nivou, predpostavljam da si tako radio, da ne pisem bas sve ispocetka ...
Reply
Pisao sam bare-metal kod, samo što je problem što nisam napisao driver za I2C, pa je to trenutno razbacano po kodu, pisao sam bukvalno kad mi šta i gde treba... GPIO recimo imam koliko-toliko sređen, a ovo je malo u haosu.



Evo recimo inicijalizacija pinova, podešavanje frekvencije itd.

Code:
    //clock enable
    RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
    RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
    
    //pins configuration
    //ovo su neke moje funkcije za inicijalizaciju GPIO, ako treba mogu da postavim
    GPIO_Type PIN_SCL;
    PIN_SCL.pin = SI_SCL;
    PIN_SCL.mode = GPIO_MODE_OUT_50MHZ;
    PIN_SCL.cnf = GPIO_OUTPUT_ALT_OD;
    GPIO_Init(SI_PORT, PIN_SCL);
    
    GPIO_Type PIN_SDA;
    PIN_SDA.pin = SI_SDA;
    PIN_SDA.mode = GPIO_MODE_OUT_50MHZ;
    PIN_SDA.cnf = GPIO_OUTPUT_ALT_OD;
    GPIO_Init(SI_PORT, PIN_SDA);
    
    
    //frequency 36Mhz
    //nije nepotrebno da se radi ovako, to sam se ja nešto glupirao, može da se stavi direktno
    //I2C1->CR2 |= I2C_CR2_FREQ_2 | I2C_CR2_FREQ_5;
    //I2C1->CR2 &= ~I2C_CR2_FREQ;
    
    uint32_t tmpreg = I2C1->CR2;
    tmpreg &= ~I2C_CR2_FREQ;
    tmpreg |= (I2C_CR2_FREQ_2 | I2C_CR2_FREQ_5);
    I2C1->CR2 = tmpreg;
    
    //disable peripherial
    I2C1->CR1 &= ~I2C_CR1_PE;

       //reset tmpreg
    tmpreg = 0;
    
    tmpreg |= 0x36;
    
    //slow mode
    I2C1->TRISE = 0x37;
    
    I2C1->CCR = tmpreg;
    
    //enable peripherial
    I2C1->CR1 |= I2C_CR1_PE;
    
    //SM mode
    //nije neophodno, ali treba da se upiše 1 ako se ide na 400kHz
    //I2C1->CCR &= ~I2C_CCR_FS;
    
    //ACK enable
    I2C1->CR1 |= I2C_CR1_ACK;
    
    //ni ovo nije toliko bitno, bitno je da bit15 bude 0 da bi bio u 7bit adress modu
       //ostalo upisujem 0 pošto mi nije bilo bitno da imam adresu
    I2C1->OAR1 = 0x0;
    
    //peripherial enable
    I2C1->CR1 |= I2C_CR1_PE;
    
    //generate start
    //I2C1->CR1 |= I2C_CR1_START;

Ovo koristio za adresu, slanje, stop:
Code:
    void si5351_i2c_start (uint8_t adress) {
        I2C1->CR1 |= I2C_CR1_START;
        while(!(I2C1->SR1 & I2C_SR1_SB));
        I2C1->DR=0xC0;
        while(!(I2C1->SR1 & I2C_SR1_ADDR));
        I2C1->SR1;
        I2C1->SR2;
    }
    
    void si5351_i2c_write (char data) {
        I2C1->DR = data;
        while(!(I2C1->SR1 & I2C_SR1_TXE));
    }
    
    void si5351_i2c_stop () {
        I2C1->CR1 &= ~I2C_CR1_STOP;
    }
Code:
void si535x_SendRegister(uint8_t reg, uint8_t data){
      si5351_i2c_start(0xC0);
      si5351_i2c_write(reg);
      si5351_i2c_write(data);
      si5351_i2c_stop();    
    }


Ako ti ovo nešto znači... Ako ti nije hitno, daj mi vremena, do sutra ujutru da svedem ovo lepo i napišem lepo drajver (ne ceo, ali ovaj deo koji ja koristim), pa ti pošaljem. Smile
Reply
Odlicno i ovo!

Sredi ti code u svakom slucaju ali ne moras da zuris sa tim, mozemo kasnije to da postavimo na GitHub i tu da cuvamo source da se ne vuce po temama.
Reply
Super. Smile
Hoću svakako, mislim kako kompletiram neki deo trudiću se da to ostavim uredno, ali je trenutno sve u fazi razvoja, a ja baš nemam puno vremena pošto imam dosta obaveza na fakultetu, pa kad stignem ja dorađujem ovo. Smile

Imaš li možda negde neki primer kada si preko USB komunicirao sa STM32F1 i PC? Ne mora da bude bare-metal, može i HAL ili std?
Reply
To nisam jos probao sa USB.
Znam da jede resurse pa sam ga privemeno preskocio ...
---

Inace baci pogled na ovu kombinaciju STM32 i Si5351 sa jos tri cuvena SA612 mixera, Japanac napravio ceo VNA Smile. ... I upravo radi istu stvar koju sam ovde spominjao, gura sa TCXO Si5351A! Samo dodao ADC (ili je CODEC nisam siguran) i sve ostalo je software ... svaka cast, dobro je to osmislio, moguce da i solidno sve radi, rasprodat mu kit komplet ...
https://github.com/ttrftech/NanoVNA
Reply
Ako ikad budem završio ovo što trenutno radim, ovo mi je sledeći projekat. Big Grin
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)