dsPIC30F C30 SPI

Gast #390360
Lesenswert?

Hallo,

wollte mir gerade eine SPI lib programmieren. das setzen eines 16bid
DACs funktioniert auch teilweise. meine funktion set_adc funktioniert
nur richtig wenn ich 1ms warte, bevor ich das CS wieder high setzte,
ansonsten gibt er einen falschen wert aus. kann mir jemand sagen warum?
- der dsPIC läuft mit 30MIPs sprich 120MHz, hab das ganze auch mit
7.5MIPs (30MHz) versucht, hat auch nicht geklappt.

hier das datasheet des DACs:
http://pdfserv.maxim-ic.com/en/ds/MAX541-MAX542.pdf

hier mal der code:

...

void set_dac(unsigned int value)
{
  SPI1_SS=0;  //set SS1 low
  SPI1_master_tx((unsigned char)(value>>8));
  SPI1_master_tx((unsigned char)(value)&0xFF);
  //delay_ms(1);
  SPI1_SS=1;  //set SS1 high
}

die spi.h:

#define SPI1_SDI    PORTFbits.RF2    //SDI1
#define SPI1_SDI_DIR  TRISFbits.TRISF2  //SDI1 DIR
#define SPI1_SDO    PORTFbits.RF3    //SDO1
#define SPI1_SDO_DIR  TRISFbits.TRISF3  //SDO1 DIR
#define SPI1_SCK    PORTFbits.RE8    //SCK1
#define SPI1_SCK_DIR  TRISEbits.TRISE8  //SCK1 DIR
#define SPI1_SS      PORTBbits.RB3    //SS1
#define SPI1_SS_DIR    TRISBbits.TRISB3  //SS1 DIR

void SPI1_master_init(unsigned char spi_clock)
{
  SPI1_SS=1;      //set SS1 high
  SPI1_SDI_DIR=1;    //SDI1 as input
  SPI1_SDO_DIR=0;    //SDO1 as output
  SPI1_SCK_DIR=0;    //SCK1 as output
  SPI1_SS_DIR=0;    //SS1 as output

  SPI1STAT=0x00;
  SPI1CON=spi_clock&0x1F;  //set baudrate
  SPI1CONbits.MSTEN=1;  //Master enable
  SPI1STATbits.SPIEN=1;  //spi enable
}

void SPI1_master_tx(unsigned char data)
{
    SPI1BUF=data;
    while(SPI1STATbits.SPITBF);
}

wäre toll wenn mir jemand weiterhelfen könnte, bin schon seit fast 2
tagen auf fehlersuche :-/

gruß,
MAX
Gast #390365
Lesenswert?

> meine funktion set_adc funktioniert nur richtig wenn ich
> 1ms warte, bevor ich das CS wieder high setzte, ansonsten
> gibt er einen falschen wert aus.

Vielleicht braucht der DAC eben einen Moment. Mal in dessen Datenblatt
geschaut?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren