Forum: Mikrocontroller und Digitale Elektronik MSP430 SPI A25L080 Flash


von Joachim J. (felidae)


Angehängte Dateien:

Lesenswert?

ich habe einen MSP430f233 und einen A25L080(Falsh 8mbit spi).

ich versuche den Flash mit der spi Schnittstelle kontaktieren aber der 
Flash reagiert nicht.

ich habe an den A25L080 Pins gemessen siehe print_00.png.
D0 pin 1   CS
D1 pin 6   CLK
d2 pin 5   DIO
d3 pin 2   DO

der Befehl wird wie im Datenblatt gefordert gesendet.
der Flash antwortet aber nicht.


ich laufe auf der stelle und komme nicht weiter.
kann mir da eine den entscheidenden Tipp geben.

1
void SPI_init(void)
2
{
3
  //SPI - Schnittstelle anhalten
4
  UCB0CTL1 |= UCSWRST;
5
6
  //CLK, MOSI und MISO für UCB0 an Port 3
7
  P3SEL |= BIT1 + BIT2 + BIT3;
8
9
10
  // SPI - Modus einstellen
11
  // 3-pin, 8-bit SPI master MSB first
12
  UCB0CTL0 |= UCSYNC + UCMST + UCCKPL  + UCMSB + UCMODE_0; // + UCCKPH;
13
14
  // Taktquelle einstellen
15
  UCB0CTL1 |= UCSSEL_1;
16
17
18
19
  // Teiler für den Takt einstellen
20
  UCB0BR0 = 0x01; // keine Teilung -> 16MHz
21
  UCB0BR1 = 0x00;
22
23
  // Schnittstellenhardware einschalten
24
  UCB0CTL1 &= ~UCSWRST;
25
 
26
}
27
28
void SPI_send_beyte(char DATA)
29
{
30
  while (!(IFG2 & UCB0TXIFG));  //Sendepuffer bereit?
31
  UCB0TXBUF = DATA;                //daten senden
32
}

main.c:
1
...
2
char status[5];
3
4
SPI_init();
5
6
P2OUT &= ~(1<<7);            // chip selekt
7
SPI_send_beyte(0x05);        // befehl Read Status Register
8
status[0]=UCB0RXBUF;         
9
10
SPI_send_beyte(0x00);        // dummy beyte
11
while(!(IFG2 & UCB0RXIFG));  // watern bis zeichen empfangen
12
status[1]=UCB0RXBUF;         // zeichen auslesen
13
14
SPI_send_beyte(0x00);
15
while(!(IFG2 & UCB0RXIFG));
16
status[2]=UCB0RXBUF;
17
18
SPI_send_beyte(0x00);
19
while(!(IFG2 & UCB0RXIFG));
20
status[3]=UCB0RXBUF;
21
22
SPI_send_beyte(0x00);
23
while(!(IFG2 & UCB0RXIFG));
24
status[4]=UCB0RXBUF;
25
26
P2OUT |=  (1<<7);
27
28
...

von Dummschwaetzer (Gast)


Lesenswert?

Hold-Pin?

von Easylife (Gast)


Lesenswert?

Theorie: Das Flash kann mit "beytes" nichts anfangen, da kannst du noch 
so lange wässern... ;-)

Im Ernst:
Versuche doch mal die Clock nicht gleich auf das maximal zulässige (16 
MHz) zu stellen, sondern erstmal z.B. mit 1 MHz anzufangen.

von holger (Gast)


Lesenswert?

Für SPI Mode 0 würd ichs mal so versuchen:

  UCB0CTL0 |= UCSYNC + UCMST + UCCKPH  + UCMSB + UCMODE_0;

von Joachim J. (felidae)


Lesenswert?

Easylife schrieb:
> Versuche doch mal die Clock nicht gleich auf das maximal zulässige (16
> MHz) zu stellen, sondern erstmal z.B. mit 1 MHz anzufangen.

der Flash kann laut Datenblatt mit spi 100MHz arbeiten. da sollte er 
16MHz doch wohl schaffen oder?

1MHz hat auch nichts gebracht.

: Bearbeitet durch User
von Joachim J. (felidae)


Lesenswert?

holger schrieb:
> Für SPI Mode 0 würd ichs mal so versuchen:
>
>   UCB0CTL0 |= UCSYNC + UCMST + UCCKPH  + UCMSB + UCMODE_0;

hat nichts gebracht.

: Bearbeitet durch User
von Joachim J. (felidae)


Lesenswert?

Dummschwaetzer schrieb:
> Hold-Pin?

der hold PIN unterbricht die Übertragung und setzt sie zu einen späteren 
Zeitpunkt an dieser stelle fort. kann man nutzen wenn z.B. der µC von 
einem Interrupt bei der Übertragung unterbrochen wird.

ich habe ihn dauerhaft auf VCC geschaltet da ich diese Funktion nicht 
brauche.

von Joachim J. (felidae)


Lesenswert?

liegt es womöglich an meiner read Funktion?

ich sende ein dummy beyte damit die CLK weiter macht, den ohne bleibt 
die CLK low. ist das richtig?
1
void SPI_send_beyte(char DATA)
2
{
3
  char temp;
4
  while (!(IFG2 & UCB0TXIFG));    //Sendepuffer bereit?
5
  UCB0TXBUF = DATA;                //daten senden
6
  while(!(IFG2 & UCB0RXIFG));    //übertragung abgeschloßen?
7
  temp=UCB0RXBUF;          //daten auslesen
8
9
}
1
char SPI_read_beyte(void)
2
{
3
  char data;
4
5
  if(!(IFG2 & UCB0RXIFG))
6
    data=UCB0RXBUF;        //buffer leehren auslesen
7
8
  while (!(IFG2 & UCB0TXIFG));    //Sendepuffer bereit?
9
  UCB0TXBUF = 0x00;        //dummy beyte senden
10
11
  while(!(IFG2 & UCB0RXIFG));    //auf empfang warten
12
  data=UCB0RXBUF;          //daten auslesen
13
14
  return data;          //daten zurückgeben
15
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

joachim j. schrieb:
> beyte

Was ist das?

von Easylife (Gast)


Lesenswert?

joachim j. schrieb:
> liegt es womöglich an meiner read Funktion?
>
> ich sende ein dummy beyte damit die CLK weiter macht, den ohne bleibt
> die CLK low. ist das richtig?

ja, das ist richtig.

Falsch ist allerdings, wie du das Wort "Byte" schreibst, und das nervt 
langsam.

Bitte lerne was!


Die Signale auf deinem Scope legen nahe, dass du das Flash mit 5V 
Betreibst.
Im Datenblatt ist das absolute max. aber 4V. Üblicherweise nimmt man 
hier 3.3V.
Evtl. hast du dein Flash mit Überspannung kaputt gemacht.

von Joachim J. (felidae)


Lesenswert?

Easylife schrieb:
> Die Signale auf deinem Scope legen nahe, dass du das Flash mit 5V
> Betreibst.
> Im Datenblatt ist das absolute max. aber 4V. Üblicherweise nimmt man
> hier 3.3V.
> Evtl. hast du dein Flash mit Überspannung kaputt gemacht.

das täuscht ich habe nur die digitalen Eingänge benutzt.
der wert 5V steht für den analogen Kanal 1.
ich hab vergessen ihn auszublenden.
µC und Flash arbeiten mir 3,3V. das habe ich auch nachgemessen!

: Bearbeitet durch User
von Easylife (Gast)


Lesenswert?

Also von dem was du ans Flash schickst, sollte es antworten.
Könntest du mal den Schaltplan posten? Evtl. stimmt ja was mit der 
Beschaltung nicht.

Ausserdem wäre es gut, du misst die Signale mal analog und postest das 
als Screenshot. Evtl. stimmt ja mit den Signalpegeln etwas nicht.

von Easylife (Gast)


Lesenswert?

Du könntest auch mal einen 10k pullup an DO legen.
Dann müsste die Leitung ja high sein, solange CS_N high ist.
Wenn dem nicht so ist, treibt dein uC die DO Leitung wohl low.

von Stefan S. (mexakin)


Lesenswert?

noch mein Senf bzw Sachen mit denen ich bei SPI immer wieder 
rundgelaufen bin:

SPI gibt es in 4 verschiedenen Modi, je nachdem meisten clock und phase 
benannt, werden Daten mit Clock steigender oder fallender Flanke 
verarbeitet weitergesendet etc...

Nun ist es so dass es dazu keinen Hesrtellerstandart gibt, also ich zB 
habe mit MSP430, also Texas Instruments, einen Atmel Flash per SPI 
angesprochen, beide benutzen in ihren Datenblättern Bezeichnungen wie 
SPI Modus 1...4, ABER bei beiden sind diese Modi nicht gleich sondern 
unterschiedlich.

Also bevor man sich dann den Kopf zermatert einfach den externen IC, der 
meistens automatisch nur einen SPI Modus benutzt, mit verschiedenen 
MSP430 SPI Modi austesten, einer funktioniert dann und den merkt man 
sich.

Könnte mir vorstellen dass das auch dein Problem ist, weiss ich 
natürlich nicht, aber hoffe es hilft ein bisschen.

von Easylife (Gast)


Lesenswert?

Der SPI mode ist schon okay -> siehe Datenblatt.
Daten werden bei steigender clk Flanke übernommen und bei fallender 
Flanke geändert.

von holger (Gast)


Lesenswert?

Da fehlt bestimmt wieder der Abblockkondensator;)

von Joachim J. (felidae)


Angehängte Dateien:

Lesenswert?

hier meine Schaltung. die Signalpegel werde ich nachreichen.

von Joachim J. (felidae)


Angehängte Dateien:

Lesenswert?

Hier sind die Signalpegel für d0 d1 d2 d3

von Joachim J. (felidae)


Angehängte Dateien:

Lesenswert?

der Abblockkondensator ist auch da.
100nF Kondensator
10uF Tantal Elko
habe auch die vcc Spannung am PIN gemessen.

: Bearbeitet durch User
von Joachim J. (felidae)


Lesenswert?

da die Signalpegel alle ok aussehen.
schlussfolgere ich, dass der ic Defekt ist.
also werde ich ihn ablöten und austauschen.

aber vorher werde ich noch das mit dem Pullup an DO Pin 2 testen.

von Joachim J. (felidae)


Angehängte Dateien:

Lesenswert?

ein 10kohm Pullup zwischen DO und VCC hat das Signal an DO auf 2,97v 
angehoben.
Der µC treibt DO also nicht auf Low.

ich habe alles andere ausgeschlossen. der Flash muss Kaputt sein.

von Easylife (Gast)


Lesenswert?

Die (sauberen) 3V3 liegen aber auch (gemessen) am Flash an...?

Deine Blockkondensatoren sind auf der falschen Seite.
VCC ist Pin 8. "W" brauchste nicht so gut blocken... ;-)

Ja, tausche mal das Flash.

In deinem Layout sind die Leitungen zu Pin 1 (CS) und Pin 2 (DO) des 
Flash unzulässig nahe zusammen. Das hätte dir ein Designrulecheck 
angekreidet.

Würde mich nicht wundern, wenn hier nach dem Ätzen mal eine kleine 
Kupferbrücke bestanden hat, die dann, als das Flash zum ersten mal eine 
"1" treiben wollte durchgebrannt ist, incl. des Ausgangstreibers für DO.

von Joachim J. (felidae)


Lesenswert?

Easylife schrieb:
> In deinem Layout sind die Leitungen zu Pin 1 (CS) und Pin 2 (DO) des
> Flash unzulässig nahe zusammen. Das hätte dir ein Designrulecheck
> angekreidet.
>
> Würde mich nicht wundern, wenn hier nach dem Ätzen mal eine kleine
> Kupferbrücke bestanden hat, die dann, als das Flash zum ersten mal eine
> "1" treiben wollte durchgebrannt ist, incl. des Ausgangstreibers für DO.

ich löte und ätze nicht selbst. ich bin student und an der Hochschule 
haben wir einen Laser der die Platinen fertigt einen Lötofen zum smd 
Löten.

in Version 2 der Schaltung habe ich die Abstände aber schon 
ausgebessert.

von Joachim J. (felidae)


Lesenswert?

er GEEEEEEEEHT jaaaa!!! :)

hab einen neuen aufgelötet und siehe da :)

super.

danke für die hilfe.

von Joachim J. (felidae)


Angehängte Dateien:

Lesenswert?

hir der beweis:)

von Easylife (Gast)


Lesenswert?

Die CS high phase könntest du noch länger machen...
Schön zu hören, dass du Erfolg hattest und jetzt alles geht.

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.