I/O Expander met I2C

Bedankt Arco voor je hulp!

Maar werkt nog steeds niet...

if(g_fromHostToDeviceBuffer[1] == LED1_ON) {

IdleI2C(); // Wait until the bus is idle
StartI2C(); // Send START condition
IdleI2C(); // Wait for the end of the START condition
WriteI2C( 0x40 ); // Send address from slave with R/W cleared for write (0100 0000)
IdleI2C(); // Wait for ACK
WriteI2C( 0x98 ); // Write adress from command register (1001 1000)
IdleI2C(); // Wait for ACK
WriteI2C( 0x00 ); // Write data for the command register
IdleI2C(); // Wait for ACK
WriteI2C( 0x00 ); // Write data for the command register
IdleI2C(); // Wait for ACK
WriteI2C( 0x00 ); // Write data for the command register
IdleI2C(); // Wait for ACK
WriteI2C( 0x00 ); // Write data for the command register
IdleI2C(); // Wait for ACK
WriteI2C( 0x00 ); // Write data for the command register
IdleI2C(); // Wait for ACK
StopI2C();

IdleI2C(); // Wait until the bus is idle
StartI2C(); // Send START condition
IdleI2C(); // Wait for the end of the START condition
WriteI2C( 0x40 ); // Send address from slave with R/W cleared for write (0100 0000)
IdleI2C(); // Wait for ACK
WriteI2C( 0x88 ); // Write adress from command register (1001 1000)
IdleI2C(); // Wait for ACK
WriteI2C( 0xFF ); // Write data for the command register
IdleI2C(); // Wait for ACK
WriteI2C( 0x00 ); // Write data for the command register
IdleI2C(); // Wait for ACK
WriteI2C( 0x00 ); // Write data for the command register
IdleI2C(); // Wait for ACK
WriteI2C( 0x00 ); // Write data for the command register
IdleI2C(); // Wait for ACK
WriteI2C( 0x00 ); // Write data for the command register
IdleI2C(); // Wait for ACK
StopI2C();

}

Arco

Special Member

Klopt het adres 0x40 wel? (A0, A1, A2 aan Gnd?)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Jep liggen alle 3 aan GND.

Aan wat zou het kunnen liggen? Ik denk software maar ik weet niet goed wat...

Arco

Special Member

Pull-ups sda/scl aanwezig? (1...2k2 voor 400kHz, 2k2...10k voor 100kHz)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op mij SCL en SDA? Deze zijn aanwezig, 4K7

Arco

Special Member

SDA en SCL ook niet omgekeerd? (je zou niet de eerste zijn die dat doet... :) )
En /OE pin laag, /RESET hoog?

[Bericht gewijzigd door Arco op woensdag 15 maart 2017 16:10:27 (16%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Juist gecontroleerd en is goed aangesloten.

Zou het zeker geen software fout zijn? In bijlage mijn code.

Ik bekijk nog eens de volledige aansluiting van mijn PCA9505 voor de zekerheid.

Arco

Special Member

Hangt de boel niet ergens in de i2c routines? (kun je controleren door een ledje op de micro zelf aan te steken na de i2c routine)
Dan weet je in ieder geval dat dat goed gaat. (veel libraries hangen als er wat mis gaat in de communicatie)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Het Ledje op de SDA van de PIC plaatsen?

Arco

Special Member

Nee, gewoon op een i/o pin van de processor met serieweerstand. En dan aandoen na verlaten i2c routines.

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Dag Arco,

Ik heb dit zojuist gedaan en de LED brandt, wel wat minder hard dan normaal...

Dag Arco,

Heb je zelf eigenlijk enige ervaring met het schrijven van I2C met PIC processoren, ik denk namelijk dat mijn code grondig verkeerd is en ik heel wat vergeet...
Maar ben er momenteel nog niet uit wat

Arco

Special Member

Ik gebruik I2C en SPI vaak, weinig problemen. (wel met Mikrobasic en Assembly, 'C' kan ik niet erg warm voor lopen... ;) )

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Persoonlijk denk ik dat mijn programma volledig verkeerd is.
Als ik op het internet voorbeelden zoek zie ik heel andere programma's en veel complexer.
Ben je zeker van je stuk van mijn programma?

Arco

Special Member

Voorbeeld heb ik gekopieerd uit een werkend programma...
I2C is vrij simpel qua werking. Als er iets niet goed gaat is een logic analyzer (of scoop) de makkelijkste manier om te kijken wat er gebeurt.
Ik heb deze goedkope (8 euro), werkt goed: http://www.dx.com/nl/p/logic-analyzer-w-dupont-lines-and-usb-cable-for…

https://www.circuitsonline.net/forum/file/21758/forum-post

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Ja, er zijn veel sukkels minder handige mensen die onnodig gecompliceerde progammas schrijven.

Reageert het ding helemaal niet? Controleer of je gewoon na de adres-fase een "ACK" krijgt. Loop alle adressen af.

Met I2C is het lastige dat er 7 adres bits zijn. Het ONDERSTE bitje geeft aan of het om een READ of een write gaat. Als je dan de bovenste 7 bits als 7-bit adres ziet dan zijn de adressen 0-127. Andere mensen vinden het prettiger om te werken met 8 bit adressen, waarbij alle even adressen bestaan en de oneven niet. (of even zijn write adressen, oneven zijn read). Nu is de range ineens 0-254.

Door deze verwarring kan jij volgens het datasheet zien dat het adres 0x40 is, maar mogelijk gebruiken je i2c routines de andere conventie. Gevolg, in je code moet je geen 0x40 maar 0x20 of 0x80 opgeven.

Ik zou voorstellen gewoon alle adressen te scannen en te kijken wanneer je een ACK krijgt.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Is er veel verschil in Mikrobasic? Heb je anders geen voorbeeld?

Ik zal het eens uitmeten met een scoop, maar denk persoonlijk dat ik niets zal zien aangezien er niets gebeurt

Arco

Special Member

Voorbeeldcode die ik gegeven heb werkt in ieder geval. Adres 0x40 klopt voor write. (inderdaad eigenlijk 0x20 met het read of write bit erachter...)
Hangt ook af van de implementatie in de betreffende library, meestal wordt alles 'as is' doorgestuurd. (write naar adres 0x20 wordt dus 0x40)
Is wel netter om een bus restart te gebruiken i.p.v. een stop/start wat je nu doet... (of het iets uitmaakt betwijfel ik)

pic basic code:



  I2CStart()                       'Initialize 
  I2CWrite(0x40)                   'Address
  I2CWrite(0x18+0x80)              'Reg[0x18] with auto increment
  I2CWrite(%00000000)              'Port 0 output
  I2CWrite(%00000000)              'Port 1 output
  I2CWrite(%00000000)              'Port 2 output
  I2CWrite(%00000000)              'Port 3 output
  I2CWrite(%00000000)              'Port 4 output
  I2CRestart()                     'Bus restart
  I2CWrite(0x40)                   'Address
  I2CWrite(0x08+0x80)              'Reg[0x08] with auto increment
  I2CWrite(%11111111)              'Set port 0 all pins high
  I2CWrite(%00000000)              'Set port 1 all pins low
  I2CWrite(%00000000)              'Set port 2 all pins low
  I2CWrite(%00000000)              'Set port 3 all pins low
  I2CWrite(%00000000)              'Set port 4 all pins low
  I2CStop()                        '
 

De 18F4550 gebruik ik al lang niet meer helaas, dus kan ik niet proberen. MikroBasic of -C zit een i2c library bij...

Met een scoop bekijken gaat goed, maar dan moet je wel 2 kanalen hebben om SDA en SCL tegelijk te bekijken. (met 1 kanaal valt er niet veel van te maken)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Bedankt voor je hulp Arco.

Ik heb zonet de SCL en SDA uitgemeten met de scoop.
Als ik mijn board van voedingsspanning voorzie wordt de SDA hoog maar dit is ook het enigste, er wordt niets van data verstuurt over de lijn.

Ik denk dat er iets van initialisatie tekort is in mijn programma. Ik ben wat wanhopig aan het worden. Ik vind maar geen goede informatie hierover.

In de bijlage kan je nog eens mijn volledige code vinden.

Hier ook enkele links van I2C code voor PICs die er heel anders uitzien.

http://www.microchip.com/forums/m36704.aspx
http://www.microchip.com/forums/m843185.aspx

Op 16 maart 2017 10:28:34 schreef pierreke101:
Bedankt voor je hulp Arco.

Ik heb zonet de SCL en SDA uitgemeten met de scoop.
Als ik mijn board van voedingsspanning voorzie wordt de SDA hoog maar dit is ook het enigste, er wordt niets van data verstuurt over de lijn.

Ik denk dat er iets van initialisatie tekort is in mijn programma. Ik ben wat wanhopig aan het worden. Ik vind maar geen goede informatie hierover.

In de bijlage kan je nog eens mijn volledige code vinden.

Hier ook enkele links van I2C code voor PICs die er heel anders uitzien.

http://www.microchip.com/forums/m36704.aspx
http://www.microchip.com/forums/m843185.aspx

Ik denk het misschien gevonden te hebben.

Bij het configureren van mij I2C heb ik voorlopig enkel OpenI2C(MASTER, SLEW_OFF); geschreven.
Maar ik heb de snelheid en welk kristal ik gebruik nog niet geinistaliseerd adhv SSPADD volgens mij..

HOEEEEERAAAAAA!!!!

Dit was dus mijn fout :D na dit te initialiseren is het gelukt!!!!

Bedankt voor jullie hulp en tijd in iedere geval!!!!!!!!!

Arco

Special Member

Mooi dat het werkt... ;)
Normaal zit er een 12c_init bij waar je de baudrate op kunt geven. (bijv. i2c_init(400000)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Nogmaals bedankt!

Heb voorlopig de SSPADD ingesteld op 0x3F, en dit werkt.
Maar denk niet dat dit helemaal correct is., moet nog eens kijken hoe ik deze correct moet instellen