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
>>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
Hey Detlef, danke für den Link. Werd ich mir zu Herzen nehmen. Gruß joe
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
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.
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ß
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.
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 :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.