mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C18: mit PIC18F25J10 einen Flashspeicher (ATDB041B) über SPI ansprechen


Autor: thomas harasek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich sollte mit einem PIC18F25J10 einen Flashspeicher von ATMEL 
(ATDB041B) ansprechen (über SPI).
Da ich bisher generell wenig Erfahrung habe,
habe ich mal gegooglt, jedoch nichts gefunden, was mir wirklich 
weiterhilft
(und die zig Beispielprogramme - zumeist SPI/EEPROM - habe ich zwar 
versucht abzuändern,
jedoch ohne großen Erfolg).

In meiner main-Routine rufe ich die flash_SPI_1_Test() auf.
Die Funtion busy_polling() endet immer in einer Endlosschleife!

Kann mir bitte jemand helfen bzw. gibt es entsprechende Samplecodes?


Vielen Dank.
thomas


#include <p18f25j10.h>
#include <spi.h>
#include <controller.h>

void busy_polling(void);
void byte_write_to_buffer1(void);
void byte_write_to_mainmemory(void);
void byte_read_from_mainmemory(void);
unsigned char byte_read_from_buffer1(void);


// VARIABLE Definitions
unsigned char result;

extern char gInput[20];

#define SPI_CS LATCbits.LATC2


void flash_SPI_1_Test(void)
{
  TRISCbits.TRISC2 = 0;

  SPI_CS = 1;
  OpenSPI(SPI_FOSC_16, MODE_00, SMPEND);
  busy_polling();
  byte_write_to_buffer1();
  busy_polling();
  byte_write_to_mainmemory();
  busy_polling();
  byte_read_from_mainmemory();
  busy_polling();
  gInput[0] = byte_read_from_buffer1();

  gInput[1] = 0;
  rs485_p_Client_Output((const far rom char *) "Speicherausgabe: ");
  rs485_d_Client_Output((char *) gInput);
  rs485_p_Client_Output((const far rom char *) "\n\r");

  CloseSPI();
}


void busy_polling (void)
{

  unsigned char read;

  do
  {
    SPI_CS = 0;
    result = putcSPI(0xD7);    //Status Register Read
    if (result==-1)
      rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei busy_polling() - 2\n\r");

    read = getcSPI();
    SPI_CS = 1;

  } while (read & 0x80);      //stay in loop until !busy
}

void byte_write_to_buffer1 (void)  //Opcode 0x84: x x x x x x x x x x x x x x x B B B B B B B B B
{
  SPI_CS = 0;
  result = putcSPI(0x84);      
  if (result==-1)
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_write_to_buffer1() - 1\n\r");

  result = putcSPI(0x00);
  if (result==-1)
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_write_to_buffer1() - 2\n\r");

  result = putcSPI(0x00);  
  if (result==-1)
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_write_to_buffer1() - 3\n\r");

  result = putcSPI(0x00);
  if (result==-1)
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_write_to_buffer1() - 4\n\r");

  result = putcSPI('B');
  if (result==-1)
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_write_to_buffer1() - 5\n\r");

  SPI_CS = 1;  
}

void byte_write_to_mainmemory (void)  //Opcode 0x83: r r r r P P P P P P P P P P P x x x x x x x x x
{
  SPI_CS = 0;
  result = putcSPI(0x83);
  if (result==-1)
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_write_to_mainmemory() - 1\n\r");

  result = putcSPI(0x00);
  if (result==-1)
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_write_to_mainmemory() - 2\n\r");

  result = putcSPI(0x00);  
  if (result==-1)
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_write_to_mainmemory() - 3\n\r");

  result = putcSPI(0x00);
  if (result==-1)
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_write_to_mainmemory() - 4\n\r");

  SPI_CS = 1;
}

void byte_read_from_mainmemory (void)  //Opcode 0x53: r r r r P P P P P P P P P P P x x x x x x x x x
{
  SPI_CS = 0;
  result = putcSPI(0x53);
  if (result==-1)
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_read_from_mainmemory() - 1\n\r");

  result = putcSPI(0x00);
  if (result==-1)
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_read_from_mainmemory() - 2\n\r");

  result = putcSPI(0x00);  
  if (result==-1)
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_read_from_mainmemory() - 3\n\r");

  result = putcSPI(0x00);
  if (result==-1)
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_read_from_mainmemory() - 4\n\r");

  SPI_CS = 1;  
}

unsigned char byte_read_from_buffer1 (void)  //Opcode 0xD4: x x x x x x x x x x x x x x x B B B B B B B B B
{
  unsigned char read;

  SPI_CS = 0;
  result = putcSPI(0xD4);
  if (result==-1)
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_read_from_buffer1() - 1\n\r");

  result = putcSPI(0x00);
  if (result==-1)
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_read_from_buffer1() - 2\n\r");

  result = putcSPI(0x00);
  if (result==-1)
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_read_from_buffer1() - 3\n\r");

  result = putcSPI(0x00);
  if (result==-1)
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_read_from_buffer1() - 4\n\r");

  read = getcSPI();

  SPI_CS = 1;  

  return read;
}


Autor: thomas harasek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

in der Funktion busy_polling() ist die While-Bedingung falsch gewesen.
Nun lauft das Programm durch,
ich kann jedoch trotzdem nicht den richtigen Speicherinhalt auslesen -
wobei ich nicht weiß, ob überhaupt das Schreiben funktioniert

lg
thomas
void busy_polling (void)
{

  unsigned char read;

  do
  {
    SPI_CS = 0;
    result = putcSPI(0xD7);    //Status Register Read
    if (result==-1)
      rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei busy_polling() - 2\n\r");

    read = getcSPI();
    SPI_CS = 1;

  } while (read & 0x80);      //stay in loop until !busy
}

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.