Forum: Mikrocontroller und Digitale Elektronik Dspic33 EEprom SPI Problem


von Stefan (Gast)


Lesenswert?

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

von Bernd Rüter (Gast)


Lesenswert?

Na,
das wundert mich jetzt aber.
Ist der richtige SPI-Mode gewählt ?

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

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
}

von Stefan (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

Nachtrag,

wäre es möglich mit DMA den Konflikt zu umgehen?

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.