www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT45DB161D Page_Buffer_Compare liefert immer match?


Autor: max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe Daten im SRAM Buffer und schon vorhandene in einer Flash-Page.

Unterscheiden sie sich soll geflasht werden.

Mein Problem ist nun das mein Code immer einen wert zurück liefert das 
Page und Buffer gleich sind (match).

Warum ist das so?

/*****************************************************************************

*

*  Function name : Read_DF_status

*

*  Returns :    One status byte. Consult Dataflash datasheet for further

*          decoding info

*

*  Parameters :  None

*

*  Purpose :    Status info concerning the Dataflash is busy or not.

*          Status info concerning compare between buffer and flash page

*          Status info concerning size of actual device

*

*   mt: the 'if' marked with 'mt 200401' is a possible optimisation

*   if only one type of Dataflash is used (like on the Butterfly).

*   If the uC controls different types of dataflash keep the PageBits

*   and PageSize decoding in this function to avoid problems.

******************************************************************************/

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(StatusReg);      //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

  // mtA

  /// if (!PageBits) { // mt 200401

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

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

    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)

  /// }

  // mtE

  return result;              //return the read status register value

}

/*****************************************************************************

*

*  Function name : Page_Buffer_Compare

*

*  Returns :    0 match, 1 if mismatch

*

*  Parameters :  BufferAdr  ->  Decides usage of either buffer 1 or 2

*          PageAdr    ->  Address of flash page to be compared with buffer

*

*  Purpose :    comparte Buffer with Flash-Page

*

*   added by Martin Thomas, Kaiserslautern, Germany. This routine was not 

*   included by ATMEL

*          

******************************************************************************/

unsigned char Page_Buffer_Compare(unsigned char BufferNo, unsigned int PageAdr)

{
  unsigned char stat;

  

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

  //DF_CS_active;          //to reset dataflash command decoder

  

  if (1 == BufferNo)                  

  {

    DF_SPI_RW(FlashToBuf1Compare);  

    DF_SPI_RW((unsigned char)(PageAdr >> (16 - PageBits)));  //upper part of page address

    DF_SPI_RW((unsigned char)(PageAdr << (PageBits - 8)));  //lower part of page address and MSB of int.page adr.

    DF_SPI_RW(0x00);  // "dont cares"

  }

  #ifdef USE_BUFFER2

  else if (2 == BufferNo)                      

  {

    DF_SPI_RW(FlashToBuf2Compare);            

    DF_SPI_RW((unsigned char)(PageAdr >> (16 - PageBits)));  //upper part of page address

    DF_SPI_RW((unsigned char)(PageAdr << (PageBits - 8)));  //lower part of page address

    DF_SPI_RW(0x00);                    //don't cares

  }

  #endif

  

  DF_CS_inactive;                        

  DF_CS_active;    

  

  do {

    stat=Read_DF_status();
  } while(!(stat & 0x80));              //monitor the status register, wait until busy-flag is high

  

  return (stat & 0x40);

}



Page_Buffer_Compare(1, i); liefert immer 0x00 aber warum?

Autor: max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
keiner eine Ahnung?

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Höchstens die etwas merkwürdige /CS "Behandlung" bzw. die 
Statusregisterabfrage...
In den alten Quelltexten hier sieht das in etwa so aus (Timerabfragen um 
Endlosschleifen zu verhindern fehlen)
...
DFSELECT();
SPITransceive(DFBUFFER1TOMAINWE);
SPITransceive(h);
SPITransceive(l);
SPITransceive(0);
DFDESELECT();

do {
    DFSELECT();
    SPITransceive(DFREADSTATUS);
    res = SPITransceive(0);  
    DFDESELECT();
} while (!(res & 0x80));

Als Kommentar steht hier noch "DS 24.10 or 11.4"...

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.