Hi,
hatte gestern mal das Oszi dran und konnte herrlichen Ausdruck mit
Folgenden Einstellungen machen (siehe Anhang 1, oben Chipselect (aktive
low) und der untere Graph beinhaltet den SPI Clock)
- PLL aus
- 10Mhz Quarz
- SPI Mode 3
- CPU Pins korrekt konfiguriert
- Beide SPI Prescaler auf 1:1 (was laut Datenblatt vermieden werden
sollte)
Beim zweiten Versuch habe ich PLL aktiviert, (PLL funktioniert bisher
tadellos, da ich schon länger mit aktiviertem PLL arbeite) und den
Sekundären SPI Prescaler auf 1:16 gestellt. Ergebnis (siehe Anhang 2):
SPI Clock und der Chipselect passen irgendwie nicht mehr zusammen.
Daher kein Einlesen mehr möglich, auch wenn ich die vom Datenblatt
geforderten zeitlichen Pausen hinzufüge bekomme ich kein Daten mehr.
SPI Init Funktion
1 | IEC0bits.SPI1IE = 0; // Interrupt deaktivieren
|
2 | SPI1CON1bits.MSTEN = 0; // Master Modus aktivieren
|
3 | SPI1CON1bits.PPRE = PRIPRE_1_1;
|
4 | SPI1CON1bits.SPRE = SECPRE_1_1;
|
5 | SPI1CON1bits.DISSCK = 0; // Clock Pin aktivieren
|
6 | SPI1CON1bits.DISSDO = 0; // SDOx pin is controlled by the module
|
7 | SPI1CON1bits.MODE16 = 0; // 8Bit Übertragung
|
8 | SPI1CON1bits.SMP = 0; // Eingehende Daten werden in der Mitte abgetastet
|
9 | SPI1CON1bits.SSEN = 0; //
|
10 | SPI1CON1bits.CKE =1;
|
11 | SPI1CON1bits.CKP = 0;
|
12 | SPI1CON1bits.MSTEN = 1;
|
13 | SPI1STATbits.SPIEN = 1; // Aktiviere SPI Modul
|
14 | SPI1BUF = 0x00; // Write data to be transmitted
|
Status Abfrage des E² Baustein, zum Testen in einer while Schleife
1 | while(1)
|
2 | {
|
3 | testCounter++;
|
4 |
|
5 | //1. Write Enable im EEprom setzen
|
6 | //--------------------------------------
|
7 | ChipSelect = 0; //Aktiv Low
|
8 | SPI1BUF = 0x06; //Write Enable Code
|
9 | while (SPI1STATbits.SPITBF); //Warte bis Code versendet wurde
|
10 | dummyByte = SPI1BUF; //Read Dummy Byte
|
11 | ChipSelect =1 ;
|
12 |
|
13 | //2. Lese Status Register ein, Code 0x05h
|
14 | //----------------------------------------
|
15 | ChipSelect = 0;
|
16 | SPI1BUF = 0x05; //Write Enable Code
|
17 | while (SPI1STATbits.SPITBF); //Warte bis Code versendet wurde
|
18 | dummyByte = SPI1BUF; //Read Dummy Byte
|
19 |
|
20 | //8Bits einlesen (das Ergebnis müsste 2 ergeben)
|
21 | SPI1BUF=0x00;
|
22 | while (SPI1STATbits.SPITBF);
|
23 | //SPI1STATbits.SPIROV = 0;
|
24 | while ( !SPI1STATbits.SPIRBF); // write and read 8 hi bits
|
25 |
|
26 | //Lese Status ein, hier muss die 2 eingelesen werden
|
27 | status = SPI1BUF;
|
28 | if(status==2)
|
29 | {
|
30 | testCounter = 0; //Breakpoint falls Status == 2
|
31 | }
|
32 | ChipSelect = 1;
|
33 | }
|