MSP430 SPI A25L080 Flash

#3629439
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
...
Angehängte Dateien:
#3630421
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
}
Gast #3630604
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.
#3630628
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!
#3630660
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.
Gast #3635231
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.
#3635430
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren