Sida 1 av 1

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

Postat: 29 oktober 2018, 21:03:02
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

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

Postat: 29 oktober 2018, 21:38:22
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/

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

Postat: 29 oktober 2018, 21:59:35
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.

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

Postat: 29 oktober 2018, 22:07:06
av lillahuset
Nej Al Fakiri, det är nog I²C-interfacet. Men huvudsaken är att det blir gjort. :)

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

Postat: 29 oktober 2018, 22:12:18
av Al_Bundy
Okej, Tack! :) Lila-huset.
Ändrade min post ovan.

Så ingen start bit eller ens R/W bit? Bara adress och register?

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

Postat: 29 oktober 2018, 22:39:44
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.

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

Postat: 30 oktober 2018, 22:43:13
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.