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


von Hombre L. (hombrelobo)


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

von Benedikt K. (benedikt)


Lesenswert?

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

von Hombre L. (hombrelobo)


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;

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.