i2c-buss hänger sig?

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
mattswe
Inlägg: 166
Blev medlem: 20 augusti 2012, 13:27:51

i2c-buss hänger sig?

Inlägg 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.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
ASEA
Inlägg: 1172
Blev medlem: 11 januari 2015, 14:07:27

Re: i2c-buss hänger sig?

Inlägg 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
Castor
Inlägg: 2224
Blev medlem: 24 mars 2012, 13:03:49

Re: i2c-buss hänger sig?

Inlägg 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.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4773
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: i2c-buss hänger sig?

Inlägg 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
mattswe
Inlägg: 166
Blev medlem: 20 augusti 2012, 13:27:51

Re: i2c-buss hänger sig?

Inlägg 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?
mattswe
Inlägg: 166
Blev medlem: 20 augusti 2012, 13:27:51

Re: i2c-buss hänger sig?

Inlägg 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());
}
mattswe
Inlägg: 166
Blev medlem: 20 augusti 2012, 13:27:51

Re: i2c-buss hänger sig?

Inlägg 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.
hawkan
Inlägg: 3839
Blev medlem: 14 augusti 2011, 10:27:40

Re: i2c-buss hänger sig?

Inlägg av hawkan »

Hur går det om du kör ett av de bifogade exemplen?
ASEA
Inlägg: 1172
Blev medlem: 11 januari 2015, 14:07:27

Re: i2c-buss hänger sig?

Inlägg 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
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av ASEA 19 februari 2026, 13:06:13, redigerad totalt 1 gång.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7723
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: i2c-buss hänger sig?

Inlägg 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.
mattswe
Inlägg: 166
Blev medlem: 20 augusti 2012, 13:27:51

Re: i2c-buss hänger sig?

Inlägg 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?
ASEA
Inlägg: 1172
Blev medlem: 11 januari 2015, 14:07:27

Re: i2c-buss hänger sig?

Inlägg 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?
mattswe
Inlägg: 166
Blev medlem: 20 augusti 2012, 13:27:51

Re: i2c-buss hänger sig?

Inlägg av mattswe »

Ja, kanske det. Det ser fortfarande stabilt ut, riktigt skönt. :)
mattswe
Inlägg: 166
Blev medlem: 20 augusti 2012, 13:27:51

Re: i2c-buss hänger sig?

Inlägg 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?
Användarvisningsbild
Icecap
Inlägg: 26848
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: i2c-buss hänger sig?

Inlägg 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.
Skriv svar