Forum: Mikrocontroller und Digitale Elektronik DDS AD9834/ PIC SPI Problem


von Micid (Gast)


Lesenswert?

Ich habe einen PIC24FJ128GB204 über SPI(16 Bit Mode) mit einem AD9834 
zusammengeschlossen. Ich habe einen MCLK für den AD9834 von 2.048MHz und 
die SPI - Schnittstelle läuft auch über 2Mhz. Mein Problem ist, dass die 
DDS konstant einen Sinus mit 192.123kHz liefert. Ich habe versucht 
diverse Frequenzworte an den Chip zu senden, aber die Frequenz ändert 
sich nur im Bereich von 192kHz bis 214kHz. Ich habe mich an die 
Spezifikationen für den Chip bezüglich dem Chip (fallende Flanke, Idle 
Low für Fsynch und Clk). Ich versuche einen Sinus mit 100kHz zu 
realisieren. Kann mir jemand bei der Fehlersuche helfen.

LG

Hier mein Code:
1
void main(){
2
     SPI1_Init_Advanced(_SPI_MASTER, _SPI_16_BIT, 0, _SPI_SS_DISABLE,  _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_IDLE_2_ACTIVE);
3
     SPI1CON1L.SPIEN       = 0;
4
     SPI1CON1L.SPIFE =   1; //Frame Synch kommt gleichzeitig mit dem First Bit
5
     SPI1CON1H.FRMEN       = 0; //Framed Support aus
6
     SPI1CON1H.FRMSYNC     = 1; //FSYNCH als Master Output
7
     SPI1CON1H.FRMPOL      = 0; //Soll bei active LOW sein => AD9834
8
     SPI1CON1H.MSSEN       = 1; //Master Mode FSYNCH wird vom Modul gesteuert
9
     SPI1CON1H.FRMSYPW     = 1; //FSYNCH ist eine Wortbreite(16Bit) lang
10
     SPI1CON1H.FRMCNT2     = 0; //Erzeugt bei jedem Wort einen neuen    Frameimpuls EVENTUELL ÄNDERN
11
     SPI1CON1H.FRMCNT1     = 0; 
12
     SPI1CON1H.FRMCNT0     = 0; 
13
     SPI1CON1L.CKP =     1; //Invertierter Clock
14
     ANSC.RC9 = 0;
15
     TRISC.RC9 = 0;
16
     set_peripheral_pps_pins();
17
     DDS_Init();
18
     Delay_ms(1);
19
}
1
void DDS_Init(){
2
     SPI1_Write(0x20);  //Daten werden im FREQ0 angenommen für den Phasenakkumulator
3
     while(SPITBE == 0){} //solange der Buffer nicht leer ist warte
4
     PORTC.RC9 = 1;       //RESET PIN
5
     while(SPITBE == 0){} //solange der Buffer nicht leer ist warte                   //RESET muss für den gesamten Zyklus (beim Daten senden) an bleiben
6
     SPI1_Write(0x4000); //LSB für 100kHz laden   0x0
7
     while(SPITBE == 0){} //solange der Buffer nicht leer ist warte
8
     SPI1_Write(0x40C8); //MSB für 100kHz laden
9
     while(SPITBE == 0){} //solange der Buffer nicht leer ist warte
10
     PORTC.RC9 = 0;
11
}
12
void set_peripheral_pps_pins(){
13
     RPOR11.RP22R0 = 1;
14
     RPOR11.RP22R1 = 0;
15
     RPOR11.RP22R2 = 0;
16
     RPOR11.RP22R3 = 1;
17
     RPOR11.RP22R4 = 0;
18
     RPOR11.RP22R5 = 0; //RP22 auf SS1OUT zugewiesen
19
     RPOR11.RP23R0 = 0;
20
     RPOR11.RP23R1 = 0;
21
     RPOR11.RP23R2 = 0;
22
     RPOR11.RP23R3 = 1;
23
     RPOR11.RP23R4 = 0;
24
     RPOR11.RP23R5 = 0; //RP23 auf SCK1OUT zugewiesen
25
     RPOR12.RP24R0 = 1;
26
     RPOR12.RP24R1 = 1;
27
     RPOR12.RP24R2 = 1;
28
     RPOR12.RP24R3 = 0;
29
     RPOR12.RP24R4 = 0;
30
     RPOR12.RP24R5 = 0; //RP24 auf SDO1OUT zugewiesen

von Micid (Gast)


Lesenswert?

Es läuft jetzt. Wie es aussieht, ist der externe RESET - Pin nicht 
geeignet, für diese Art von Ansteuerung. Man muss den Software - Reset 
durchführen

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.