Inleiding tot I2C en SPI met PIC Microcontrollers

Microcontrollers van Microchips PIC-familie worden op grote schaal gebruikt in ingebedde systemen, van eenvoudige sensorknooppunten tot complexe industriële controllers. Een belangrijke vaardigheid voor elke embedded ontwikkelaar is de mogelijkheid om randapparatuur te koppelen met behulp van seriële communicatieprotocollen. Twee van de meest voorkomende zijn I2C (Inter-Integrated Circuit) en SPI (Serial Perifeer Interface). Met deze protocollen kunt u sensoren, geheugenchips, displays, ADC's en vele andere apparaten met een minimale bedrading en hoge betrouwbaarheid aansluiten op uw PIC-ontwerp.

Dit artikel biedt een praktische, diepgaande handleiding voor het implementeren van I2C en SPI op PIC microcontrollers. We zullen hardware instellen, registreren configuratie, typische code sequenties, en gemeenschappelijke debugtechnieken behandelen. Tegen het einde heb je de kennis om zeker seriële communicatie toe te voegen aan je volgende PIC project.

Overzicht van I2C en SPI

Beide protocollen zijn synchrone seriële bussen, maar ze verschillen in architectuur, snelheid en toepassing.

I2C (Inter-geïntegreerd circuit)

I2C gebruikt slechts twee draden: SDA (Serial Data) en SCL (Serial Clock). Elk apparaat in de bus heeft een uniek 7-bit of 10-bit adres, en communicatie is meester-slave. De master genereert de klok en start transacties. Meerdere masters kunnen de bus delen met arbitrage. Standaardmodus draait op 100 kHz, snelle modus op 400 kHz, en hoge snelheid modus tot 3,4 MHz. I2C is ideaal voor randapparatuur die geen blazingssnelheid nodig heeft, zoals temperatuursensoren, real-time klokken, EEPROM's en kleine displays.

Omdat er slechts twee draden nodig zijn, bespaart I2C I/O pinnen, waardoor het aantrekkelijk is voor kleine PIC's. Echter, het protocol is complexer dan SPI vanwege adresseren, erkennen bits, en klok stretchen.

SPI (Seriële Perifere Interface)

SPI gebruikt vier regels: MOSI (Master Out Slave In), MISO (Master In Slave Out), SCK[ (Serial Clock), en SS (Slave Select). Het is een full-duplex bus . . . gegevens worden tegelijkertijd verzonden en ontvangen. De master genereert de klok en selecteert de slaaf door zijn chip-select (SS) pin laag te trekken. SPI is aanzienlijk sneller dan I2C, met snelheden in tientallen MHz, en is het protocol van keuze voor high-throughput apparaten zoals SD-kaarten, grafische displays, ADC's en digitale potentiometers.

SPI is eenvoudiger te implementeren in hardware, maar vereist meer pinnen . . een speciale SS-lijn per slave. Veel PIC microcontrollers zijn een speciale Master Synchronous Serial Port (MSSP) module die kan worden geconfigureerd voor I2C of SPI.

Hardware-overwegingen voor I2C en SPI

Voordat je in code gaat duiken, moet je de hardware goed krijgen.

Volledig weerstanden: I2C-lijnen zijn open-drain; ze vereisen externe trekweerstanden (typisch 4,7 kΩ tot 10 kΩ) om SDA en SCL naar V te trekkenDD. De waarde is afhankelijk van de capaciteit en snelheid van de bus. Voor lange bussen of snelle modus kunnen lagere weerstandswaarden nodig zijn om te voldoen aan de specificaties van de stijgingstijd.

Voltageniveaus: Zorg ervoor dat uw PIC en de randapparatuur werken op dezelfde logische spanning (bijv. 3,3 V of 5 V). Als ze verschillen, gebruik niveauverschuivingen zoals de SparkFun BOB‐192009[] of een eenvoudige MOSFET-schakeling.

Buslengte en capacitieve belasting: Voor langere draden (boven een paar inch) houdt de buscapaciteit onder het maximum dat in uw PIC-datablad is gespecificeerd (PIC16F1xxx datasheet) staat vaak 400 pF voor I2C). Voor SPI kunnen langere lijnen signaalreflecties veroorzaken; indien nodig langzamere kloksnelheden en afgeschermde kabels gebruiken.

Ontkoppelingscondensatoren: Plaats 0,1 μF-condensatoren in de buurt van elke ICH-vermogensspelden om geluid te onderdrukken dat gegevens kan beschadigen.

I2C instellen op PIC Microcontrollers

De meeste moderne PIC's omvatten de Master Synchronische Serial Port (MSSP) module die zowel I2C als SPI ondersteunt. We zullen ons richten op de MSSP in I2C master mode voor een typische 8-bit PIC (bijv., PIC16F18877).

Sleutelregisters voor I2C

  • SSPxADD . .Baud rate generator herlaadwaarde. De I2C klokfrequentie wordt afgeleid van de systeemklok met behulp van een formule: FSCL = FOSC[ / (4 * (SSPxADD + 1)). Voor 100 kHz met een 16 MHz oscillator, SSPxADD = 39.
  • SSPxSTAT .Bits geven een botsing aan tussen bussen, een botsing schrijven en of er een start-stoptoestand is gedetecteerd.
  • SSPxCON1 . . Controle register 1. Selecteert I2C-modus (master, slave) en maakt de module mogelijk.
  • SSPxCON2 . . . Master mode control. Commando's voor het verzenden van Start, Herstart, Stop en erkenning.
  • SSPxBUF . . Gegevensbuffer. Schrijf om te verzenden, lees om te ontvangen.

I2C Master Initialisatie Sequence

  1. Schakel de MSSP module uit door de SPEN bit (SSPxCON1<5>) te wissen.
  2. I2C-mastermodus instellen (meestal 0x08 in SSPxCON1 bits <3:0>).
  3. Configureer de baud rate door SSPxADD te laden met de juiste waarde.
  4. Stel SDA en SCL-pennen in als ingangen met zwakke pull-ups (of gebruik externe weerstanden).
  5. Activeer de module door SSPEN in te stellen.
  6. Optioneel interrupts voor de MSSP inschakelen.

Voorbeeld: Lezen van een LM75 temperatuursensor

De LM75 heeft een 7-bits adres (typisch 0x48 voor de A0-A2 pinnen geaard). Om het temperatuurregister te lezen (pointer 0x00), moet je eerst de pointer schrijven, dan een herhaalde start en lees genereren.

Schrijfaanwijzerreeks: Start → adres byte (0x90) → wacht op ACK → pointer byte (0x00) → wacht op ACK → Stop.

Lees temperatuurreeks: Start → adres byte (0x91) → wacht op ACK → lees twee bytes (MSB, LSB) → NACK op laatste byte → Stop.

Elke byte uitwisseling vereist polling van het SSPxSTAT register voor de BF (Buffer Full) bit en de SSPxIF interrupt flag. Een veel voorkomende fout is het vergeten om de AKK/NACK te versturen na het ontvangen van gegevens. Gebruik de ACKDT en ACKEN[] bits in SSPxCON2 om te controleren te erkennen.

I2C-vallen

  • Klok rekt: Sommige slaven houden SCL laag om de master te vertragen. Schakel de ondersteuning van de klok uit in de MSSP (zet de CKP bit passend in).
  • Bus botsing: Als een andere master probeert om de bus te rijden, de MSSP zet de BCLIF vlag. Gebruik dit om de transactie opnieuw te proberen.
  • Stuck bus: Als een slaaf geen SDA vrijgeeft na een transmissie, kan de bus hangen. Implementeer een timeout die negen klokpulsen stuurt om te herstellen.

SPI instellen op PIC Microcontrollers

De MSSP kan ook werken in SPI master of slave mode. We ..zullen de master mode, die het meest gebruikelijk is.

Sleutelregisters voor SPI

  • SPIxBRG . . . Baud rate generator. Voor SPI is de klokfrequentie FOSC / (2 * (SPIxBRG + 1)).
  • SPIXSTAT .. Status register. Bevat de BF bit, schrijf botsing, ontvangen overflow vlaggen.
  • SPIXCON1 . . Controleregister 1. Selecteert master/slave, klokpolariteit (CKP), klokfase (CKE), en monsterpunt (SMP).
  • SPIxCON2 . . . Extra controle (bv. framemodus, SS2 inschakelen).
  • SPIxBUF . . Gegevensbuffer voor verzenden en ontvangen (gebufferd).

SPI Master Initialisatie Sequence

  1. Schakel de SPI module (clear SSPEN) uit.
  2. Stel de gewenste klokpolariteit en -fase in. Mode 0 (CKP=0, CKE=1) is de meest voorkomende: gegevens worden bemonsterd op de stijgende rand en verschoven op de vallende rand.
  3. Configureer de baud rate in SPIXBRG. Voor 1 MHz met een 16 MHz klok, SPIXBRG = 7.
  4. Selecteer master mode (SSPM bits = 0b0000 voor SPI master, klok = FOSC/4).
  5. Stel de SS-pinrichting in. Op veel PIC's is de SS-pin een speciale ingang in de mastermodus. Voor slaveselectie moet je een aparte GPIO-pin schakelen die verbonden is met de slave chip-select.
  6. Schakel de module in.

Voorbeeld: Interfacing met een MCP3008 8-kanaals ADC

De MCP3008 is een 10-bits ADC die communiceert via SPI in modus 0. Om een kanaal te lezen (bv. kanaal 0) stuurt de master drie bytes: een start bit, een single-end/differentiaal bit en het kanaaladres. De slaaf geeft tegelijkertijd twee data bytes terug.

Transactiereeks:
1. Drive SS low.
2. Schrijf 0x01 (start bit) naar SPIXBUF

Merk op dat elk schrijven naar SPIXBUF een gelijktijdige ontvangst activeert. U moet de buffer na elk schrijven lezen om overflow te vermijden.

Beheer van meerdere SPI Slaves

Elke slaaf heeft een unieke chip-select pin nodig. Gebruik één GPIO per slave. Zorg ervoor dat er een kleine vertraging is tussen het veranderen van de SS-pin en het starten van de klok om te voldoen aan de installatie tijdvereisten van de slaaf. Veel PIC's laten u toe om de hardware SS-pin alleen in slave-modus te gebruiken voor automatische slaaf-select generatie; in master-modus moet u dit handmatig doen.

Debuggen I2C en SPI-communicatie

Als dingen niet werken, volg dan een methodische aanpak:

  • Gebruik een logische analyser of oscilloscoop. Dit is het meest effectieve debuggen hulpmiddel. Controleer of de klok aanwezig is, dat er gegevenstransities optreden en adressen correct zijn. Controleer voor I2C de start-/stopvoorwaarden en bevestig bits.
  • Controleer pull-up weerstanden. Als SDA of SCL laag blijven, kan er een apparaat in de bus zitten. Verbreek alle slaven behalve één en probeer het opnieuw.
  • Verifiëren van de baud rate. Meet het kloksignaal met een scope. Voor I2C moet de klokfrequentie binnen de slaafspecificatie liggen.
  • Een veel voorkomende fout is het versturen van een 7-bit adres zonder dat je linksaf gaat (het R/W bit gaat in LSB). Onthoud dat de adres byte is (adres < < 1)
  • Voor SPI, controleer de polariteit en fase van de klok. Veel slaven zijn gevoelig voor de exacte modus. Raadpleeg de slave. Zorg er ook voor dat de chip-select lijn laag actief is en dienovereenkomstig wordt aangedreven.

Als hardware debuggen de juiste golfvormen aan het licht brengt, kan het probleem in uw firmware zitten. Gebruik debug LED's of een seriële console om statusregisters af te drukken. Veel PIC-ontwikkelingsborden bevatten een on-board programmer/debugger (bijv. MPLAB PICkit 4) die u kunnen helpen door de code te stappen.

Software Bit-Banging als back-up

Als de hardware randapparatuur niet beschikbaar is of als je een PIC moet gebruiken die een MSSP mist, kun je I2C of SPI implementeren in software met behulp van GPIO pinnen. Voor I2C bit-banging schakel je SDA en SCL rechtstreeks in, met inachtneming van tijdvertragingen. Voor SPI verschuift je bits via een GPIO en tegelijkertijd leest je de invoerpin. Bit-banging is flexibel maar verbruikt CPU cycli en is langzamer. Het is ook een goede manier om het protocol op een laag niveau te leren.

Geavanceerde onderwerpen

I2C Multi-Master en kloksnelheidsmeting

Wanneer meerdere meesters de bus delen, moet u de arbitrage zorgvuldig afhandelen. De MSSP in PIC ondersteunt de multi-master modus; het bewaakt de bus en zal de controle opgeven als een andere meester gegevens stuurt. Gebruik de busaanvaring interrupt (BCLIF) om verlies van arbitrage te detecteren en opnieuw te proberen na een willekeurige vertraging.

Voor snellere I2C (bv. 400 kHz) kunt u de slw-snelheidsregeling op de uitgangspennen inschakelen (indien beschikbaar) en sterkere trekweerstanden gebruiken (bv. 2,2 kΩ). Sommige PIC's hebben een speciale SPxADD die op waarden kunnen worden ingesteld die kleiner zijn dan nul door gebruik te maken van een voorschaalder.

SPI Daisy-Chaining en DMA

Sommige SPI-apparaten ondersteunen daisy-chaining, waarbij de data output (MISO) van het ene apparaat de invoer (MOSI) van het volgende apparaat voedt. Hierdoor kunnen meerdere slaves met één chip-select lijn. De MSSP kan daisy-chaining aan als de apparaten het ondersteunen.

Voor SPI met hoge snelheid kunt u overwegen om gebruik te maken van de PIC. Direct Memory Access (DMA) controller (beschikbaar op veel nieuwere PIC's). DMA kan gegevens overbrengen naar/van de SPI buffer zonder CPU interventie, waardoor de kern vrij is voor andere taken. De randapparatuur van DMA wordt geconfigureerd met bron, bestemming en tellen, waarna de SPI interrupt wordt geactiveerd.

Conclusie

I2C en SPI zijn essentiële tools in elke embedded designer kit. Met de flexibele MSSP module gevonden in de meeste PIC microcontrollers, de implementatie van deze protocollen is eenvoudig zodra u de register setup en timing parameters begrijpt. Begin altijd met een eenvoudige test . . een dummy write /read loop . . om uw hardware en software foundation te verifiëren.

Datasheets blijven je beste vriend: Microchip