www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP dsPIC SPI Programmierung


Autor: Joe E. (ice-ty)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bin neu hier und hoffe, dass ich auch im richtigen Forum gelandet bin.
Setze mich gerade mit der SPI Programmierung für den dsPIC 30F6010 
auseinander
und komme nicht voran.
Kann mir jemand sagen wie ich im Allgemeinen von Anfang bis Ende daran 
gehen soll.
Ich kenne mich bisher nicht mit Microship aus, daher tut es mir leid, 
dass ich euch mit so einer primitiven Frage belaste.

Gruß joe

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Kann mir jemand sagen wie ich im Allgemeinen von Anfang bis Ende daran
>>gehen soll.

?????????????

http://www.catb.org/~esr/faqs/smart-questions.html

Cheers
Detlef

Autor: Joe E. (ice-ty)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey  Detlef,

danke für den Link. Werd ich mir zu Herzen nehmen.

Gruß joe

Autor: Joe E. (ice-ty)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

also meine genaue Frage ist eigentlich vielmehr,
was ich alles initialisieren muss bevor ich senden und
empfangen kann.
Ich habe einen Teil des bisher geschriebenen Code nachfolgend eingefügt.


  TRISFbits.TRISF2 = 1;  //SDI1
  TRISFbits.TRISF3 = 0;  //SDO1
  TRISFbits.TRISF6 = 0;  //SCK1


   IFS0bits.SPI1IF = 0;
   IEC0bits.SPI1IE = 0;
   IPC2bits.SPI1IP = 0;
   SPI1CON = 0x033F;  //0b0000 0011 0011 1111
   SPI1STAT = 0x8000; // 0b1000 0000 0000 0000

  empfangbyte = SPI1BUF;
//  IFS0bits.SPI1IF = 0;
  while ( SPI1STATbits.SPITBF);

  SPI1BUF = sendebyte;

  while ( !SPI1STATbits.SPIRBF) ;

  empfangbyte = SPI1BUF;

Ich habe das Osci dran und es passiert nichts.
Übersehe ich etwas was noch gesetzt, definiert oder programmiert werden 
muss??

Freue mich über jede Antwort.

MfG Joe

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joe E. wrote:

>    SPI1CON = 0x033F;  //0b0000 0011 0011 1111
>    SPI1STAT = 0x8000; // 0b1000 0000 0000 0000

Also ist der SPI-Takt identisch mit dem CPU-Takt. Du hast also einen 
CPU-Takt <= 10MHz?

>   empfangbyte = SPI1BUF;
> //  IFS0bits.SPI1IF = 0;
>   while ( SPI1STATbits.SPITBF);

Bei SPI Master ist senden und empfangen hardwareseitig der gleiche 
Vorgang. Und das SPI-Modul taktet nur, wenn es was zum senden hat. Hier 
nicht.

Autor: Joe E. (ice-ty)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Andreas,

ich habe mich mit der Baudrate und dem Takt noch nicht auseinander 
gesetzt.
Deshalb habe ich beide Vorteiler auf 1:1 gesetzt.

empfangbyte = SPI1BUF; <- das habe ich nur gesetzt, um den RX-Buffer zu 
leeren
//  IFS0bits.SPI1IF = 0;
  while ( SPI1STATbits.SPITBF);

die while-Schleife muss ich doch so setzen und warten bis der TX- Buffer 
frei ist oder??

gruß

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joe E. wrote:

> Deshalb habe ich beide Vorteiler auf 1:1 gesetzt.

Deshalb auch mein Kommentar. Mehr als 10MHz ist gemäss Datasheet nicht 
zulässig, wenn der Controller also höher taktet...

> die while-Schleife muss ich doch so setzen und warten bis der TX- Buffer
> frei ist oder??

Erlaubt ist es, nötig aber eigentlich nicht, denn wenn du immer über 
diese Routine geht, dann kann da nichts drin stehen.

Bei mir (30F2010) sieht das so aus:
// CON
#define MODE16  (1<<10)
#define CKE(b)  ((b)<<8)
#define CKP(b)  ((b)<<6)
#define PPRE(b)  ((b)<<0)
#define SPRE(b)  ((b)<<2)
#define MSTREN  (1<<5)

// STAT
#define SPIEN  (1<<15)

void
init(void)
{
#if F_CPU > 30000000
    SPI1CON = CKP(0) | CKE(1) | MSTREN | MODE16 | PPRE(3) | SPRE(4);  // PPRE=1:1, SPRE=4:1
#elif F_CPU > 20000000
    SPI1CON = CKP(0) | CKE(1) | MSTREN | MODE16 | PPRE(3) | SPRE(5);  // PPRE=1:1, SPRE=3:1
#elif F_CPU > 10000000
    SPI1CON = CKP(0) | CKE(1) | MSTREN | MODE16 | PPRE(3) | SPRE(6);  // PPRE=1:1, SPRE=2:1
#else
    SPI1CON = CKP(0) | CKE(1) | MSTREN | MODE16 | PPRE(3) | SPRE(7);  // PPRE=1:1, SPRE=1:1
#endif
    SPI1STAT = SPIEN;
}

unsigned
spi(unsigned data)
{
    SPI1BUF = data;
    while (!SPI1STATbits.SPIRBF)
  ;
    return SPI1BUF;
}

Abgesehen vom SSEL werden die SPI-Pins mir nicht eigens initialisiert, 
das macht der Controller selber.

Autor: Joe E. (ice-ty)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Hilfe.
Ich habe mittlerweile mehrere Wege getestet.
Selbst wenn ich PPRE und SPRE eingestellt habe, und
zusätzlich wahrlos irgenwelche nutzlose Bits in den BUF
schreibe, so passiert dennoch nichts.
Werde es weiter versuchen.

Gruß vom absoluten Beginner :-)

Autor: Joe E. (ice-ty)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe den Fehler gefunden. Die Optokoppler konnten die Taktfrequenz nicht 
mitgehen.
Danke für eure Beiträge.

Gruß Joe

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.