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.