dragutzu_marius Postat Iunie 4, 2013 Partajează Postat Iunie 4, 2013 Buna seara. Am realizat un DDS cu AD9852, comandat de o placa de dezvoltare ZK-S12-A cu microcontroler MC9S12XDP512, iar softul scris in Code Warrior. Folosesc interfata SPI pentru comunicare, semnalele arata bine, insa nu inteleg ce imi scapa din program pentru ca AD9852 nu genereaza nici o frecventa. AD9852 are un oscilator extern de 20MHz, si nu am setat multiplicatorul pentru RefClk (stie sa multiplice pana la 300MHz System Clock daca il setez din registru) Placa de dezvoltare foloseste un cuart de 16MHz. Conexiunile sunt asa: - PS1 = I/O Update Clock - PS2 = Master Reset - PS3 = I/O Reset - PS4 = SDO - PS5 = SDI - PS6 = SCLK - PS7 = CS ( activ in 0 ) - PM6 = FSK - PM7 = OSK (Output Shaped Keying) Asta este partea de cod scrisa pana acum: #include <hidef.h>#include <mc9s12xdp512.h>void SPI_init(void) { SPI0BR = 0x02; SPI0CR1 = 0x52; SPI0CR2 = 0x10;}void main(void) { DDRM = 0xFF; //Port M = iesire DDRS = 0xFF; //Port S = iesire PTM = 0x20; //Initializeaza portul M PTS = 0; //Initializeaza portul S SPI_init(); //Apeleaza SPI_init() PTS_PTS2 = 1; //Master_Reset PTS_PTS2 = 1; //Master_Reset PTS_PTS2 = 1; //Master_Reset PTS_PTS2 = 0; //Master_Reset dezactivat for (;;){ PTS_PTS3 = 1; //Stop transmisie PTS_PTS3 = 0; //Start transmisie while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x07; //adresa registru control while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x05; //primul octet transmis al cuvantului de control while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x60; //al doilea octet transmis al cuvantului de control while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x40; //al treilea while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x50; //al patrulea PTS_PTS1 = 1; //incarcarea registrul de control cu valoarea din buffer PTS_PTS1 = 0; // PTS_PTS3 = 1; //Stop transmisie PTS_PTS3 = 0; //Start transmisie while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x02; //adresa registru frecventa 1 while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x00; //primul octet transmis al frecventei 1 while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x03; //al doilea octet transmis al frecventei 1 while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x46; //al treilea while((SPI0SR & 0x20) == 0x00); SPI0DR = 0xDC; //al patrulea while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x5D; //al cincilea while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x63; //al saselea PTS_PTS1 = 1; //incarcarea registrul de control cu valoarea din buffer PTS_PTS1 = 0; // PTS_PTS3 = 1; //Stop transmisie PTS_PTS3 = 0; //Start transmisie while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x03; //adresa registru frecventa 2 while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x00; //primul octet transmis al frecventei 2 while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x03; //al doilea octet transmis al frecventei 2 while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x46; //al treilea while((SPI0SR & 0x20) == 0x00); SPI0DR = 0xDC; //al patrulea while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x5D; //al cincilea while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x63; //al saselea PTS_PTS1 = 1; //incarcarea registrul de control cu valoarea din buffer PTS_PTS1 = 0; // PTS_PTS3 = 1; //Stop transmisie } EnableInterrupts; for(;;) { } /* loop forever */ /* please make sure that you never leave main */} Conexiunile sunt bine facute, pentru ca pe pinii lui AD9852 vad semnalele care trebuie. Sunt sigur ca nu scriu ce trebuie in registri... va rog sa ma ajutati care stiti....m-am pierdut la functionarea AD9852. Vreau sa generez un semnal sinusoidal 1KHz-1MHz... nu conteaza, doar sa scoata ceva. Link spre comentariu
dragutzu_marius Postat Iunie 11, 2013 Autor Partajează Postat Iunie 11, 2013 Am rezolvat problema... singura modificare: pinul de enable de la oscilatorul de 20MHz (refClk) l-am pus la PTP6 codul e urmatorul: #include <hidef.h>#include <mc9s12xdp512.h>unsigned i=0;void SPI_init(void) { SPI0BR = 0x07; SPI0CR1 = 0x52; SPI0CR2 = 0x10; }void main(void) { SPI_init(); //Apeleaza SPI_init() MODRR = 0x00; //Seteaza SPI0 foloseste portul S DDRM = 0xFF; //Port M = iesire DDRS = 0xFF; //Port S = iesire DDRP = 0xFF; //Port M = iesire PTM = 0x20; //Initializeaza portul M PTS = 0; //Initializeaza portul S PTP = 0x40; for (i=0;i<10000;i++) { PTS_PTS2 = 1; //Master_Reset } PTS_PTS2 = 1; //Master_Reset PTS_PTS2 = 0; //Master_Reset dezactivat PTP_PTP6 = 0; PTS_PTS3 = 1; // Stop transmisie PTS_PTS3 = 0; // Start transmisie while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x07; // adresa registru control while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x14; // primul octet transmis al cuvantului de control while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x60; // al doilea octet transmis al cuvantului de control while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x00; // al treilea while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x40; // al patrulea while((SPI0SR & 0x20) == 0x00); PTP_PTP6 = 1; // start RefClk (20MHz) PTS_PTS3 = 0; //Start transmisie while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x02; //adresa registru frecventa 1 while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x06; //primul octet transmis al frecventei 1 while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x66; //al doilea octet transmis al frecventei 1 while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x66; //al treilea while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x66; //al patrulea while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x66; //al cincilea while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x66; //al saselea PTS_PTS1 = 1; //incarcarea registrul de control cu valoarea din buffer PTS_PTS1 = 0; // while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x03; //adresa registru frecventa 2 while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x06; //primul octet transmis al frecventei 2 while((SPI0SR & 0x20) == 0x00); SPI0DR = 0x66; //al doilea octet transmis al frecventei 2 while((SPI0SR & 0x20) == 0x00); SPI0DR = 0X00; //al treilea while((SPI0SR & 0x20) == 0x00); SPI0DR = 0xCC; //al patrulea while((SPI0SR & 0x20) == 0x00); SPI0DR = 0xCC; //al cincilea while((SPI0SR & 0x20) == 0x00); SPI0DR = 0xC0; //al saselea PTS_PTS1 = 1; //incarcarea registrul de control cu valoarea din buffer PTS_PTS1 = 0; // PTS_PTS3 = 1; //Stop transmisieEnableInterrupts; for(;;) { } /* loop forever */ /* please make sure that you never leave main */} Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum