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
|