dsPIC SPI Programmierung

OP #694738
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
OP #695663
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
#695678
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.
OP #695716
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ß
#696275
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:
1
// CON
2
#define MODE16  (1<<10)
3
#define CKE(b)  ((b)<<8)
4
#define CKP(b)  ((b)<<6)
5
#define PPRE(b)  ((b)<<0)
6
#define SPRE(b)  ((b)<<2)
7
#define MSTREN  (1<<5)
8

9
// STAT
10
#define SPIEN  (1<<15)
11

12
void
13
init(void)
14
{
15
#if F_CPU > 30000000
16
    SPI1CON = CKP(0) | CKE(1) | MSTREN | MODE16 | PPRE(3) | SPRE(4);  // PPRE=1:1, SPRE=4:1
17
#elif F_CPU > 20000000
18
    SPI1CON = CKP(0) | CKE(1) | MSTREN | MODE16 | PPRE(3) | SPRE(5);  // PPRE=1:1, SPRE=3:1
19
#elif F_CPU > 10000000
20
    SPI1CON = CKP(0) | CKE(1) | MSTREN | MODE16 | PPRE(3) | SPRE(6);  // PPRE=1:1, SPRE=2:1
21
#else
22
    SPI1CON = CKP(0) | CKE(1) | MSTREN | MODE16 | PPRE(3) | SPRE(7);  // PPRE=1:1, SPRE=1:1
23
#endif
24
    SPI1STAT = SPIEN;
25
}
26

27
unsigned
28
spi(unsigned data)
29
{
30
    SPI1BUF = data;
31
    while (!SPI1STATbits.SPIRBF)
32
  ;
33
    return SPI1BUF;
34
}

Abgesehen vom SSEL werden die SPI-Pins mir nicht eigens initialisiert, 
das macht der Controller selber.
OP #696431
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 :-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 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.