Forum: Digitale Signalverarbeitung / DSP / Machine Learning dsPIC SPI Programmierung


von Joe E. (ice-ty)


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

von Detlef _. (detlef_a)


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

von Joe E. (ice-ty)


Lesenswert?

Hey  Detlef,

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

Gruß joe

von Joe E. (ice-ty)


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

von Andreas K. (a-k)


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.

von Joe E. (ice-ty)


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ß

von Andreas K. (a-k)


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:
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.

von Joe E. (ice-ty)


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 :-)

von Joe E. (ice-ty)


Lesenswert?

Hallo,

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

Gruß Joe

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.