www.mikrocontroller.net

Forum: Compiler & IDEs Flash via SPI ansprechen (atmega64)


Autor: Hombre Lobo (hombrelobo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich habe das problem dass ich beim lesen via spi aus dem flash 
(AT25FS040N) nur FF erhalte.

ein auslesen bzw. beschreiben vom statusregister funktioniert 
problemlos.
auch manufacturerID bzw. ProduktID lassen sich problemlos lesen
- von daher gehe ich davon aus, dass initialisierung und grundsaetzliche 
kommunikation auch stimmen.
das lesen bzw. schreiben von zeichenketten ging auch schon, ohne 
erkennbaren grund ist es mir jetzt nicht einmal mehr moeglich ein 
zeichen zu schreiben und wieder zu lesen.

ich halte es zwar fuer unwahrscheinlich, dass der flash-baustein einen 
schaden genommen hat der zwar lesen+schreiben des statusregisters 
akzeptiert aber kein beschreiben von memory - aber vllt hat hier jemand
schon aehnliches erlebt ?

eher hoffe ich , dass ich in den folgenden zeilen einen fehler
eingebaut habe :

    int32_t address=40;

    while(getstatusreg()&0x01);
    PORTB &= 0xFE;
    spi_transmit(0x06);  //write enable
    spi_transmit(0x02);  //write
    spi_transmit((char)(address>>16));
    spi_transmit((char)(address>>8));
    spi_transmit((char)address);
    spi_transmit('x');
    PORTB |= 0x01;

    while(getstatusreg()&0x01);
    PORTB &= 0xFE;
    spi_transmit(0x03);  //read
    spi_transmit((char)(address>>16));
    spi_transmit((char)(address>>8));
    spi_transmit((char)address);
    debugstr[0]=spi_transmit(0xFF);
    PORTB |= 0x01;


hier noch die transmit/init/getstatusreg funktionen

char spi_transmit(char data){
        SPDR=data;
        while(!(SPSR & (1<<SPIF)))
                ;
        return SPDR;
}

void spi_init(){
        DDRB |= (1<<DDB2)|(1<<DDB1)|(1<<DDB0);   //mosi+sck output
        // enable SPI Master, set clock rate
        //SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0) | (1<<SPR1) ;
        SPCR |= (1<<SPE) | (1<<MSTR) | (1<<SPR0) ;
        // set status "write enable "
}


char getstatusreg(){
        char status;
        PORTB &= 0xFE;
        spi_transmit(0x05);
        status=spi_transmit(0xFF);
        PORTB |= 0x01;
        return status;
}

vorab merci

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast das Datenblatt nicht gelesen. Darin steht nämlich, dass nach dem 
WriteEnable Befehl CS auf High gehen muss.

Autor: Hombre Lobo (hombrelobo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups, ja ist beim ausprobieren verloren gegangen.
leider liefert dieser sourcecode aber genau das gleiche
verhalten

    PORTB &= 0xFE;
    spi_transmit(0x06);  //write enable
    PORTB |= 0x01;

    while(getstatusreg()&0x01);
    PORTB &= 0xFE;
    spi_transmit(0x02);  //write
    spi_transmit((char)(address>>16));
    spi_transmit((char)(address>>8));
    spi_transmit((char)address);
    spi_transmit('x');
    PORTB |= 0x01;

    while(getstatusreg()&0x01);
    PORTB &= 0xFE;
    spi_transmit(0x03);  //read
    spi_transmit((char)(address>>16));
    spi_transmit((char)(address>>8));
    spi_transmit((char)address);
    debugstr[0]=spi_transmit(0xFF);
    PORTB |= 0x01;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.