Forum: Digitale Signalverarbeitung / DSP / Machine Learning dsPIC30F C30 SPI


von MAX (Gast)


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

von MAX (Gast)


Lesenswert?

noch niemand das SPI vom dsPIC verwendet?

finde das problem leider nicht,
MAX

von Schoaschi (Gast)


Lesenswert?

Ich kann dir nur den Tip geben: Schau auf die Seite von Fernando Heitor.
Es geht zwar hauptsächlich um PICs aber die Burschen und Mädchen dort,
können dir sicher mehr helfen als da.

mfg Schoasch

von Schoaschi (Gast)


Lesenswert?

PS.: Ein Link wäre auch nicht schlecht... sorry, vergessen.
www.fernando-heitor.de

von MAX (Gast)


Lesenswert?

danke für den hinweis, hab den post gleich mal dort ins forum gestellt

von ,,,, (Gast)


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?

von MAX (Gast)


Lesenswert?

hi ,,,,,

problem hat sich erledigt, ich habe CS high gemacht, bevor das 2. byte
übertragen wurde. der DAC wird gesetzt, wenn CS high wird

von David (Gast)


Lesenswert?

Ich habe die fertige Bibliothek von microchip genommen, die haben schon
alles fertig da. Und läuft bestens

mfG
David

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.