Einführung in den externen Speicher mit PIC-Mikrocontrollern

PIC-Mikrocontroller von Microchip bieten internes EEPROM und Flash zum Speichern von Anwendungscode und kleinen Datenmengen, aber komplexe Projekte erfordern oft mehr Kapazität. Externes EEPROM (Electrically Erasable Programmable Read-Only Memory) und Flash-Speicherchips bieten den zusätzlichen nichtflüchtigen Speicher, der für die Datenprotokollierung, Konfigurationsparameter, Firmware-Updates und Multimedia-Assets benötigt wird. Diese erweiterte Anleitung führt Sie durch die Auswahl, Verbindung und Programmierung dieser externen Speichergeräte mit PIC-Mikrocontrollern, die sowohl I2C- als auch SPI-Schnittstellen in der Tiefe abdecken.

Ob Sie einen Datenrekorder, einen intelligenten Sensorknoten oder ein eingebettetes System bauen, das kritische Einstellungen nach Stromausfall beibehalten muss, zu verstehen, wie externer Speicher effizient angeschlossen werden kann, spart Entwicklungszeit und verbessert die Zuverlässigkeit. Wir werden Hardwareverdrahtung, Details des Kommunikationsprotokolls, praktische Codebeispiele, Fehlerbehandlung und fortschrittliche Techniken wie Verschleißleveling und Blockmanagement diskutieren.

Externes EEPROM und Flash-Speicher

Sowohl EEPROM als auch Flash sind nichtflüchtige Speichertechnologien, d.h. sie bewahren gespeicherte Daten bei Stromentzug, unterscheiden sich jedoch in Architektur, Ausdauer und typischen Anwendungsfällen:

  • EEPROM – Unterstützt Lese- und Schreibvorgänge auf Byte-Ebene. Seine Dauer beträgt typischerweise 1 Million Lösch-/Schreibzyklen pro Byte. EEPROM ist ideal für die Speicherung kleiner Mengen von häufig aktualisierten Daten (z. B. Kalibrierkonstanten, Benutzerpräferenzen). Gemeinsame Kapazitäten reichen von 1 kbit bis 512 kbit.
  • Flash Memory – Optimiert für Lösch- und Programmoperationen auf Blockebene. Flash bietet eine viel höhere Dichte (Megabits bis Gigabit), aber eine geringere Ausdauer (normalerweise 10.000 bis 100.000 Löschzyklen pro Block). Es wird für Firmware-Speicherung, große Datenprotokolle und Dateisysteme verwendet. NOR Flash ermöglicht zufällige Zugriffe; NAND Flash erfordert Zugriff auf Seitenebene und ist besser für Massenspeicher geeignet.

Externes EEPROM und Flash kommunizieren mit dem PIC über serielle Protokolle (I2C oder SPI) oder selten parallele Busse. Serielle Schnittstellen reduzieren die Pin-Anzahl und vereinfachen das PCB-Layout, wodurch sie die dominierende Wahl für eingebettete Designs sind.

Wählen Sie das richtige Speichergerät

Wenn Sie einen externen Speicherchip für Ihr PIC-Projekt auswählen, bewerten Sie diese Kriterien:

  • Memory Size and Capacity – Schätzen Sie das Datenvolumen, das Ihre Anwendung generiert oder speichert. Für einfache Konfigurationsdaten kann ein 64-Kbit-EPROM (8 KB) ausreichen. Für Audio-Samples oder Firmware-Upgrades sollten Sie 16 Mbit oder größer SPI Flash in Betracht ziehen.
  • Kommunikationsprotokoll – I2C verwendet nur zwei Drähte (SDA und SCL) und unterstützt die Adressierung mehrerer Geräte; es ist langsamer, aber einfacher. SPI verwendet vier Drähte (MISO, MOSI, SCLK, CS) und erreicht höhere Geschwindigkeiten, erfordert jedoch eine dedizierte Chipauswahl pro Gerät. Wählen Sie basierend auf Ihrer Geschwindigkeit und Pinverfügbarkeit.
  • Geschwindigkeit und Datenübertragungsrate – I2C läuft normalerweise bei 100 kHz oder 400 kHz; SPI kann Dutzende MHz erreichen. Wenn Sie schnelles Streaming benötigen (z. B. Audiowiedergabe), ist SPI obligatorisch. Für gelegentliches Lesen von kleinen Konfigurationsblöcken ist I2C in Ordnung.
  • Stromverbrauch – Sowohl EEPROM als auch Flash haben aktive Lese-/Schreibströme im Milliampere-Bereich und im Tiefschlafmodus.
  • Betriebsspannung – Die meisten PICs arbeiten mit 3,3 V oder 5 V. Stellen Sie sicher, dass der Speicherchip den gleichen Spannungsbereich unterstützt. Viele moderne EEPROMs arbeiten von 1,7 V bis 5,5 V und bieten Flexibilität.
  • Kosten und Verfügbarkeit – Zu den gängigen Familien gehören die 24AA-Serie (I2C EEPROM), die 25AA-Serie (SPI EEPROM), die SST25- oder Winbond W25Q-Serie (SPI Flash) und die AT24-Serie (I2C EEPROM). Überprüfen Sie den Verteilerbestand und die langen Vorlaufzeiten.
  • Ausdauer und Aufbewahrung – EEPROM bietet normalerweise eine höhere Schreibausdauer als Flash. Die Datenspeicherung beträgt typischerweise 40+ Jahre. Bei Flash sollten Sie die Anzahl der Löschzyklen berücksichtigen und bei häufigem Schreiben eine Verschleißabgleichung implementieren.

Microchips serielles EEPROM-Auswahlhandbuch bietet direkte Vergleichstabellen. Winbonds serielles NOR Flash-Portfolio listet beliebte SPI Flash-Optionen auf. Lesen Sie immer das spezifische Datenblatt für Timing und Befehlssätze.

Verbinden des externen Speichers mit dem PIC-Mikrocontroller

Die Hardwareverdrahtung hängt von der Schnittstelle ab. Im Folgenden werden I2C- und SPI-Verbindungen sowie wichtige Überlegungen wie Pull-up-Widerstände und Entkopplungskondensatoren beschrieben.

I2C (IIC) Schnittstelle

I2C verwendet zwei bidirektionale Leitungen: SDA (Seriendaten) und SCL (Serienuhr). Der Master (PIC) steuert die Uhr und initiiert Transaktionen. Jeder Slave hat eine 7-Bit- oder 10-Bit-Adresse. Für EEPROM besteht die Adresse oft aus einem festen Präfix plus drei Hardware-Adresspins (A0, A1, A2), die bis zu acht Geräte auf demselben Bus ermöglichen.

Verdrahtung:

  • Verbinden Sie SDA mit einem PIC-I/O-Pin, der als Open-Drain- oder bidirektional konfiguriert ist.
  • Verbinden Sie SCL mit einem anderen PIC I/O-Pin.
  • Fügen Sie externe Pull-up-Widerstände (in der Regel 4,7 kΩ) von SDA und SCL zu Vcc hinzu. Der Wert hängt von der Buskapazität und -geschwindigkeit ab; für 400 kHz können 2,2 kΩ erforderlich sein.
  • Verbinden Sie den WP-Pin des Speichers mit GND, um den Schreibschutz der Hardware zu deaktivieren, oder mit Vcc, um das gesamte Array zu schützen.
  • Platzieren Sie einen 0,1 μF Keramikkondensator in der Nähe des Power-Pin des Speichers, um das Rauschen zu entkoppeln.

Für Hochgeschwindigkeits-I2C (1 MHz) sollten die Spuren kurz gehalten und stärkere Pull-ups verwendet werden. Beispiel: Mikrochip 24LC256 (256 kbit I2C EEPROM), AT24C512 (512 kbit).

SPI-Schnittstelle

SPI verwendet vier Signale: MOSI (Master out, Slave in), MISO (Master in, Slave out), SCLK (Serienuhr) und CS (Chip Select, Active Low).

Verdrahtung:

  • Verbinden Sie MOSI (PIC-Ausgang) mit dem SI (Serieneingang) des Speichers.
  • Verbinden Sie MISO (PIC-Eingang) mit dem SO (Serienausgang) des Speichers.
  • Verbinden Sie SCLK (PIC-Ausgang) mit dem SCK des Speichers.
  • Verbinden Sie CS mit einem PIC-Pin für den digitalen Ausgang. Verwenden Sie für mehrere Speicher separate Pins.
  • Fügen Sie bei Bedarf einen schwachen Pull-up (10 kΩ) auf der CS-Linie hinzu, obwohl die typische Logik ausreicht.
  • Entkoppeln Sie die Leistung mit einem 0,1 μF-Kondensator.

SPI Flash Chips haben oft Statusregister und benötigen spezielle Befehlssequenzen (z.B. WREN vor dem Schreiben). Beispiel Chips: Winbond W25Q32 (32 Mbit SPI Flash), Microchip 25LC256 (256 kbit SPI EEPROM).

Programmierung des PIC für den Zugriff auf externen Speicher

Der PIC-Mikrocontroller muss das entsprechende Peripheriemodul (I2C oder SPI) initialisieren und dann Daten gemäß dem Protokoll des Speicherchips senden/empfangen. Sowohl das Hardware-MSSP-Modul (Master Synchronous Serial Port) des Mikrochips als auch das Software-Bit-Banging können verwendet werden. Aus Gründen der Zuverlässigkeit und Geschwindigkeit wird das MSSP bevorzugt.

I2C Kommunikationscode Beispiel

Nachfolgend ein vereinfachtes, aber funktionales Beispiel mit dem MCC (Microchip Code Configurator) generierten HAL für einen PIC16F18877: Der Code schreibt ein einzelnes Byte an ein I2C EEPROM an einer gegebenen Adresse und liest es dann zurück.

// Assumes I2C1_Initialize() called earlier.
// Device address: 0xA0 (for write) – actual address depends on A0-A2 pins.
#define EEPROM_ADDR 0xA0

void I2C_WriteByte(uint16_t memAddr, uint8_t data) {
 I2C1_Start(); // Generate start condition
 I2C1_Write(EEPROM_ADDR); // Send device address + write bit
 I2C1_Write((uint8_t)(memAddr >> 8)); // High address byte
 I2C1_Write((uint8_t)(memAddr)); // Low address byte
 I2C1_Write(data); // Data byte
 I2C1_Stop(); // Generate stop condition
 __delay_ms(5); // Wait for internal write cycle (tWR)
}

uint8_t I2C_ReadByte(uint16_t memAddr) {
 uint8_t data;
 I2C1_Start();
 I2C1_Write(EEPROM_ADDR); // Device address + write for dummy write
 I2C1_Write((uint8_t)(memAddr >> 8));
 I2C1_Write((uint8_t)(memAddr));
 I2C1_RepeatedStart(); // Repeated start to change direction
 I2C1_Write(EEPROM_ADDR | 0x01); // Device address + read bit
 data = I2C1_Read(0); // NAK after last byte
 I2C1_Stop();
 return data;
}

Hinweis: Beim Seitenschreiben dürfen Sie keine Seitengrenze überschreiten (normalerweise 8, 16 oder 64 Bytes).

SPI-Kommunikationscode Beispiel

Für SPI Flash (z. B. W25Q32) erfordern Schreiboperationen das Aktivieren von Schreibvorgängen (WREN), und dann das Senden eines Seitenprogrammbefehls.

#define FLASH_CS LATAbits.LATA0 // Chip select pin

void SPI_WriteEnable(void) {
 FLASH_CS = 0;
 SPI1_Exchange8bit(0x06); // WREN command
 FLASH_CS = 1;
}

void SPI_FlashPageProgram(uint32_t addr, uint8_t *data, uint8_t len) {
 SPI_WriteEnable();
 FLASH_CS = 0;
 SPI1_Exchange8bit(0x02); // Page Program command
 SPI1_Exchange8bit((uint8_t)(addr >> 16)); // High address byte
 SPI1_Exchange8bit((uint8_t)(addr >> 8));
 SPI1_Exchange8bit((uint8_t)(addr));
 for (uint8_t i = 0; i < len; i++) {
 SPI1_Exchange8bit(data[i]);
 }
 FLASH_CS = 1;
 __delay_ms(5); // tPP max 5 ms typical
}

void SPI_FlashRead(uint32_t addr, uint8_t *buffer, uint32_t count) {
 FLASH_CS = 0;
 SPI1_Exchange8bit(0x03); // Read command
 SPI1_Exchange8bit((uint8_t)(addr >> 16));
 SPI1_Exchange8bit((uint8_t)(addr >> 8));
 SPI1_Exchange8bit((uint8_t)(addr));
 for (uint32_t i = 0; i < count; i++) {
 buffer[i] = SPI1_Exchange8bit(0x00);
 }
 FLASH_CS = 1;
}

Flash-Speicher können nicht geschrieben werden, ohne einen ganzen Sektor (normalerweise 4 KB) zu löschen, löschen Sie den Sektor immer, bevor Sie ihn umprogrammieren, verwenden Sie den Befehl Sektor löschen (0x20) und rufen Sie das Statusregister ab, bis das Schreib-in-Progress-Bit gelöscht wird.

Erweiterte Techniken: Wear Leveling, Page Management und Firmware-Updates

Wenn Sie große Datenmengen speichern oder häufige Schreibvorgänge durchführen, sollten Sie diese Strategien in Betracht ziehen, um die Lebensdauer des Speichers zu verlängern und die Leistung zu erhalten.

  • Wear Leveling for EEPROM – Schreibe über mehrere Standorte verteilen.
  • Flash Block Management – Verwenden Sie ein einfaches Dateisystem oder eine Metadatentabelle, um zu verfolgen, welche Sektoren gelöscht/in Gebrauch sind. Typische Consumer-SPI-Flash-Chips haben 4 KB Sektoren; das Löschen eines Sektors dauert Dutzende Millisekunden.
  • Firmware Over-the-Air (FOTA) Updates – External Flash kann ein neues Firmware-Image aufnehmen. Der PIC-Bootloader liest das Bild, schreibt es in interne Flash und setzt es zurück. Stellen Sie sicher, dass der Stromverlust während des Schreibens über einen Doppelpuffer oder eine Prüfsummenüberprüfung behandelt wird.
  • Error Detection and Correction – Für kritische Daten CRC oder einfache XOR-Prüfsummen anhängen. Beim Lesen die Integrität überprüfen. Viele externe Speicher haben keine eingebaute ECC, daher sind Softwareprüfungen vorsichtig.

Best Practices und Troubleshooting

Befolgen Sie diese Richtlinien, um Probleme zu minimieren und einen robusten Betrieb zu erreichen.

  • Immer das Datenblatt konsultieren – Die Zeitparameter, Befehlssätze und Pullup-Spezifikationen variieren zwischen den Herstellern.
  • Verwenden Sie richtige Pull-Up-Widerstände für I2C – Der Wert hängt von der Buskapazität und Taktgeschwindigkeit ab. Für einen Bus mit nur einem oder zwei Geräten und 400 kHz beginnen Sie mit 4,7 kΩ. Verwenden Sie ein Oszilloskop, um steigende Flanken zu überprüfen.
  • Umsetzung von Acknowledge Polling – Statt fester Verzögerungen nach dem Schreiben, senden Sie die Geräteadresse wiederholt, bis ein ACK empfangen wird.
  • Halten Sie SPI-Traces Short – SPI läuft bei MHz-Frequenzen; lange Drähte verursachen Klingeln. Fügen Sie Serienwiderstände (22-47 Ω) in der Nähe des PIC-Ausgangs hinzu, um Reflexionen zu dämpfen.
  • Verwenden Sie Entkopplungskondensatoren – Platzieren Sie 0,1 μF Keramik so nah wie möglich am Vdd-Pin jedes Speicherchips.
  • Testen Sie mit bekannten Mustern – Schreiben Sie abwechselnd 0x55, 0xAA und überprüfen Sie die Adressgrenzen (z. B. das Schreiben über eine Seitengrenze sollte vermieden werden).
  • Monitor für Bus Contention – Wenn mehrere SPI-Geräte MISO gemeinsam nutzen, stellen Sie sicher, dass nur eine Chipauswahl gleichzeitig aktiv ist.
  • Behandle Write Protection – Viele Erinnerungen haben einen WP-Pin. Entweder ziehen Sie ihn niedrig, um das Schreiben zu ermöglichen, oder steuern Sie ihn über GPIO, wenn Sie einen selektiven Schutz benötigen.

Beispielprojekt: Datenlogger mit SPI Flash

Um die Konzepte zu verfestigen, sollten Sie einen einfachen Datenlogger in Betracht ziehen, der periodisch einen analogen Sensor liest, den Wert in SPI Flash (z. B. W25Q16) speichert und einen kreisförmigen Puffer verwendet, um die ältesten Daten zu überschreiben. Der PIC wacht aus dem Schlaf, führt eine Konvertierung durch, schreibt in den aktuellen Sektorblock, aktualisiert einen Zeiger im EEPROM und kehrt in den Schlaf zurück. Der externe Flash behält jahrelange Daten mit minimalem Stromverbrauch.

Wichtigste Schritte:

  1. Initialisieren Sie SPI MSSP, konfigurieren Sie CS-Pin als Ausgang.
  2. Lesen Sie beim Start den aktuellen Schreibzeiger von einem kleinen I2C-EEPROM (oder aus dem ersten Sektor von Flash).
  3. Jeder Protokollierungszyklus: lesen Sie ADC → schreiben Sie auf Flash-Seite → Inkrement-Pointer. Wenn der Zeiger das Ende des zugewiesenen Bereichs erreicht, setzen Sie ihn auf Start zurück (Rundschreiben).
  4. Optional CRC der letzten Seite zu berechnen, um Korruption zu erkennen.
  5. Verwenden Sie einen Low-Power-Schlaf zwischen den Intervallen.

Dieses Muster kann auf mehrere Sensoren, Zeitstempel und ereignisgesteuerte Protokollierung erweitert werden.

Schlussfolgerung und weitere Ressourcen

Die Integration von externem EEPROM und Flash-Speicher mit PIC-Mikrocontrollern eröffnet eine breite Palette von Anwendungen, die mehr Speicherplatz benötigen, als der interne Speicher bieten kann. Durch die Auswahl der geeigneten Schnittstelle (I2C oder SPI), die korrekte Verdrahtung und die Implementierung robuster Lese- / Schreibroutinen können Sie jedem eingebetteten System einen zuverlässigen nichtflüchtigen Speicher hinzufügen. Fortgeschrittene Techniken wie Verschleißabgleich, Seitenmanagement und Acknowledge-Abfrage gewährleisten langfristige Haltbarkeit und vorhersehbare Leistung.

Für weitere Informationen, erkunden Sie die folgenden Ressourcen:

Mit sorgfältigem Design und gründlichen Tests kann externer Speicher Ihre PIC-Projekte nahtlos skalieren, um größere Datensätze, Firmware-Updates und persistente Konfigurationsanforderungen zu verarbeiten. Beginnen Sie mit einer einfachen Schreib- / Leseschleife, überprüfen Sie mit einem Logikanalysator oder Oszilloskop und bauen Sie dann die Komplexität schrittweise auf.