Sida 1 av 2

i2c-buss hänger sig?

Postat: 18 februari 2026, 20:21:32
av mattswe
Hej!
Jag håller på med ett projekt (se bifogat kretsschema) som bygger runt en ATmega4809 (40 pin).
På i2c-bussen har jag anslutit följande:
- 2st MCP23017 (I/O expander) - jag kommer att ansluta 8 knappar och 8 leds (med 1k motstånd) till vardera, men i dagsläget har jag bara en led på varje.
- En OLED-modul (128x64px, SSD1106, med inbyggda 4,7k pullups på SDA och SCL).
Först hade jag anslutit egna 4,7k pullup resistorer på SDA och SCL, men sedan insåg jag att OLED-modulen också har sådana, så då tog jag bort mina. (de är fortfarande ritade på kretsschemat)

Jag har även kopplat på en MCP2221A (USB to I2C) till uC, för att kunna ladda upp program via usb.
Under felsökningen har jag även kopplat på en led direkt på uC, som ett "heartbeat".
Jag kodar i Arduino-IDE, och kör ett minimalt program som blinkar de båda ledsen och skriver till oleden (bibliotek u8g2), var 500ms. Jag har testat olika hastigheter på i2c-bussen, kör nu 50 kHz.

När jag startar programmet (slår på strömmen) så kör programmet en stund, men sedan "hänger det sig", även heartbeat-led:en på uC stannar vilket tyder på att programmet hänger. Jag gissar att det är i2c-bussen som hänger sig. Jag läste att SSD1106 vill ha 3,3V men kopplingen uppför sig ungefär lika oavsett om jag matar den med 5V eller 3,3V. Om jag tar bort oleden upplever jag att det blir stabilare men fortfarande hänger det sig efter ett tag. Jag har även hängt på 0,1uF decoupling capacitors på alla Vdd-pins på ic-kretsarna. Långsammare i2c-buss blir lite stabilare, tror jag, men vad jag än gör så hänger det sig efter kortare eller lite längre stund.

Jag börjar få slut på ideer och vore grymt tacksam om någon orkar kasta ett öga på kretsschemat och kanske komma med något nytt uppslag i felsökningen.

Re: i2c-buss hänger sig?

Postat: 18 februari 2026, 20:49:25
av ASEA
Du har ingen logikanalysator du kan hänga på bussen och se vad som händer?

Det finns billiga som duger utmärkt till detta, tex https://amzn.eu/d/07b8fn9B

I2C bibel
https://www.nxp.com/docs/en/user-guide/UM10204.pdf

Re: i2c-buss hänger sig?

Postat: 18 februari 2026, 21:09:49
av Castor
Ett bra sätt att felsöka är att inte köra hela systemet på en gång. Starta med bara displayen tex och se om den hänger sig då också.
Om inte koppla in nästa del och kolla. Du måste förstås ändra programmet så att det inte hänger sig för att viss hårdvara saknas.

Re: i2c-buss hänger sig?

Postat: 18 februari 2026, 23:02:37
av Swech
Koppla in avcc på processorn, även om du inte använder ADn

Testa med ett separat 5V aggregat istället för USB matat

Swech

Re: i2c-buss hänger sig?

Postat: 19 februari 2026, 11:55:54
av mattswe
Hej igen!
Tack för tipsen. Jag har nu anslutit även avcc på uC och jag testar om vartannat med USB-matning/separat aggregat (5V och 3,3V).

Jag tror att jag är något på spåret. När jag har både oled och båda MCP23017 kopplade på i2c-bussen (inga pullups förutom de 4,7k som är inbyggda på oleden) så fungerar det hur bra som helst FÖRUTSATT att programmet bara skickar till oleden. Men när jag även börjar skicka till MCO23017:orna (instruktioner om vartannat) så hänger det sig efter en liten stund. Jag såg någonstans att det ev. kan bli problem om det blir för kort tid mellan anropen, speciellt när man byter mottagare, men jag kör nu 200ms mellan varje anrop, det kan väl inte vara för tight? Vad tror ni om detta?

Re: i2c-buss hänger sig?

Postat: 19 februari 2026, 12:01:47
av mattswe
Jag bifogar här koden jag kör. De två anropen till MCP2307, som jag kommenterat med "orsakar låsning" är hela skillnaden. Med de två raderna låser det sig, utan dem funkar det hur bra som helst.

Kod: Markera allt

#include <Wire.h>
#include <Adafruit_MCP23X17.h>
#include <U8g2lib.h>

Adafruit_MCP23X17 mcp0;
Adafruit_MCP23X17 mcp1;

//U8G2_SH1106_128X64_NONAME_F_HW_I2C oled(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // Full buffer, 0x3C
U8G2_SH1106_128X64_NONAME_1_HW_I2C oled(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // Page buffer, 0x3C

void setup() {
  delay(1000);
  Serial1.begin(115200);
  Wire.begin();
  Wire.setClock(50000); // i2c bus speed
 
  if (!mcp0.begin_I2C(0x20)) {
      Serial1.println("Error.");
    while (1);
  }


  if (!mcp1.begin_I2C(0x21)) {
      Serial1.println("Error.");
    while (1);
  }

  mcp0.pinMode(7,OUTPUT);
  mcp1.pinMode(7,OUTPUT);

  // Start sequence, 3 blink
  digitalWrite(7,LOW);
  for(int i=0;i<4;i++)
  {
    digitalWrite(7,HIGH);
    delay(100);  
    digitalWrite(7,LOW);
    delay(100);  
  }
  Serial1.println("ready");

  oled.begin();
  //oled.clearBuffer();
}

void loop() {
  mcp0.digitalWrite(7, HIGH);    // Orsakar låsning
  delay(200);
  //mcp1.digitalWrite(7, LOW);
  //delay(200);
  drawOLED(false);
  delay(200);
  Serial1.println("tick");

  digitalWrite(7,HIGH); // Heartbeat, pin 7 on uC

  mcp0.digitalWrite(7, LOW);     // Orsakar låsning
  delay(200);
  //mcp1.digitalWrite(7, HIGH);
  //delay(200);
  drawOLED(true);
  delay(200);
  Serial1.println("tack");

  digitalWrite(7,LOW); // Heartbeat, pin 7 on uC
}

void drawOLED(bool state)
{
    oled.firstPage();
    do {
      oled.setFont(u8g2_font_helvB08_tf); // // helvB08, 10, 12, 14, 18, 24 (helvb = bold, helvR = normal)
      if(state) {
        // MON
        oled.drawFrame(-1, 10, 13, 33);
        oled.drawStr(0, 20, "M");
        oled.drawStr(1, 30, "O");
        oled.drawStr(1, 40, "N");
        // MEM
        oled.drawFrame(116, 10, 13, 33);
        oled.drawStr(119, 20, "M");
        oled.drawStr(121, 30, "E");
        oled.drawStr(119, 40, "M");
        oled.drawHLine(0, 50, 128);
      }
      else {
      // MON
      oled.drawFrame(-1, 10, 13, 33);
      oled.drawStr(0, 20, "M");
      oled.drawStr(1, 30, "E");
      oled.drawStr(1, 40, "M");
      // MEM
      oled.drawFrame(116, 10, 13, 33);
      oled.drawStr(119, 20, "M");
      oled.drawStr(121, 30, "O");
      oled.drawStr(119, 40, "N");
      oled.drawHLine(0, 50, 128);        
      }
    } while (oled.nextPage());
}

Re: i2c-buss hänger sig?

Postat: 19 februari 2026, 12:05:51
av mattswe
Om jag bara anropar den ena MCP23017 (inga anrop till den andra eller till oled) så fortsätter det att hänga sig. Så det är nog inte tiden mellan anropen, snarare något problem med MCP23017-kretsarna.

Re: i2c-buss hänger sig?

Postat: 19 februari 2026, 12:14:43
av hawkan
Hur går det om du kör ett av de bifogade exemplen?

Re: i2c-buss hänger sig?

Postat: 19 februari 2026, 12:56:14
av ASEA
Hmm, det är inte så att U3 har fått fel adress?
Är det kopplat exakt som på schemat så tycker jag det blir adress 0x26 istället för 0x21. :humm:
bhgff.jpeg

Re: i2c-buss hänger sig?

Postat: 19 februari 2026, 13:05:19
av Marta
Är Du säker på att de libbar Du valt är kompatibla och rätt konfigurerade så inga minnesadresser delas eller de försöker använda samma hårdvara samtidigt? Antar det är interruptdrivet så sådant kan inträffa.

När det uppstår "magiska" fel har det ofta att göra med interrupt eller flytande cmos-ingångar? Räcker stacken utan risk att kunna bottna? Är där någon funktion i libbar eller MCU Du inte använder, men missat konfigurera bort som känner av en flytande pinne? Är där en watchdogtimer som är igång per default utan rätt programvara?

Har Du ett DSO? Mät då bussignalerna så de erkligen är OK. Det behövs ingen logikanalysator för de två pinnarna.

Mät alla pinnar med scope och se till att allt verkligen är som det skall. Ta inget för givet eller lita på några defaults.

Re: i2c-buss hänger sig?

Postat: 19 februari 2026, 14:35:08
av mattswe
Tack för allt tips. Helt riktigt är adressen inte 00x21 på schemat, men det har jag fixat på breadboarden. Har visst missat att uppdatera schemat där.

Hur som helst, jag tror att jag löst det. Det var en lysande ide att testa exempelprogrammen (man kan tycka att jag borde kommit på det själv). Jag tog bort Wire.begin() eftersom det inte fanns med i exempelprogrammet (tänkte att det kanske blir dubbelanrop, det anropas förmodligen även i begin_i2c()-metoden), men det hjälpte inte. Däremot när jag sänkte Serial-hastigheten från 115200 till 9600 så verkar det som att det blev stabilt. Den har nu kört i över en timme utan låsning (tidigare låsningar oftast inom 5-20s). Däremot förstår jag inte varför det påverkar. Serial-hastigheten borde väl inte ha någon relation till i2c-bussen?

Re: i2c-buss hänger sig?

Postat: 19 februari 2026, 14:52:14
av ASEA
Nice! :) :tumupp:
Det kan inte ha att göra med att det är i grunden samma klocka för både serieporten och I2C och att frekvensen man använder måste gå jämt upp med delningen av densamma?

Re: i2c-buss hänger sig?

Postat: 19 februari 2026, 15:07:44
av mattswe
Ja, kanske det. Det ser fortfarande stabilt ut, riktigt skönt. :)

Re: i2c-buss hänger sig?

Postat: 21 februari 2026, 11:20:59
av mattswe
Tyvärr var jag för snabb att dra slutsatsen att det fungerar. Igår var låsningarna tillbaka. Om jag kommenterar bort all oledkod (begin() och anropen) och bara kör mcp-anrop så funkar det. Och om jag kommenterar bort alla mcp-anrop och bara kör oled så funkar det, men tillsammans låser det sig efter 5s - 2min...ish.

Jag har helt slut på ideer nu så jag har beställt en oled med spi. Lite av ett nederlag, men vad gör man?

Re: i2c-buss hänger sig?

Postat: 21 februari 2026, 11:36:38
av Icecap
Det KAN vara för att de 2 olika funktioner ställer till det för varandra. Utan att ha källkoden till bådera funktioner, kan du inte säkerställa detta.

Detta är just anledningen til att jag aldrig använder funktioner hämtat från nätet.
Jag använder funktioner som jag har hämtat - men de har varit genom en SOLID genomgång och har i 100% av fallen blivit omskriven i någon grad.