Interfacing van de AD9833 met het SPI protocol met de PIC18F2550

Hallo iedereen

Vooralleer ik een hardware ontwerp maak zou ik graag weten als dat wel juist is wat ik doe.

Het gaat om het interfacen van de 9833 (DDS chip) met de microcontroller PIC18F2550

De AD9833 maakt SPI datacommunicatie mogelijk en heeft de volgende aansluitingen:

FSYNC : Active Low Control Input.
This is the frame synchronization signal for the input data.
When FSYNC is taken low, the internal logic is informed that a new word is being loaded into the device.

SDATA: Serial Data Input. The 16-bit serial data-word is applied to this input
SCLK : Serial Clock Input. Data is clocked into the AD9833 on each falling SCLK edge.

The PIC18F2550 have the next connections:
=================================
SCK : Synchronous serial clock input/output for SPI mode
SDI : SPI data in (input)
SDO : SPI data out (output)

Qestion 1
=======

How can I connected my AD9833 via SPI communication with my microcontroller PIC18F2550 ?
I have been connected my AD9833 with my PIC18F2550 in this order:

AD9833 Device Microcontroller Device
============ ================
SCLK (input) SCK (output)
FSYNC (input) SDO (output)
SDATA (input) SDI (input)

If it's not possible to connected in this way, is there then an alternative manner because I'm going one using my
current devices normally the AD9833 and the PIC18F2550 because both they support SPI protocol

Question 2
========
In which mode can I the I/O pins for the data communication SPI?

I hope that all help me with my problem, it's for an lab project in school

sclk op sclk
een i.o pin op fsync
sdo van pic op sdi van dds.

Jojo,

Inderdaad ik maak gebruik van het SPI protocol en maak gebruik van de ingebouwde functies van MicroC SPI_Write() hebben we enkel nodig

Example:

CONTROL_REG = 0x2008
DATA_REG = 0x000346DC

Dat is mijn code:

PORT_CE = 0; // Begin transmitting
Delay_µs(250);
SPI_Write(0x08); // Write Control register
Delay_µs(250);
SPI_Write(0xDC); // Write 28 bits word to
// Data register
Spi_Write(0x46);
Spi_Write(0x03);
Spi_Write(0x00);
Delay_µs(250);
PORT_CE = 1; // Stop transmitting
Ik denk dat het zo moet zijn?

Ik ga er even van uit dat je die SPI voor elkaar hebt en weet wat je wilt sturen. Dan zie ik alleen nog niet dat je de FSYNC even wiebert rondom ieder 16 bit naar de DDS.

Hallo iedereen

Voor de opgave gaat om een microcontroller gestuurde bodeplotter als dat project klaar is wil ik het wel sharen

Voor mij is die verbinding van mijn PIC met de DDS opgelost dus bedankt daarvoor.

Ik heb een test gedaan door de microcontroller als MASTER te laten werken en een data bytes te laten versturen en dat is volledig in orde.

Wat nu het grote probleem is : De microcontroller is de MASTER dus eenmalig SPI initialiseren denk ik. De SLAVE laat ik uitvoeren door een DDS chip van type AD9833

Nu is mijn bedoeling dat ik eerst eenmalig het control register initialiseer door instellen van bepaalde bits die nodig zijn voor de goede werking van de chip

Ik gebruik daarvoor de microcontroller 16F877A voor test doeleinden om daarna deze 18F2550 in te zetten als het project definitief in orde is.

Ik heb twee functies gemaakt :
1) Berekenen van het frequentiewoord, door de invoer van
de frequentie.
void Set_DDS_Frequency(unsigned short Freq);

2) Extracten van de MSB en LSB en sturen via SPI transfers
void Write_DDS_AD9833(unsigned int value);

Daarna een gewenste frequentie in te stellen, en wordt omgezet naar een 32 bit frequentie woord die wordt opgesplitst in 2 * 16 bit en zodanig dat ik twee keer die functie moet aanroepen om zo in totaal 4 SPI transfers te hebben.

Ik zit nu met de volgende vragen van de communicatie van PIC naar DDS.

1) Heb ik voldoende aan deze twee functies?
2) Moet ik ergens nog die tming functies gebruiken of is
dat niet meer relevant voor de aansturing van die chip?
3) Hierbij stuur ik het hoofdprogramma en vraag mij af wat
kan ik in een interrupt plaatsen bij het sturen van
die DDS chip?

4) Is de volgorde juist in het hoofdprogramma?

In bijlage mijn programma:
==========================



void interrupt()
{
  if(PIE1.ADIE) && (PIR1.ADIF))
  {
      Send_Byte(Vin);
      Send_byte(Vout);
  }
  
  if(PIE1.RCIE) && (PIR1.RCIF))
  {
     // Bij het ontvangen van een byte moet deze worden  
        doorgestuurd
     // Send_Byte(Vin);
  }
  
  PIR1.ADIF = 0;
}

void main()
{
     // Init the processor
   
     SCK_TRIS      = 0;           // SPI clock output
     SDO_TRIS      = 0;           // SDATA output
     FSYNC_TRIS    = 0;           // Chip Enable Output 
                                  // voor SPI comm

     SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4,
                        _SPI_DATA_SAMPLE_MIDDLE,
                        _SPI_CLK_IDLE_HIGH,
                        _SPI_HIGH_2_LOW);

     INTCON.PEIE = 1;         // enable peripheral 
                                 interrupts
     PIE1.ADIE = 1;           // enable ADC interrupt
     INTCON.GIE = 1;          // enable Global 
                                      interrupts, 
                                      turn on service
     Delay_ms(1000);

   
     // Init the DDS chip
     // 
     FSYNC_PORT = 0;
     // Setup control register of the DDS
     Write_DDS_AD9833(0x2100);
     Delay_us(10);
     FSYNC_PORT = 1;
   
     // Write data to DDS
     do
       {
         if(Button(&PORTB, 0, 1, 1) == 1)
            // Set Frequency
            Write_DDS_AD9833(Set_DDS_Frequency(10000);
            // listen for button push signalling a new  
               frequency
            // if so then call a routine to assemble the 
               data as above
            // and send it to the DDS
       }
     while(1);

     // Init the ADC
     Init_ADC();
     Vin  = Get_Sample_ADC(0);
     Vout = Get_Sample_ADC(1);
   
     // Init the UART
     UART_Init(9600);
     // Send_Byte(Vin);
     // Send_byte(Vout);
}

Kan iemand mij helpen en tips geven en hoe ik het zou kunnen aanpakken en wijzigen aanbrengen als er kleine foutjes zijn of tips geven
De routines kan ik sturen als ze nodig lijken

Grtz
S

Mijn Master SPI dat werkt volledig nu nog die MASTER naar SLAVE via SPI aan de praat krijgen.

Kan iemand mij eens helpen als die code juist is opgesteld?

Groetjes
S

http://www.circuitsonline.net/forum/faq#topickicks

Je wacht maar weer een dagje.

En nu eindelijk maar weer eens nadenken voordat je domme dingen doet?

[Bericht gewijzigd door Henry S. op (31%)]