Table of Contents
Inleiding tot het externe geheugen met PIC Microcontrollers
PIC microcontrollers van Microchip bieden interne EEPROM en Flash voor het opslaan van toepassingscode en kleine hoeveelheden gegevens, maar complexe projecten vereisen vaak meer capaciteit. Externe EEPROM (Elektrisch uitwisbare programmeerbare Lees-Alleen-geheugen) en Flash geheugenchips bieden de extra niet-vluchtige opslag nodig voor het registreren van gegevens, configuratieparameters, firmware-updates en multimedia-activa. Deze uitgebreide gids begeleidt u door het selecteren, verbinden en programmeren van deze externe geheugenapparaten met PIC microcontrollers, die zowel I2C als SPI interfaces in diepte omvatten.
Of u nu een datarecorder, een smart sensorknooppunt of een ingebed systeem bouwt dat kritische instellingen moet behouden na stroomverlies, het begrijpen hoe u extern geheugen efficiënt kunt interfaceren, bespaart tijd en verbetert de betrouwbaarheid. We zullen het hebben over hardwarebedrading, communicatieprotocoldetails, praktische codevoorbeelden, foutafhandeling en geavanceerde technieken zoals slijt- en blokbeheer.
Begrijpen van externe EEPROM en Flash-geheugen
Zowel EEPROM als Flash zijn niet-vluchtig geheugen technologieën, wat betekent dat ze opgeslagen gegevens bewaren wanneer de macht wordt verwijderd. Echter, ze verschillen in architectuur, uithoudingsvermogen, en typische gebruiks gevallen:
- EEPROM . . Ondersteunt byte-level lees- en schrijfbewerkingen. Zijn uithoudingsvermogen is typisch 1 miljoen wissen/schrijven cycli per byte. EEPROM is ideaal voor het opslaan van kleine hoeveelheden vaak bijgewerkte gegevens (bijv. kalibratieconstanten, gebruikersvoorkeuren). Gemeenschappelijke capaciteiten variëren van 1 kbit tot 512 kbit.
- Flash Geheugen
Externe EEPROM en Flash communiceren met de PIC via seriële protocollen (I2C of SPI) of zelden parallelle bussen. Seriele interfaces verminderen het aantal pins en vereenvoudigen PCB-lay-out, waardoor ze de dominante keuze voor embedded ontwerpen.
Het juiste geheugenapparaat kiezen
Bij het selecteren van een externe geheugenchip voor uw PIC-project, evalueren deze criteria:
- Geheugengrootte en capaciteit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
- Communicatieprotocol . . . I2C gebruikt slechts twee draden (SDA en SCL) en ondersteunt meerdere apparaten adressering; het is langzamer maar eenvoudiger. SPI maakt gebruik van vier draden (MISO, MOSI, SCLK, CS) en bereikt hogere snelheden, maar vereist een speciale chip select per apparaat. Kies op basis van uw snelheid en pin beschikbaarheid.
- Speed and Data Transfer Rate . . . I2C draait meestal op 100 kHz of 400 kHz; SPI kan tientallen MHz bereiken. Als u snel moet streamen (bijv. audioweergave), is SPI verplicht. Voor af en toe lezen van kleine configuratieblokken is I2C prima.
- Power Consumer
- Operating Spanning .De meeste PIC's werken bij 3.3V of 5V. Zorg ervoor dat de geheugenchip hetzelfde spanningsbereik ondersteunt. Veel moderne EEPROM's werken van 1,7V tot 5,5V, wat flexibiliteit biedt.
- Kosten en beschikbaarheid .. Gemeenschappelijke families omvatten Microchips 24AA serie (I2C EEPROM), 25AA series (SPI EEPROM), SST25 of Winbond W25Q serie (SPI Flash), en AT24 serie (I2C EEPROM). Controleer distributeur voorraad en lange doorlooptijden.
- Endurance en bewaring . . EEPROM biedt meestal een hoger schrijfduur dan Flash. Gegevensretentie is typisch 40+ jaar. Voor Flash, overwegen het aantal wissen cycli en implementeren slijtage leveling als vaak schrijven.
Microchip... seriële EEPROM selectiegids biedt directe vergelijkingstabellen. Winbond...Winbond... seriële NOR Flash portfolio] geeft populaire SPI Flash-opties. Lees altijd de specifieke datasheet voor timing en commandosets.
Extern geheugen verbinden met de PIC Microcontroller
Hardwarebedrading hangt af van de interface. Hieronder geven we een gedetailleerd I2C en SPI aansluitingen samen met belangrijke overwegingen zoals trekweerstanden en ontkoppelingscondensatoren.
I2C (IIC) Interface
I2C gebruikt twee bidirectionele lijnen: SDA (seriegegevens) en SCL (serieklok). De master (PIC) controleert de klok en start transacties. Elke slaaf heeft een 7-bit of 10-bit adres. Voor EEPROM bestaat het adres vaak uit een vaste prefix plus drie hardware adresspelden (A0, A1, A2) die maximaal acht apparaten op dezelfde bus toelaten.
Wiring:
- Sluit SDA aan op een PIC I/O-pen die als open-drain of bidirectioneel is geconfigureerd.
- Sluit SCL aan op een andere PIC I/O pin.
- Voeg externe trekweerstanden (typisch 4,7 kΩ) van SDA en SCL toe aan Vcc. De waarde is afhankelijk van de capaciteit en snelheid van de bus; voor 400 kHz kan 2.2 kΩ nodig zijn.
- Sluit de geheugen- en WP-speld (write protect) aan op GND om de beveiliging van hardware-schrijven uit te schakelen, of op Vcc om de hele array te beschermen.
- Plaats een 0,1 μF keramische condensator bij de geheugen-krachtpen om lawaai los te koppelen.
Voor hoge snelheid I2C (1 MHz), houden sporen kort en gebruik sterker pull-ups. Voorbeeldchips: Microchip 24LC256 (256 kbit I2C EEPROM), AT24C512 (512 kbit).
SPI-interface
SPI gebruikt vier signalen: MOSI (master out, slave in), MISO (master in, slave out), SCLK (serieklok), en CS[ (chip selecteren, laag actief). Elke SPI slaaf vereist een speciale CS-lijn van de PIC. Meerdere slaven kunnen delen MISO, MOSI, SCLK als ze niet gelijktijdig worden geselecteerd.
Wiring:
- Verbind MOSI (PIC-uitvoer) met geheugen . SI (seriele invoer).
- Verbind MISO (PIC input) met geheugen .
- Sluit SCLK (PIC-uitvoer) aan op geheugen SCK.
- Verbind CS met een digitale PIC-uitgangspen. Voor meerdere geheugens, gebruik aparte pinnen.
- Voeg indien nodig zwakke pull-up (10 kΩ) toe aan de CS-lijn, maar de typische logica volstaat.
- Ontkoppelvermogen met een 0,1 μF condensator.
SPI Flash chips hebben vaak status registers en hebben specifieke commando sequenties nodig (bijv. WREN voordat ze schrijven). Voorbeeldchips: Winbond W25Q32 (32 Mbit SPI Flash), Microchip 25LC256 (256 kbit SPI EEPROM).
Programmeren van de PIC om toegang te krijgen tot extern geheugen
De PIC microcontroller moet de juiste randmodule (I2C of SPI) initialiseren en vervolgens gegevens verzenden/ontvangen volgens het geheugenchips protocol. Zowel Microchips hardware MSSP module (Master Synchronous Serial Port) als software bit-banging kunnen worden gebruikt. De MSSP heeft de voorkeur voor betrouwbaarheid en snelheid.
Voorbeeld van I2C-communicatiecode
Hieronder is een vereenvoudigd maar functioneel voorbeeld met behulp van de MCC (Microchip Code Configurator) gegenereerd HAL voor een PIC16F18877. De code schrijft een enkele byte naar een I2C EEPROM op een bepaald adres en leest deze dan terug.
// 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;
}
Opmerking: Voor pagina schrijft, moet u geen paginagrens overschrijden (typisch 8, 16, of 64 bytes). Raadpleeg het datablad voor paginagrootte. Ook, polling voor erkenning na de schrijfcyclus is efficiënter dan vaste vertragingen.
Voorbeeld SPI-communicatiecode
Voor SPI Flash (bijv. W25Q32) is schrijven vereist dat schrijfopdrachten (WREN) ingeschakeld worden, waarna een Page Program commando verstuurd wordt. Hier is een minimaal voorbeeld met behulp van MSSP in SPI master mode.
#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-geheugen kan niet worden geschreven zonder een hele sector te wissen (typisch 4 KB). Wis altijd de sector voordat u deze herprogrammeert. Gebruik het Sector Wis commando (0x20) gevolgd door het statusregister te peilen totdat het write-in-progress-gedeelte is opgeruimd.
Geavanceerde technieken: Draag Leveling, Page Management en Firmware Updates
Bij het opslaan van grote hoeveelheden gegevens of het uitvoeren van frequente schrijfsels, overwegen deze strategieën om de levensduur van het geheugen te verlengen en prestaties te handhaven.
- Wear Leveling voor EEPROM . . Verdeelt schrijft over meerdere locaties. Bijvoorbeeld, een circulaire buffer index in een speciale EEPROM slot en schrijf gegevens naar de volgende gratis pagina. Dit voorkomt vroege veroudering van een enkele byte.
- Flash Block Management
- Firmware Over-the-Air (FOTA) Updates .Buiten Flash kan een nieuwe firmware afbeelding bevatten. De PIC bootloader leest de afbeelding, schrijft deze naar interne Flash en reset. Zorg ervoor dat stroomverlies tijdens schrijven wordt afgehandeld via een dubbelbuffer of controleom verificatie.
- Foutdetectie en correctie
Beste praktijken en problemen oplossen
Volg deze richtlijnen om problemen te minimaliseren en een robuuste werking te bereiken.
- Raadpleeg altijd de Datasheet . .Tijdparameters, commandosets en pull-up specificaties verschillen tussen fabrikanten. Nooit aannemen compatibiliteit.
- Gebruik juiste trekweerstanden voor I2C .De waarde is afhankelijk van de capaciteit van de bus en de kloksnelheid. Voor een bus met slechts één of twee apparaten en 400 kHz, start met 4.7 kΩ. Gebruik een oscilloscoop om stijgende randen te verifiëren.
- Implement Acknowledge Polling
- Houd SPI Traces Short . . SPI draait op MHz-frequenties; lange draden veroorzaken ringen. Voeg serieweerstanden (22
- Gebruik ontkoppelingscapacitors . . Plaats 0,1 μF keramiek zo dicht mogelijk bij elke geheugenchip . . Vdd pin.
- Test met bekende patronen
- Monitor for Bus Contention
- Handle Write Protection . Veel herinneringen hebben een WP-pin. Ofwel trek het laag om het schrijven of controle via GPIO mogelijk te maken als u selectieve bescherming nodig hebt.
Voorbeeld Project: Data Logger met SPI Flash
Om de concepten te consolideren, een eenvoudige datalogger die periodiek een analoge sensor leest, slaat de waarde in SPI Flash (bijv. W25Q16) op en gebruikt een circulaire buffer om oudste gegevens te overschrijven. De PIC ontwaakt uit de slaap, voert een conversie uit, schrijft naar het huidige sectorblok, update een pointer in EEPROM, en keert terug naar de slaap. De externe Flash behoudt jaren van gegevens met een minimaal energieverbruik.
Belangrijkste stappen:
- Initialiseer SPI MSSP, configureer CS pin als uitvoer.
- Lees bij het opstarten de huidige schrijfwijzer van een kleine I2C EEPROM (of van de eerste sector van Flash).
- Elke logcyclus: lees ADC → schrijf naar Flash pagina → verhoging pointer. Als de pointer het einde van toegewezen gebied bereikt, reset om te beginnen (circulaire).
- Optioneel CRC van de laatste pagina te berekenen om corruptie te detecteren.
- Gebruik lage-vermogen slaap tussen de intervallen.
Dit patroon kan worden uitgebreid tot meerdere sensoren, tijdstempels en gebeurtenisgestuurde logging.
Conclusie en verdere middelen
Het integreren van externe EEPROM en Flash geheugen met PIC microcontrollers opent een breed scala aan toepassingen die meer opslag vereisen dan intern geheugen kan bieden. Door de juiste interface (I2C of SPI) te selecteren, bedrading correct te gebruiken en robuuste lees-/schrijfroutines te implementeren, kunt u betrouwbare niet-vluchtige opslag toevoegen aan elk ingebed systeem. Geavanceerde technieken zoals slijt- en paginabeheer en Acknowledge polling zorgen voor duurzaamheid op lange termijn en voorspelbare prestaties.
Voor meer informatie, verken de volgende bronnen:
- PIC16(L)F18877 Family Datasheet
- Microchip Code Configurator (MCC) . .
- Winbond W25Q32JV Datasheet . . Gemeenschappelijke SPI Flash commando set.
- Microchip 24LC256 EEPROM Datasheet . . . I2C timing voorbeelden.
Met een zorgvuldig ontwerp en grondig testen kan extern geheugen naadloos uw PIC-projecten opschalen om grotere datasets, firmware-updates en persistente configuratiebehoeften te verwerken. Begin met een eenvoudige schrijf/leeslus, verifieer met een logische analyser of oscilloscoop en bouw vervolgens incrementele complexiteit.