Pic-Mikrocontroller + externer Flashspeicher

OP #3275855
Lesenswert?
• ▲
▼
Hallo
Ich möchte mit einem Pic-Mikrocontroller einen Flash-Speicher lesen und 
beschreiben(nur einfache Variablenwerte) und habe bis jetzt noch nie mit 
dem SPI-Bus gearbeitet.
Leider klappt es nicht, obwohl ich jetzt schon 2 Wochen experimentiere:

Pic 18F4620   -   8MHZ-Quarz
Flash ist das Flash-Click von Mikros mit einem M25P80

Ich poste meinen C-Code und 3 Bilder vom Oszilloskop.

Beim SDI_CLOCK des Flash sieht man das 0x06 Byte, welches zum Flash 
gesendet wird im Vergleich zur Clock. Sollte eigentlich passen:
bei steigender Flanke liegt Bit1+Bit2 an, Bit0 wieder 0.

den SDO des Flash(ALLES.Jpeg) hab ich als Gesamtbild aller 5 
übertragenen Bytes, damit man sieht, dass da gar nichts passiert, ausser 
ein leichtes Ansteigen am Anfang.

Beim CS-Bild sieht man das Clock-Signal im Vergleich zum CS-Signal.
Für das Beschreiben, Löschen, aber auch Write Nable Bit Setzen steht 
Folgendes im Datenblatt:
Chip Select (S) must be driven High exactly at a byte boundary, 
otherwise the instruction is rejected, and is not executed. That is, 
Chip Select (S) must driven High when the number of clock pulses after 
Chip Select (S) being driven Low is an exact multiple of eight.
Passt mein Clock-CS Verhalten(nach allen 8 Bits auf High, oder muss das 
genau gleichzeitig sein?

Was könnte ich am Code falsch haben oder was ist mein Verständnisfehler 
beim Flash-Speicher?
Ich habe die meisten Zeilen kommentiert, damit man meine Gedankengänge 
vielleicht verstehen kann ;-)
Vielen Dank für eure Hilfe.
claus

#pragma config OSC = HS          // Oscillator HS
#pragma config WDT = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRT = ON       // Power-up Timer Enable (PWRT enabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select (MCLR/VPP 
pin function is MCLR)

#include <p18f4620.h>
#include <delays.h>

#define RS LATBbits.LATB4                   // LCD
#define RW LATBbits.LATB3                   // LCD
#define E LATBbits.LATB2                    // LCD
#define LCD_DATA LATD                       // LCD

#define CS LATCbits.LATC2                   // CS Flash
//#define HOLD LATCbits.LATC1               // HOLD Flash
#define SDI PORTCbits.RC4                   // SDI Flash
#define SDO LATCbits.LATC5                  // SDO Flash
#define CLK LATCbits.LATC3                  // CLK Flash

/*VARIABLEN*/
char i;
int ergebnis;
unsigned char byte;
char tempvar;
/***********/

/*PROTOTYPEN*/
void command(void);                                     // LCD
void data(void);                                        // LCD
void LCD_INIT(void);                                    // LCD
unsigned char ReadSPI( void );                          // Flash
unsigned char WriteSPI( unsigned char data_out );       // Flash
void Init_SPI(void);                                    // Flash
unsigned char sendSPI (unsigned char byte);             // Flash
void LCD_AUSGABE(int ergebnis);
/************/

void main()
{
/***********FLASH-SPEICHER***********/
//TRISCbits.TRISC1=0;             // HOLD - Flash
TRISCbits.TRISC2=0;             // CS - Flash
TRISCbits.TRISC3=0;             // SCK - Flash
TRISCbits.TRISC4=1;             // SDI - Flash
TRISCbits.TRISC5=0;             // SDO - Flash

/***********LCD-DISPLAY***********/
TRISD=0;      // Set Port B as output port
TRISBbits.TRISB4=0;             // RS (Register select signal)
TRISBbits.TRISB3=0;             // R/W (Data read/write)
TRISBbits.TRISB2=0;             // E (Enable signal)

/******INITIALISIERUNGEN******/
LCD_INIT();                     // LCD initialization
Init_SPI();                     // Initialisieren des SPI

    while(1)
    {
    sendSPI(0x06);              // instruction code: Write enable bit 
setzen
    sendSPI(0x01);              // instruction code: write status 
register
    sendSPI(0b00011100);        // instruction code: BP1(Block Protect 
Bit) setzen
    sendSPI(0x05);              // instruction code: read status 
register
    ergebnis=sendSPI(0x00);     // dummy senden; Auslesen des Status 
Registers

    LCD_AUSGABE(ergebnis);      // Ausgeben des gelesenen SPI-Wertes am 
LCD-Display

    }
}


/************Funktionen************/
void Init_SPI(void)
{
SSPCON1bits.SSPEN=0;            // Synchronous Serial Port disabled
SSPSTATbits.CKE=1;              // Daten werden beim Wechsel von Aktive 
zu Leerlauf der SCK-Leitung gesendet
SSPCON1bits.SSPEN=1;            // Synchronous Serial Port enabled
}


unsigned char sendSPI (unsigned char byte)
{
    unsigned char tmp;
    CS = 0;                     // Clock Select auf low gesetzt, damit 
aktiv
    SSPBUF = byte;              // byte(zu sendende Daten) wird in 
SSPBUF geschrieben
    while(!SSPSTATbits.BF);     // warten bis Buffer beschrieben(BF wird 
gesetzt)
    SSPSTATbits.BF=0;           // Buffer full - Bit wird gelöscht
    tmp = SSPBUF;               // SSPBUF wird gelesen
    CS = 1;                     // Clock Select auf high gesetzt, damit 
inaktiv
    return tmp;                 // der ausgelesene Wert wird 
zurückgegeben
}

Flash-Speicher:
http://www.mikroe.com/downloads/get/1881/flash_click_manual.pdf

Datenblatt M25P80:
http://www.google.at/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CDwQFjAA&url=http%3A%2F%2Fwww.micron.com%2F~%2Fmedia%2FDocuments%2FProducts%2FData%2520Sheet%2FNOR%2520Flash%2FSerial%2520NOR%2FM25P%2FM25P80.pdf&ei=1joHUp2yJMmctAai8IH4DQ&usg=AFQjCNEtGo583vxY52sXq8rMf9bREKpRTg&bvm=bv.50500085,d.Yms
Angehängte Dateien:

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.