Hur vet jag vilka register jag ska använda vid i2C -MCP23017

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Hur vet jag vilka register jag ska använda vid i2C -MCP23017

Inlägg av Al_Bundy »

Nu tänker jag använda MCP23017 och ett sådant chip använder sig av protokollet i2c. Jag har aldrig hållit på med i2c förut, förutom att använda färdiga bibliotek som gör jobbet åt mig. Men nu ska jag använda ett bibliotek som fungerar som en generell i2c läsare och skrivare.

Jag börjar först med att plocka fram chippet MCP23017. Det som är intressant här för mig är pinnarna: SCL, SDA, A0, A1, A2, Vss, Vdd, RESET. I/O pinnarna är allt från GPA0 -> GPB7.

När jag ska skriva till MCP23017 så är det viktigt att jag använder rätt opdevice adress. Addressen till chippet är: 0 | 1 | 0 | 0 | A2 | A1 | A0 , men opdevice är 0 | 1 | 0 | 0 | A2 | A1 | A0 | R/W

Så om A0 = A1 = A2 = 1 och där R = 0 , så skulle jag få ett hexvärde på 4E och om W = 1 så skulle jag få ett hexvärde på 4F. Notera att MCP23017 har 16-bit hexvärden. R står för read och W står för write. Allt detta kan ni se på sidan 15.

Frågor:

Då kommer vi till register. Vilken ska jag välja? Det verkar som att det finns en hel hög utav register. Därför tänkte jag fråga.
Visst är det GPIOA och GPIOB som jag skall använda om jag vill endast hålla mig digital, dvs ON eller OFF?

Måste jag inkludera startbit i min hex? Eller görs det automatiskt?

Enligt sida 14 så om jag ska läsa så måste jag först skicka Start Bit | Adress | Write bit | Restart bit | Adress | Read bit | och sedan ta emot det som läses in. Men vad är "Restart bit"?

http://ww1.microchip.com/downloads/en/D ... 01952C.pdf

Edit: Vi tar det om igen.

Om jag vill skriva så måste jag skicka följande hex: (se section 3.2.2.1)
1. Start bit 1 = 0x1
2. OP bit 0 | 1 | 0 | 0 | 1 | 1 | 1 = 0x27
3. Write bit 1 = 0x1
4. Sedan skickar jag register som hex t.ex. 0x20 som beskriver vilka utgångar som ska sättas hög eller låg.

Om jag vill läsa så måste jag skicka följande hex (se section 3.2.2.2)
1. Start bit 1 = 0x1
2. OP bit 0 | 1 | 0 | 0 | 1 | 1 | 1 = 0x27
3. Write bit 1 = 0x1
4. Reset bit = ? Vad kan det vara ??
5. OP bit 0 | 1 | 0 | 0 | 1 | 1 | 1 = 0x27
6. Read bit 1 = 0x1
7. Sedan tar jag emot det data som bjuds från MCP23017
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Hur vet jag vilka register jag ska använda vid i2C -MCP2

Inlägg av lillahuset »

Du måste nog sätta upp portarna genom att skriva till konfigureringsregistren först. Kvalificerad gissning.
GPIOA och GPIOB låter som de portar som finns.

Om I²C interfacet i processorn är hyfsat buggfritt behöver du nog inte bry dig om start, restart och stop.
Är det buggigt som det har varit i en PIC jag använt och i STM32F103 när den var ny får du bitbanga I²C. Inte speciellt svårt men irriterande. Varför I²C när den finns med SPI? Heter du egentligen Al Fakiri Bundy?

Edit:
https://www.i2c-bus.org/specification/
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Hur vet jag vilka register jag ska använda vid i2C -MCP2

Inlägg av Al_Bundy »

Det finns faktiskt en indier som har kodat ihop ett exempel när han använder Pi4J biblioteket för att programmera ARM processorer.
https://github.com/oksbwn/MCP23017-_Ras ... /Main.java

Då börjar han att sätta adressen till

Kod: Markera allt

public static final int MCP23017_ADDRESS = 0x20;
Vilket betyder 100 000

I detta fall: 0 | 1 | 0 | 0 | A0 = 0 | A1 = 0 | A2 = 0

Ingen startbit här nej. Pi4J biblioteket kanske automatiskt sätter en startbit före OP adressen? Eller har jag fel?

Edit:

Al Mighty Bundy

Edit2:

i2C är väll bra? Bara två kablar. Typ som CAN bus.
Senast redigerad av Al_Bundy 29 oktober 2018, 22:08:34, redigerad totalt 1 gång.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Hur vet jag vilka register jag ska använda vid i2C -MCP2

Inlägg av lillahuset »

Nej Al Fakiri, det är nog I²C-interfacet. Men huvudsaken är att det blir gjort. :)
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Hur vet jag vilka register jag ska använda vid i2C -MCP2

Inlägg av Al_Bundy »

Okej, Tack! :) Lila-huset.
Ändrade min post ovan.

Så ingen start bit eller ens R/W bit? Bara adress och register?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur vet jag vilka register jag ska använda vid i2C -MCP2

Inlägg av TomasL »

Du anropar väl förmodligen nånting som heter i2cRead(adress, data) eller i2cWrite(adress, data) eller nått liknande, och då behöver du inte bry dig om eventuella skriv/läskommandon etc.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Hur vet jag vilka register jag ska använda vid i2C -MCP2

Inlägg av Al_Bundy »

Jag använder mig utav Pi4J biblioteket som använder sig av Java JNI, som talar med C-kod.

Det jag börjar är att först ansluter till min MCP23017.

Kod: Markera allt

I2CDevice device = i2c.getDevice(OP);
Nu har jag objektet device. Då kan jag läsa och skriva till device igenom metoderna write(address) och read(address).

Då kommer jag till frågan. Den första bilden visar ett flöde och som jag tolkar den så skriver min processor till MCP23017 när jag anropar.

Kod: Markera allt

device.write(BUFFER)
Där BUFFER är en två elements array som innehåller första elementet REGISTER addressen och andra elementet bestämmer pinnarnas höga eller låga värden. Se bild nummer two.

Alltså kommer det se ut så här då:
Startbit -> OP -> W -> BUFFER[0] -> BUFFER[1]
Där jag endast behöver ange OP, BUFFER[0] och BUFFER[1] metoden getDevice(OP) lägger till Startbit automatiskt och metoden write lägger till write också direkt efter OP addressen?

Nu kommer jag till min andra fråga. Hur ska jag göra på den tredje bilden? Jag vet att det står en text, men jag menar mer i praktiken.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Skriv svar