www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT45DB161D Status Code anfrage bleibt hängen?


Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich finde den Fehler in Code leider nicht.

Aus irgend einen Grund bleibt das Programm bei

result = DF_SPI_RW(0x00); in der Funktion Read_DF_status() hängen...

Kommentiere ich diese Zeile aus läuft das Programm zwar weiter ab nur 
erhalte ich dann 0x00 als Statuscode zurück...

Wo liegt der Fehler? Ich sehe leider gerade gar nichts mehr.

Frohes Fest euer Max ;)


Link zur Schaltung:
http://www.lochraster.org/rumpus/data/rumpus-v2-sc...
#include <stdint.h>

#include <avr/io.h>

#include <avr/pgmspace.h>

//mtE



#include "dataflash.h"



const uint8_t DF_pagebits[] PROGMEM ={  9,  9,  9,  9,  9,  10,  10,  11};      //index of internal page address bits

const uint16_t DF_pagesize[] PROGMEM ={264,264, 264, 264, 264, 528, 528,1056};  //index of pagesizes







unsigned char PageBits = 0;

unsigned int  PageSize = 0;



void DF_SPI_init (void)

{

  PORTB |= (1<<PB1) | (1<<PB3) | (1<<PB4) | (1<<PB5);

  DDRB |= (1<<DDB1) | (1<<DDB3) | (1<<DDB5);    //Set MOSI, SCK AND SS as outputs

  // mtE

  SPSR = (1<<SPI2X);                                      //SPI double speed settings

  SPCR = (1<<SPE) | (1<<MSTR) | (1<<CPHA) | (1<<CPOL);  //Enable SPI in Master mode, mode 3, Fosc/4

}



unsigned char DF_SPI_RW (unsigned char output)

{

  unsigned char input;

  

  SPDR = output;              //put byte 'output' in SPI data register

  while(!(SPSR & 0x80));          //wait for transfer complete, poll SPIF-flag

  input = SPDR;              //read value in SPI data reg.

  

  return input;              //return the byte clocked in from SPI slave

}







unsigned char Read_DF_status (void)

{

  unsigned char result,index_copy;

  DF_CS_inactive;              //make sure to toggle CS signal in order

  DF_CS_active;              //to reset dataflash command decoder

  result = DF_SPI_RW(0x57);      //send status register read op-code

  result = DF_SPI_RW(0x00);        //dummy write to get result ### Hier hängt er###

  

  index_copy = ((result & 0x38) >> 3);  //get the size info from status register



  PageBits   = pgm_read_byte(&DF_pagebits[index_copy]);  //get number of internal page address bits from look-up table

  PageSize   = pgm_read_word(&DF_pagesize[index_copy]);   //get the size of the page (in bytes)



  return result;              //return the read status register value

}

int main(void)

{   

    unsigned char puffer[10];





    uart_init();

    uart_puts("Hallo");



    DF_SPI_init();              // init the SPI interface to communicate with the DataFlash

    

    char result = Read_DF_status();


    sprintf(puffer,"%.2x\r\n",result);

    uart_puts("DF-Status 0x");
    uart_puts(puffer);

    



    while(1) {

        

    }



    return 0;

}

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry leider hab ich noch ein paar Zeilen vergessen:
 #define sbiDF(port,bit)  (port |=  (1<<bit))

#define cbiDF(port,bit)  (port &= ~(1<<bit))
#define DF_CS_active  cbiDF(PORTB,1)

#define DF_CS_inactive  sbiDF(PORTB,1)

Autor: max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
niemand eine Idee?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>niemand eine Idee?

Der SS Pin ist PB2.

Autor: max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der Eigentlich SS Pin ist schon anderweitig in Benutzung.
Kann ich mit meinen Code oben nicht auch PB1 verwenden?



Ein teil des Problems hab ich schon gelöst --> Kalte Lötstelle

Er Spuckt mir nun auch Teils 0xAC aus wie er soll.
Aber manchmal auch ein 0xFF und das Programm bleibt an besagter Stelle 
hängen.


Wie kann es denn zu so etwas kommen?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wie kann es denn zu so etwas kommen?

Wenn PB2 ein Eingang ist dann wird
der SPI Master zum Slave wenn der Pin low ist.
Als Eingang darf PB2 hier also nur high gehalten
werden. Als Ausgang ist PB2 frei verwendbar. Warum
also nicht gleich als CS für den SPI Slave nehmen?

Autor: max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
danke genau da lag der Fehler^^

Hätte ich keine Ohren könnte ich jetzt im Kreis lachen ;)

Ich danke dir

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.