Forum: Mikrocontroller und Digitale Elektronik ST26 16MBit Flash <.> XMEGA256A3BU


von Fabian D. (Gast)


Lesenswert?

Moin Moin,

ich werde noch Wahnsinnig. Versuche einfach schon zu lange ein Byte in 
das Flash zu schreiben.. Leider erfolglos. Was übersehe ich? Was mache 
ich falsch?!

SPI läuft! Kann Informationen die im Datenblatt (wie die Informationen 
vom Chip auslesen..) Also das kann nicht das Problem sein.

Hier ist mein Hauptprogramm, wo ich versuche ein Byte zu schreiben und 
das wieder zurück zu lesen.
1
int main(void){
2
  
3
  PORTR.DIR    =  (1<<0|1<<1); // state_leds_output
4
  PORTR.OUTSET  =  (1<<0|1<<1); // state_leds_off
5
  LED_OFF
6
7
  Spi_Master_USARTD0_Init(FlashSPI,5000,0,0);
8
  
9
   sst26_reset(DataFlash,FlashSPI);
10
11
//   sst26_read_jedec(DataFlash,FlashSPI);
12
//   if (DataFlash->JEDEC_ID[0]==0xBF)
13
//   {
14
//     if (DataFlash->JEDEC_ID[1]==0x26)
15
//     {
16
//       if (DataFlash->JEDEC_ID[2]==0x41)
17
//       {
18
//         sst26_ONLINE
19
//       }else{
20
//         sst26_OFFLINE
21
//       }
22
//     }
23
//   }
24
25
  DataFlash->TxBuffer[0]= 5;
26
  sst26_write_start(DataFlash,FlashSPI);
27
  sst26_write_page(DataFlash,FlashSPI,0x00000000,1);
28
  sst26_write_stop(DataFlash,FlashSPI);
29
30
    while (1){  
31
    
32
    sst26_read(DataFlash,FlashSPI,0x00000000,1);
33
34
    if (DataFlash->RxBuffer[0]==5)
35
    {
36
      LED_ON
37
      }else{
38
      LED_OFF
39
    }  
40
    }
41
}

Funktion zum Page schreiben..
1
void sst26_write_page(sst26_t *DataFlash, spi_usart_t *FlashSPI, uint32_t addr, uint8_t leng){
2
  
3
  sst26_wait_is_busy(DataFlash,FlashSPI);    
4
5
  do
6
  {
7
    sst26_read_state(DataFlash,FlashSPI);
8
  } while (!DataFlash->StateFlags.Wel);  
9
  
10
  Spi_USARTD0_Slave_Select_Low(FlashSPI);
11
  
12
  Spi_USARTD0_Rx_Tx(0x02);
13
  Spi_USARTD0_Rx_Tx((uint8_t)(addr>>16)&0xFF);
14
  Spi_USARTD0_Rx_Tx((uint8_t)(addr>>8 )&0xFF);
15
  Spi_USARTD0_Rx_Tx((uint8_t)addr&0xFF);
16
  
17
  
18
  for (uint8_t byte=0;byte<leng;byte++)
19
  {
20
    Spi_USARTD0_Rx_Tx(DataFlash->TxBuffer[byte]);    
21
  }
22
    
23
  
24
  Spi_USARTD0_Slave_Select_High(FlashSPI);
25
}

Funktion zum lesen
1
void sst26_read(sst26_t *DataFlash, spi_usart_t *FlashSPI, uint32_t addr, uint8_t leng){
2
  
3
   sst26_wait_is_busy(DataFlash,FlashSPI);
4
       
5
  Spi_USARTD0_Slave_Select_Low(FlashSPI);
6
  
7
  Spi_USARTD0_Rx_Tx(0x03);
8
  Spi_USARTD0_Rx_Tx((addr>>16)&0xFF);
9
  Spi_USARTD0_Rx_Tx((addr>>8)&0xFF);
10
  Spi_USARTD0_Rx_Tx((addr&0xFF));
11
  
12
  for (uint8_t byte=0;byte<leng;byte++)
13
  {
14
    DataFlash->RxBuffer[byte]=Spi_USARTD0_Rx_Tx(0x00);    
15
  }
16
  
17
18
  Spi_USARTD0_Slave_Select_High(FlashSPI);
19
}

von Fabian D. (Gast)


Lesenswert?

Warten so lange der Flash beschäftigt ist..
1
void sst26_wait_is_busy(sst26_t *DataFlash, spi_usart_t *FlashSPI){
2
  
3
  while(DataFlash->StateFlags.Busy==1){
4
    sst26_read_state(DataFlash, FlashSPI);
5
  }
6
}

Status Register auslesen..
1
void sst26_read_state(sst26_t *DataFlash, spi_usart_t *FlashSPI){
2
  
3
  Spi_USARTD0_Slave_Select_Low(FlashSPI);
4
  Spi_USARTD0_Rx_Tx(0x05);
5
  DataFlash->StateReg = Spi_USARTD0_Rx_Tx(0x00);
6
  Spi_USARTD0_Slave_Select_High(FlashSPI);
7
  
8
  /* clear all flags */
9
  DataFlash->StateFlags.Busy  =0;
10
  DataFlash->StateFlags.Sec  =0;
11
  DataFlash->StateFlags.Wel  =0;
12
  DataFlash->StateFlags.Wpld  =0;
13
  DataFlash->StateFlags.Wse  =0;
14
  DataFlash->StateFlags.Wsp  =0;
15
  
16
  if (DataFlash->StateReg&(1<<0))
17
  DataFlash->StateFlags.Busy=1;
18
19
  if (DataFlash->StateReg&(1<<1))
20
  DataFlash->StateFlags.Wel=1;
21
  
22
  if (DataFlash->StateReg&(1<<2))
23
  DataFlash->StateFlags.Wse=1;
24
25
  if (DataFlash->StateReg&(1<<3))
26
  DataFlash->StateFlags.Wsp=1;
27
  
28
  if (DataFlash->StateReg&(1<<4))
29
  DataFlash->StateFlags.Wpld=1;
30
  
31
  if (DataFlash->StateReg&(1<<5))
32
  DataFlash->StateFlags.Sec=1;
33
}

von Bastian W. (jackfrost)


Lesenswert?

Linke mal das DB vom SPI Flash , hat das ein WREN Bit das du vor dem 
Schreiben setzen musst ? Der SS vom SPID ist auch ein Ausgang ?

Kannst du eine ganze Page lesen ?

Gruß JackFrost

von Fabian D. (Gast)


Lesenswert?

Moin,

das WREN setze ich und kann ich erfolgreich zurück lesen. Damit 
funktioniert der SPI.

Hier der Link zum DB

ww1.microchip.com/downloads/en/DeviceDoc/20005262A.pdf

von A. B. (Gast)


Lesenswert?

Was heißt denn "Leider erfolglos"???

Wie schon angedeutet wurde: SST25VF016B hat wie üblich ein WEL Bit, dass 
gesetzt werden muss. Oben habe ich aber nur eine Abfrage auf "gesetzt" 
gesehen, aber nicht, dass es irgendwo auch tatsächlich gesetzt wird.

Außerdem wäre es hilfreich, das Status-Register an dieversen Stellen 
auszulesen und auszugeben. Irgendwelche Block Protection???

von Fabian D. (Gast)


Lesenswert?

Ich habe keine Block Protection gesetzt.
Das WEL habe ich geprüft und es ist auf 1 gesetzt.

von Pete K. (pete77)


Lesenswert?

Aus dem DB:

5.17 Sector-Erase
The Sector-Erase instruction clears all bits in the
selected 4 KByte sector to ‘1,’ but it does not change a
protected memory area. Prior to any write operation,
the Write-Enable (WREN) instruction must be executed.


Außerdem kannst Du nur ein leere (d.h. vorher gelöschte) page 
beschreiben.

von A. B. (Gast)


Lesenswert?

Fabian D. schrieb:
> Ich habe keine Block Protection gesetzt.

Die Frage war aber, ob event. eine Block Protection gesetzt IST, nicht 
wann oder von wem sie ggf. gesetzt wurde.

> Das WEL habe ich geprüft und es ist auf 1 gesetzt.

Das Setzen ist aber nirgends zu sehen.

Das Ding hat noch ein Configuration Reg., da würde sich ein Block 
lohnen.
Und wie sieht's mit der Beschaltung von WP und HOLD aus?

Und die wichtigste Frage überhaupt ist immer noch offen: Was heißt 
"Leider erfolglos"?
Z. B.: Geht nach Deaktivieren vom CS am Ende des Page Write das Busy Bit 
auf 1 und bleibt auch 'ne Weile so? Und das WEL automatisch wieder auf 
0.
Was stand vorher in der betreffenden Page, was steht hinterher drin ...

Ein einfaches "geht nicht" ist ein ziemlich leere Aussage ...

von Fabian D. (Gast)


Lesenswert?

A. B. schrieb:
> Die Frage war aber, ob event. eine Block Protection gesetzt IST, nicht
> wann oder von wem sie ggf. gesetzt wurde.

Ich deaktiviere diese Funktion mit
1
void sst26_block_protection_unlock(sst26_t *DataFlash, spi_usart_t *FlashSPI){
2
  
3
  sst26_wait_is_busy(DataFlash,FlashSPI);
4
  sst26_spi_send(DataFlash,FlashSPI,0x98,1);
5
}

A. B. schrieb:
> Das Setzen ist aber nirgends zu sehen.

Wo kann ich dieses Bit bitte setzen?

A. B. schrieb:
> Das Ding hat noch ein Configuration Reg., da würde sich ein Block
> lohnen.
> Und wie sieht's mit der Beschaltung von WP und HOLD aus?

Das ist ein Dev. Board. Die Pins sind so verschaltet, dass man zugriff 
drauf hat. Das Board ist ein XPlainedA3BU.

A. B. schrieb:
> Und die wichtigste Frage überhaupt ist immer noch offen: Was heißt
> "Leider erfolglos"?
> Z. B.: Geht nach Deaktivieren vom CS am Ende des Page Write das Busy Bit
> auf 1 und bleibt auch 'ne Weile so? Und das WEL automatisch wieder auf
> 0.
> Was stand vorher in der betreffenden Page, was steht hinterher drin ...
>
> Ein einfaches "geht nicht" ist ein ziemlich leere Aussage ...

Das kann ich noch mal prüfen, ob das sich das Busy Bit überhaupt nach 
schreiben der Page ändert. Würde das der Fall sein, würdes es bedeuten 
das er was gespeichert hat bzw. was verarbeitet.

von A. B. (Gast)


Lesenswert?

Fabian D. schrieb:
> A. B. schrieb:
>> Die Frage war aber, ob event. eine Block Protection gesetzt IST, nicht
>> wann oder von wem sie ggf. gesetzt wurde.
>
> Ich deaktiviere diese Funktion mit
>
1
> void sst26_block_protection_unlock(sst26_t *DataFlash, spi_usart_t 
2
> *FlashSPI){
3
> 
4
>   sst26_wait_is_busy(DataFlash,FlashSPI);
5
>   sst26_spi_send(DataFlash,FlashSPI,0x98,1);
6
> }
7
>

"The Global Block-Protection Unlock (ULBPR) instruc-
tion clears all write-protection bits in the Block-Protec-
tion register, except for those bits that have been
locked down with the nVWLDR command."

Die Block Protection könnte (versehentlich) permanent gesetzt sein. 
Deshalb Kontrolle im Status und Configuration Reg. nötig.

> A. B. schrieb:
>> Das Setzen ist aber nirgends zu sehen.
>
> Wo kann ich dieses Bit bitte setzen?

"The Write Enable (WREN) instruction sets the Write-
Enable-Latch bit in the Status register to ‘1, ..."

Ist ja vielleicht im sst26_write_start drin, aber ...

>> Und wie sieht's mit der Beschaltung von WP und HOLD aus?

> Das ist ein Dev. Board. Die Pins sind so verschaltet, dass man zugriff
> drauf hat. Das Board ist ein XPlainedA3BU.

Die Frage ist, welche Pegel tatsächlich anliegen. Insbesondere dürfen 
die nicht "floaten", sondern müssen auf definiertem Pegel liegen (und 
halt dem richtigem).

> Das kann ich noch mal prüfen, ob das sich das Busy Bit überhaupt nach
> schreiben der Page ändert. Würde das der Fall sein, würdes es bedeuten
> das er was gespeichert hat bzw. was verarbeitet.

Richtig, und auch das WEL Bit muss danach automatisch wieder auf '0' 
gehen.

von Fabian D. (Gast)


Lesenswert?

A. B. schrieb:
> "The Global Block-Protection Unlock (ULBPR) instruc-
> tion clears all write-protection bits in the Block-Protec-
> tion register, except for those bits that have been
> locked down with the nVWLDR command."
>
> Die Block Protection könnte (versehentlich) permanent gesetzt sein.
> Deshalb Kontrolle im Status und Configuration Reg. nötig.

Das werde ich direkt mal checken.

A. B. schrieb:
> "The Write Enable (WREN) instruction sets the Write-
> Enable-Latch bit in the Status register to ‘1, ..."
>
> Ist ja vielleicht im sst26_write_start drin, aber ...


Aber? Das ist da mit drin, damit setze ich das Bit und eine Funktion für 
das löschen gibt es auch.

A. B. schrieb:
> Die Frage ist, welche Pegel tatsächlich anliegen. Insbesondere dürfen
> die nicht "floaten", sondern müssen auf definiertem Pegel liegen (und
> halt dem richtigem).

Habe ich kontrolliert, liegen beide auf High.

von Bastian W. (jackfrost)


Lesenswert?

Setzt du WREN bevor du die Block Protection deaktivierst , wenn dann ist 
WREN wieder deaktiviert. WREN muss immer dann gesetzt werden, wenn du 
schreiben willst. Unter 4.5.1 steht wann WREN immer deaktiviert wird.

Gruß JackFrost

von Fabian D. (Gast)


Lesenswert?

Also wenn ich block_protection_unlock aufrufe, Empfange ich auf einmal 
was auf MISO. Nur leider nicht das was ich vorher geschrieben habe.

von Bastian W. (jackfrost)


Lesenswert?

Was sendest du und was ließt du wieder aus ? Hast du vorher WREN erneut 
gesetzt ? Was ließt du aus wenn du die ersten 256 Bytes ausliest ?

Gruß JackFrost

von Fabian D. (Gast)


Lesenswert?

Bastian W. schrieb:
> Was sendest du und was ließt du wieder aus ? Hast du vorher WREN
> erneut
> gesetzt ? Was ließt du aus wenn du die ersten 256 Bytes ausliest ?
>
> Gruß JackFrost
1
void sst26_block_protection_unlock(sst26_t *DataFlash, spi_usart_t *FlashSPI){
2
  
3
  sst26_write_start(DataFlash,FlashSPI);
4
  sst26_wait_is_busy(DataFlash,FlashSPI);
5
  sst26_spi_send(DataFlash,FlashSPI,0x98,1);
6
}

Muss ich jedes mal 255 Bytes schreiben und auch lesen?

von Bastian W. (jackfrost)


Lesenswert?

Schreiben kannst maximal eine ganze Page und lesen den ganzen Flash am 
Stück.

Ich meinte was willst du speichern , z.B. 0x55 und was bekommst du beim 
Auslesen raus z.B 0xFF. Die ersten 256 Bytes sind Interessant um zu 
sehen ob die alle noch auf 0xFF stehen. Nur wenn die auf 0xFF stehen 
kannst du sie beschreiben.

Gruß JackFrost

von Fabian D. (Gast)


Lesenswert?

Verstehe ich es richtig, dass die erste lese und schreib Adresse auf 
0x000000 liegt?

von Fabian D. (Gast)


Lesenswert?

Bastian W. schrieb:
> Was sendest du und was ließt du wieder aus ? Hast du vorher WREN
> erneut
> gesetzt ? Was ließt du aus wenn du die ersten 256 Bytes ausliest ?
>
> Gruß JackFrost

Ich bekomme von jeder Adresse die ich lesen will eine 0x02

von Bastian W. (jackfrost)


Lesenswert?

Bekommst du das auch wenn du einen Chiperrase machst ?

Normal kannst du ab 0x000000 schreiben und lesen. Wenn die Zellen aber 
0x02 enthalten kannst du maximal noch das Bit 1 in den Zellen 
beschreiben. So lange du kein 0xFF bekommst kannst du die Zellen nicht 
beschreiben.

Ließ mal 256 Zellen ab 0x00FFFF aus. War der Flash neu ?

Nach dem Abfragen der Stati geht CS kurz auf High , oder ?

Gruß JackFrost

von Fabian D. (Gast)


Lesenswert?

Bastian W. schrieb:
> Bekommst du das auch wenn du einen Chiperrase machst ?
> Normal kannst du ab 0x000000 schreiben und lesen. Wenn die Zellen aber
> 0x02 enthalten kannst du maximal noch das Bit 1 in den Zellen
> beschreiben. So lange du kein 0xFF bekommst kannst du die Zellen nicht
> beschreiben.
>
> Ließ mal 256 Zellen ab 0x00FFFF aus. War der Flash neu ?
> Nach dem Abfragen der Stati geht CS kurz auf High , oder ?
> Gruß JackFrost

Bastian W. schrieb:
> Bekommst du das auch wenn du einen Chiperrase machst ?
> Normal kannst du ab 0x000000 schreiben und lesen. Wenn die Zellen aber
> 0x02 enthalten kannst du maximal noch das Bit 1 in den Zellen
> beschreiben. So lange du kein 0xFF bekommst kannst du die Zellen nicht
> beschreiben.
>
> Ließ mal 256 Zellen ab 0x00FFFF aus. War der Flash neu ?
> Nach dem Abfragen der Stati geht CS kurz auf High , oder ?
> Gruß JackFrost

Der Flash ist neu. Meinst du CS oder das Busy Flag?

von Bastian W. (jackfrost)


Lesenswert?

Ich mein CS. Aber in deinem Code hab ich gesehen du setzt das immer kurz 
auf High.

Ließt du immer noch 0x02 aus wenn du einen Chiperase machst ?

Gruß JackFrost

von Fabian D. (Gast)


Lesenswert?

Das muss ich noch mal nach schauen. Hast du Skype?

von Fabian D. (Gast)


Lesenswert?

Bastian W. schrieb:
> Ich mein CS. Aber in deinem Code hab ich gesehen du setzt das
> immer kurz auf High.
> Ließt du immer noch 0x02 aus wenn du einen Chiperase machst ?
> Gruß JackFrost

Ich habe die SPI Signale alle mit dem Oszilloskop angeschaut, die 
funktionieren soweit.

von Bastian W. (jackfrost)


Lesenswert?

Ich hab Skype, bin aber atm nicht im Land.

Hast du de Flash mal komplett mit 0xC7 gelöscht. Nimm mal im
Program den Teil raus der WREN setzt, wenn du dann 0x00 ausließt ist es 
mit großer Sicherheit immer das Status Byte. Du kannst zur Sicherheit 
auch mal das Block Protected Register mit 0x72 Auslesen. Laut DB ist das 
ja nach dem Power on Reset auf 0x5555FFFFFFFF und damit ist alles a 
Rhein geschützt.

Gruß JackFrost

von Fabian D. (Gast)


Lesenswert?

Bastian W. schrieb:
> Ich hab Skype, bin aber atm nicht im Land.
> Hast du de Flash mal komplett mit 0xC7 gelöscht


Es wäre mal richtig toll, wenn der Chip was antworten würde, dass er das 
Commando verstanden hat. Werde es gleich mal testen.

von Fabian D. (Gast)


Lesenswert?

Es ist alles andere aber nicht 0x5555FFFFFFFF
1
    while (1)
2
  {  
3
    char Read[7];
4
    sst26_spi_send(DataFlash,FlashSPI,0x72,0);
5
    Read[0] = sst26_spi_receive(DataFlash,FlashSPI,0);
6
    Read[1] = sst26_spi_receive(DataFlash,FlashSPI,0);
7
    Read[2] = sst26_spi_receive(DataFlash,FlashSPI,0);
8
    Read[3] = sst26_spi_receive(DataFlash,FlashSPI,0);
9
    Read[4] = sst26_spi_receive(DataFlash,FlashSPI,0);
10
    Read[5] = sst26_spi_receive(DataFlash,FlashSPI,1);
11
    
12
    if (Read[0]==0x55)
13
    {
14
      LED_ON
15
    }else{
16
      LED_OFF
17
    }
18
    }

von Bastian W. (jackfrost)


Lesenswert?

Du hast in spi read und Sent immer ein Kommando drinnen , u d bedienst 
den CS , oder bei 0x72 darf ja CS nicht auf High gehen, da sonst das 
erste Byte wieder als KOMMANDO interpretiert.

Am besten schreibst du dir eine Funktion die die Daten direkt abholt , 
also CS low -> 0x72 senden , 7 Bytes holen und dann CS High.

Das gleiche für den Chip erase. Blos mit 0xC7 und dann statt Daten holen 
ein CS auf High und dann Delay von 50 ms. Danach liest du die ersten 256 
Bytes aus die müssen dann 0xFF sein. Kannst du das oszillographieren und 
die Bilder hier einstellen ?

Gruß JackFrost

von Fabian D. (Gast)


Lesenswert?

Bastian W. schrieb:
> Am besten schreibst du dir eine Funktion die die Daten direkt abholt ,
> also CS low -> 0x72 senden , 7 Bytes holen und dann CS High.


Sind es nicht 6 Bytes?

von Fabian D. (Gast)


Angehängte Dateien:

Lesenswert?

Das lese ich aus..
1
    while (1)
2
  {  
3
4
    char Read[7];
5
    Spi_USARTD0_Slave_Select_Low(FlashSPI);
6
    Spi_USARTD0_Rx_Tx(0x72);
7
    Read[0] = Spi_USARTD0_Rx_Tx(0x00);
8
    Read[1] = Spi_USARTD0_Rx_Tx(0x00);
9
    Read[2] = Spi_USARTD0_Rx_Tx(0x00);
10
    Read[3] = Spi_USARTD0_Rx_Tx(0x00);
11
    Read[4] = Spi_USARTD0_Rx_Tx(0x00);
12
    Read[5] = Spi_USARTD0_Rx_Tx(0x00);
13
    Read[6] = Spi_USARTD0_Rx_Tx(0x00);
14
    Spi_USARTD0_Slave_Select_High(FlashSPI);
15
    
16
    char Buffer[20];
17
    sprintf(Buffer,"Read[0] 0x%02x",Read[0]);
18
    Send_UART(Buffer);
19
    
20
    sprintf(Buffer,"Read[1] 0x%02x",Read[1]);
21
    Send_UART(Buffer);
22
23
    sprintf(Buffer,"Read[2] 0x%02x",Read[2]);
24
    Send_UART(Buffer);
25
    
26
    sprintf(Buffer,"Read[3] 0x%02x",Read[3]);
27
    Send_UART(Buffer);
28
    
29
    sprintf(Buffer,"Read[4] 0x%02x",Read[4]);
30
    Send_UART(Buffer);
31
    
32
    sprintf(Buffer,"Read[5] 0x%02x\n\r",Read[5]);
33
    Send_UART(Buffer);
34
    
35
    _delay_ms(2500);
36
37
    }
38
}

Anbei ein Mitschnitt..

von Fabian D. (Gast)


Angehängte Dateien:

Lesenswert?

Das kommt ab Speicheradresse "0" raus..(siehe Bild).
1
    while (1)
2
  {    
3
    char Read[255];
4
    char Buffer[20];
5
    
6
    Spi_USARTD0_Slave_Select_Low(FlashSPI);
7
    Spi_USARTD0_Rx_Tx(0x03); // CMD_READ_DATA
8
    Spi_USARTD0_Rx_Tx(0x00); // CMD_ADDR_MSB
9
    Spi_USARTD0_Rx_Tx(0x00); // CMD_ADDR
10
    Spi_USARTD0_Rx_Tx(0x00); // CMD_ADDR_LSB
11
    for(uint8_t x = 0 ; x < 255 ; x++)
12
    {
13
      Read[x] = Spi_USARTD0_Rx_Tx(0x00);  
14
    }
15
    Spi_USARTD0_Slave_Select_High(FlashSPI);
16
    
17
    for (uint8_t x = 0 ; x < 255 ; x++)
18
    {
19
      sprintf(Buffer,"Read[%d] 0x%02x",x,Read[x]);
20
      Send_UART(Buffer);      
21
    }
22
    _delay_ms(2500);
23
    }
24
}

von Fabian D. (Gast)


Lesenswert?

Um den SFDP Header: 2nd DWORD aus zu lesen, sende ich folgendes..
1
    while (1)
2
  {    
3
    char Buffer[20];
4
    sst26_spi_send(DataFlash,FlashSPI,0x5A,0); // CMD_SFDP_READ
5
  
6
    sst26_spi_send(DataFlash,FlashSPI,0x00,0); // CMD_ADDR
7
    sst26_spi_send(DataFlash,FlashSPI,0x00,0); // CMD_ADDR  
8
    sst26_spi_send(DataFlash,FlashSPI,0x04,0); // CMD_ADDR
9
  
10
    sst26_spi_send(DataFlash,FlashSPI,0x00,0); // DUMMY_BYTE
11
    
12
    uint8_t x[4];
13
    x[0] = sst26_spi_receive(DataFlash,FlashSPI,0);
14
    x[1] = sst26_spi_receive(DataFlash,FlashSPI,0);
15
    x[2] = sst26_spi_receive(DataFlash,FlashSPI,0);
16
    x[3] = sst26_spi_receive(DataFlash,FlashSPI,1);    
17
        
18
    sprintf(Buffer,"x[0] 0x%02x\n\n",x[0]);
19
    Send_UART(Buffer);  
20
21
    sprintf(Buffer,"x[1] 0x%02x\n\n",x[1]);
22
    Send_UART(Buffer);
23
    
24
    sprintf(Buffer,"x[2] 0x%02x\n\n",x[2]);
25
    Send_UART(Buffer);
26
    
27
    sprintf(Buffer,"x[3] 0x%02x\n\n",x[3]);
28
    Send_UART(Buffer);    
29
30
    _delay_ms(2500);
31
    }

bekomme jedoch nicht zurück was da in der Tabelle steht.
Zurück kommen müsste doch..

Byte1 = 0x06
Byte2 = 0x01
Byte3 = 0x02
Byte4 = 0xFF

oder? Boah ich bin mega verwirrt.

von Bastian W. (jackfrost)


Lesenswert?

Ist dein Board ein Xplain von Atmel oder ein eigenes ? An welchen Pin 
ist der CS vom Flash dran am PD4 wenn nein ist PD4 trotzdem zusätzlich 
als Ausgang gesetzt ?

Die Werte die kommen sind komisch vorallem wiederholen sich die Daten. 
Auch das vom Protection Block

Gruß JackFrost

von Fabian D. (Gast)


Lesenswert?

Bastian W. schrieb:
> Ist dein Board ein Xplain von Atmel oder ein eigenes ? An welchen Pin
> ist der CS vom Flash dran am PD4 wenn nein ist PD4 trotzdem zusätzlich
> als Ausgang gesetzt ?
>
> Die Werte die kommen sind komisch vorallem wiederholen sich die Daten.
> Auch das vom Protection Block
>
> Gruß JackFrost


Ja ist ein XPlained A3BU..
Mein CS ist an PF4 angeschlossen.

von Fabian D. (Gast)


Lesenswert?

Ich glaube du hattest Recht.
Es kam manchmal kein CS Signal..

Was ist daran falsch?
1
void Spi_USARTD0_Slave_Select_High(spi_usart_t *usart_spi){
2
  usart_spi->SS_PORT->OUTSET = (1<<usart_spi->SS);
3
}

von Bastian W. (jackfrost)


Lesenswert?

Ich hatte ein ähnliches Problem bei dem CS nicht geändert wurde wenn das 
Port.outclr und Port.outset in der Funkzion waren. Ich hatte das damals 
direkt in der Main gemacht dann ging es. Ich hab keine Ahnung warum der 
gcc da was anderes gemacht hat.

Aktuell nutze ich SPI FRAM und CAN Controller , für die muss ich ein 
Delay von 80 ns setzten damit die Timings passen. Da hatte ich dann 
keine Probleme mehr.

Versuche das mal das du nach einer Funktion ein Delay von 100 ns setzt 
und ob es dann besser wird.

Gruß JackFrost

von A. B. (Gast)


Lesenswert?

Die sich fortlaufend wiederholenden Bytes bei Read 0x03 und RBPR 0x72 
sind  0xbf, 0x26, 0x41, und das ist genau die ID ...

Das kann nur heißen, dass die SPI-Kommunikation überhaupt nicht richtig 
funktioniert. Also hat das Problem erst einmal rein gar nichts mit dem 
Flash zu tun (oder das Ding ist einfach kaputt, aber das es gerade 
kaputt ist, dass es ausgerechnet immer seine ID schickt, ist doch recht 
unwahrscheinlich).

Da läuft in Spi_USARTD0_* und/oder sst26_spi_* wohl etwas grundsätzlich 
falsch!

von A. B. (Gast)


Lesenswert?

Fabian D. schrieb:
> Was ist daran falsch?
>
>
1
> void Spi_USARTD0_Slave_Select_High(spi_usart_t *usart_spi){
2
>   usart_spi->SS_PORT->OUTSET = (1<<usart_spi->SS);
3
> }
4
>

Assembler-Output ansehen, vielleicht wird da einfach etwas wegoptimiert 
... "volatile"???

von A. B. (Gast)


Lesenswert?

Bastian W. schrieb:

> Ich hatte ein ähnliches Problem bei dem CS nicht geändert wurde wenn das
> Port.outclr und Port.outset in der Funkzion waren. Ich hatte das damals
> direkt in der Main gemacht dann ging es. Ich hab keine Ahnung warum der
> gcc da was anderes gemacht hat.

Das ist keine gute Idee. Man sollte dem Problem auf den Grund gehen, und 
nicht nur so lange herumwurschteln, bis es irgendwie geht. Sonst tappt 
man früher oder später wieder in etwas vergleichbares hinein.

Problem verstanden => Problem für die Zukunft erledigt.

(Aber das ist natürlich meine private Meinung)

von Fabian D. (Gast)


Lesenswert?

Das heißt im Endeffekt, möchte ich etwas neues an einem Bereich 
schreiben, wo schon etwas drin steht, muss ich erst mal den Bereich 
löschen?

von A. B. (Gast)


Lesenswert?

Fabian D. schrieb:
> Das heißt im Endeffekt, möchte ich etwas neues an einem Bereich
> schreiben, wo schon etwas drin steht, muss ich erst mal den Bereich
> löschen?

Ist heute denn schon wieder der 01. April???

von Bastian W. (jackfrost)


Lesenswert?

Fabian D. schrieb:
> Das heißt im Endeffekt, möchte ich etwas neues an einem Bereich
> schreiben, wo schon etwas drin steht, muss ich erst mal den Bereich
> löschen?

Im Gegensatz zum EEPROM kannst du den Flash nur beschreiben wenn in der 
Zelle 0xFF steht. Löschen kannst du nur ganze Sektoren , Blöcke oder den 
ganzen Chip.

Wenn du also nur ein Byte von einem Sektor ändern willst musst du das 
woanders zwischen Speichern.

Gruß JackFrost

von Fabian D. (Gast)


Lesenswert?

A. B. schrieb:
> Fabian D. schrieb:
>> Das heißt im Endeffekt, möchte ich etwas neues an einem Bereich
>> schreiben, wo schon etwas drin steht, muss ich erst mal den Bereich
>> löschen?
>
> Ist heute denn schon wieder der 01. April???

Warst du in der Schule auch so ein Klugsch*****?

von A. B. (Gast)


Lesenswert?

Fabian D. schrieb:

> Warst du in der Schule auch so ein Klugsch*****?

Zumindest habe ich in der Schule Lesen gelernt. ;-)
Aus dem Datenblatt:

"5.20
Page-Program

... The data for the selected page address must be in the erased state 
(FFH) before initiating the Page-Program operation. ..."

Der Chip kennt ganze zwei(!) Instruktionen, die zum Programmieren 
dienen, und davon verwendet wurde ohnehin nur das "Page-Program". Dessen 
Beschreibung besteht aus drei kleinen Absätzen. Aber die zu lesen, ist 
offenbar schon zuviel der Mühe?

Irgendwie setze ich auch stillschweigend voraus, das man zumindest eine 
ungefähre Ahnung haben sollte, was man so macht. Wenn man einen 
Flash-Chip programmieren will, wäre es deswegen vielleicht hilfreich, zu 
wissen (oder sich zu informieren?!), was so ein Flash-EEPROM eigentlich 
ist ...

Statt großspurig zu verkünden "SPI läuft" (haha!), aber andererseits 
nicht mal beschreiben zu können, was denn nun eigentlich konkret nicht 
funktioniert. Erst nach der dritten Nachfrage kommt dann überhaupt mal 
substanzielle Information rüber ...

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.