Hallo Forum, habe folgendes Problem an dem ich jetzt schon einige Zeit rummache. Ich habe an meinem DSPic33FJ32 einen EEprom 25AA020A-I/OT der per SPI angesprochen wird. Der EEprom funktioniert d.h. ich kann lesen und schreiben, Aber nur wenn ich den Prozessor mit dem externen Quarz ohne PLL betreibe und die SPI Prescaler auf 1:1 stelle. Sobald ich die Einstellungen in irgendeiner Weise verändere z.B. den SPI Primärprescaler auf 1:2 stelle oder Oscillator PLL auf 40Mhz aktiviere bekomme ich keine Kommunikation mehr zustande. Im Datenblatt des E² steht das man sie SPI Prescaler nicht beide auf 1:1 stellen soll und das bei einer Spannungsversorgung zwischen 2.5 und 4V die maximale SPI Clock 5Mhz nicht überschreiten soll. Meine Einstellungen sind aber: beider Prescaler auf 1:1 und 10Mhz, und nur so funktioniert er. Ich muss aber für meine weitere Anwendungen den Oscillator PLL aktivieren. Kann mir jemand weiterhelfen
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 | }
|
Hi, hat keiner ne Idee warum der SPI Clock und der Chipselect nicht mehr synchron sind, habe ja nur den Oscillator PLL erhöht und dann den SPI Clock Prescaler auf 64 gesetzt damit ich unter den max. 10Mhz SPI Bus Clock bleibe. Was ich festgestellt habe ist, das der Chipselect schon bevor der SPI Clock mit seinen 8 Clocks fertig ist, den Baustein schon wieder deaktiviert. Dies sollte doch laut dem obigen Codeausschnitt gar nicht möglich sein? (Chipselect ist aktive low) M.f.G Stefan
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.