dsPIC30F C30 SPI

Gast #390360
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 #390362
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
Gast #390365
> 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

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.