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
Du hast das Datenblatt nicht gelesen. Darin steht nämlich, dass nach dem WriteEnable Befehl CS auf High gehen muss.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.