Sari la conținut
ELFORUM - Forumul electronistilor

DDS comandat de ZK-S12-A in CodeWarrior


dragutzu_marius

Postări Recomandate

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
  • Răspunsuri 1
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • dragutzu_marius

    2

Zile populare

Top autori în acest subiect

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări