Flash via SPI ansprechen (atmega64)

OP #766662
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
OP #766707
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

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