Gå til innhold

Trenger litt hjelp med å bruke TWI(I2C)bussen på en AVR


Anbefalte innlegg

Hei, jeg holder for tiden på med å skulle kople sammen en DS1621 (digital temperatursensor) og en ATmega16, jeg har veldig lite erfaring eller kunnskap om slike bussytemer, så jeg sliter litt, er det noen som kan forklare litt hvordan rutinene er?

Jeg har prøvd og lese en del på nettet, men ting er likevel veldig uklart og defust for meg.

Lenke til kommentar
Videoannonse
Annonse

Har du lest i databladene til de to kretsene, eventuelt application notes fra Atmel?

Det meste skal stå der i grunn...

 

Prinsippet for TWI/I2C er ganske enkelt; den ene lederen er klokkesignalet, den andre er data signalet. Kretsene har pinnene i open-drain mode når twi brukes. Det vil si at du bare har en transistor som bare kan drive linjene lav, du kan ikke drive linjene høy. Siden det er tilfellet trenger du derfor en motstand som drar linjen høy når den ikke blir drevet lav av en av kretsene som er koblet til den.

Det andre som er smart er at en kan ha mange enheter på samme buss. Her kommer litt av protokollen inn. Hvis en skal sende noe sendes adressen først. Da vil alle andre begynne å lytte for å se om det er "min" addresse som sendes. Hvis det er det vil den utføre det den får beskjed om ut fra om det er lesing skriving o.l. Her kan variasjonen være stor fra enhet til enhet trur jeg... Hvis det er flere enheter som begynner å sende akkurat samtidig vil de også fremdeles lytte på linjen, og siden linja ikke kan drives høy vil en ikke få noen driver konflikter. Hvis en enhet merker at linja drives lav når den selv ikke driver den vil den da vite at det er andre som også driver linja og som har høyere prioritet og dermed gi fra seg kontrollen til den andre.

 

Men alt dette skjer jo i hardware så det er ikke noe en trenger å bry seg om etter at kretsene er satt opp til å bruke TWI. Må bare skrive et program som setter sammen og sender data og adresse (og kommando) på korrekt måte...

Lenke til kommentar

Jeg har brukt I2C/TWI et i et prosjekt, hadde selv ikke noe erfaring med det fra før.

Jeg startet med å lese det som står om using TWI i databladet (jeg brukte ATmega16).

Personlig syntes jeg det var en fordel å skrive ut denne pluss register forklaringene slik at jeg kunne sitte med de foran meg mens jeg skrev koden.

 

Før du gjør step 1 må du ha satt SCL frekvensen du vil bruke, formelen (fra s.170) på dette er

SCL frekvens=(CPU klokke frekvens)/(16+2(TWBR)*4^TWPS)

 

Personlig brukte jeg STK500 kortet, og hadde en klokkefrekvens på 3.68MHz. TWPS bruker bare til skalering, personlig satte jeg denne til null.

 

Regnestykket blir da

TWBR=(CPU frekvens -16*SCL frekvens)/2*SCL frekvens

 

Personlig ville jeg ha SCL frekvens på 100kHz, oig brukte en CPU frekvens på 3.68MHz.

For min del ble TWBR 10.43 hvor jeg da programerte 10 tiL TWBR.

 

Så kodesnippen for akkurat denne delen blir

/*Initialize TWI*/

int TWI_init(void){

TWBR=10; /*Setter SCL frekvensen til ca. 100kHz */

TWCR=0x04; /*Send start condition*/

return 1;

}

 

Etter dette kan du bare "jobbe" deg nedover denne using the TWI lista som står i databladet, og se på hvordan de forskjellige registrene fungerer.

Lenke til kommentar

Jeg glemte og nevne, jeg kan ikke C, jeg koder dette i asm.

 

Jeg satte å styrte og herja med dette i går, og vet sånn ca hvordan selve bussen fungerer nå, litt vanskelig å komme inn i, men når man først forsto litt etter litt så var det ikke så vanskelig likevell.

Noe jeg sliter med nå er hvordan jeg skal bruke sensoren, jeg har fått kontrolleren til og sende kommandoer og jeg får tilbake ACK,

 

Dr_VingTor:

det med at bussen er "open drain", gjelder det bare hvis man har flere enheter på bussen? jeg har ingen motstand på bussen nå, og den klarer likevel og sende, jeg har bare en enhet på nå.

Lenke til kommentar

Når jeg prøver og sende adressen+R/W, så får jeg tilbake 0xf8 fra statusregisteret, er det noen som har vært ute for det? det er ingen forklaring på akuratt den verdien i databladet heller :\

 

EDIT:

liten oppdatering på denne posten, jeg fant ut at f8 ikke betydde mer enn at kontrolleren ikke har noe spesielt og si :p

Jeg har fått den til og kommunisere med sensoren nå, den spyr ut verdier i hytt og gevær :D

Endret av Firesky
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...