Sari la conținut

Care este diferenta intre librariile I2C si TWI ??


dan_e

Postări Recomandate

De cand cu soft-ul anterior la care lucrez, acum ma uitam in compilatoarele mikroC for PIC si mikroC for AVR (nu m-am uitat in Atmel Studio!) si vad ca se trateaza doua tipuri de librarii pentru transferul datelor pe magistrala SCL-SDA, una de tipiul I2C si una TWI, care este diferenta intre ele ? Adica cand se foloseste una si cand se foloseste alta ?

Link spre comentariu
Distribuie pe alte site-uri

Mersi de explicatie.

Ca sa nu mai deschid alt topic, ca tot are legatura cu magistrala I2C, am incercat sa conectez un EEPROM 24C02 la magistrala I2C a unui atmega8 si din ce am citit:

1. 24C02 are o adresa de identificare prin care atmega8 il anunta ca este slave sau cum ?

2. dupa partea asta trebuie scris un bit de Read sau Write ?

3. cum decurge procedura de scriere si citire EEPROM, trebuie musai in ambele cazuri rulat pasul de mai sus ?

4. ce inseamna notiunea de subadresa, am vazut-o la anumite device-uri? Sau si EEPROM-ul lucreaza cu asa ceva? Adica, daca device-ul X are o adresa de chip (de identificare), apoi niste subadrese si data1...datan. Daca vreau sa trimit niste data1..n (pe 8bit) ce pasi trebuie sa urmez ? Dar la citire ? 

Editat de dan_e
Link spre comentariu
Distribuie pe alte site-uri

Trebuie sa intelegi cum functioneaza protocolul I2C. - daca folosesti o biblioteca atunci stie ea ce trebuie facut (are functii pentru citire sau scriere)

in principiu orice periferics I2C are o adresa "unica" de 7 biti (unica pe bus) si masterul trimite un pachet care-i spune ca vrea sa scrie sau sa citeasca (setand ultimul bit) 

deci primul pachet contine "cu cine" (7 biti) si "ce sa faca" bit-ul al 8-lea. Daca perifericul exista atunci slave-ul trage in "0" linia de date ca sa informeze masterul ca a priceput - adica bit-ul al 9 lea este ACK (acknowledge). ACK este echivalent cu "am inteles" din partea slave-ului.

I2C - learn.sparkfun.com

Chestiile astea nu se invata pe forumuri din pacate

Adresa e adresa cip-ului (A6-A0)  - iar subadresa e adresa din cipul respectiv (in cazul tau adresa de memorie unde vrei sa scrii sau citesti in cip)

aici ai tote functiile de la TWI Mikroe - (care e oribila dupa mine) - ai un exemplu in partea de jos a paginii

http://download.mikroe.com/documents/compilers/mikroc/avr/help/twi_library.htm

RR

 

Editat de roadrunner
Link spre comentariu
Distribuie pe alte site-uri

Am inteles si nu prea. De asta intreb in forum poate citesc si alte explicatii. Uneori ca sa nu spun de multe ori cartile nu explica asa pe intelesul tuturor. Mersi de raspuns inca o data.

Ca sa ma exprim ce nu am inteles eu la transferul asta de date e faptul ca instructiunile incep cu ceva de genul - redau un exemplu redat in softul mikroC for AVR unde se interconecteaza un PCF8583 cu un Atmega32:

Soft_I2C_Start();               // Issue start signal
Soft_I2C_Write(0xA0);           // Address PCF8583, see PCF8583 datasheet
Soft_I2C_Write(2);              // Start from address 2
Soft_I2C_Start();               // Issue repeated start signal
Soft_I2C_Write(0xA1);           // Address PCF8583 for reading R/W=1
seconds = Soft_I2C_Read(1);     // Read seconds byte
minutes = Soft_I2C_Read(1);     // Read minutes byte
hours = Soft_I2C_Read(1);       // Read hours byte
day = Soft_I2C_Read(1);         // Read year/day byte
month = Soft_I2C_Read(0);       // Read weekday/month byte
Soft_I2C_Stop();                // Issue stop signal

Deci, din ce inteleg eu, rutina incepe cu START, WRITE de doua ori (de ce de doua ori?), iar START (de ce, nu e suficient unul?) si iar WRITE (asta cred ca are legatura cu bitul de care spuneai 1 sau 0, adica daca vrea MCU-ul sa citeasca sau sa scrie in device !!! Apoi, citeste niste biti - aici nu poate citi adrese, spre exemplu, formate din 8 biti sau trebuie sa repet citirea de cati biti am nevoie?

Link spre comentariu
Distribuie pe alte site-uri

hai so luam pe rand -

Busul de I2C cand e idle (adica sade ca prostul si nimeni nui zice nimic) - ambele semale SDA,SCK sunt high (sau 1 daca preferi)

Caderea in 0 in secventa SDA trece in low dupa care SCL trece in low -> se cheama conditie de start si are rolul sa faca toate perifericele sa ciuleasca urechile pentru ca urmeaza o tranzactie pe bus. (daca te uiti in diagrama de la postul meu se vede marcata pe diagrama)

Soft_I2C_Start();               // Issue start signal  - conditie de start sa trezeasca pe toti membrii de pe bus
Soft_I2C_Write(0xA0);           // Address PCF8583, see PCF8583 datasheet - Tranzactie de scriere a cipului cu adresa A0 de pe bus 
Soft_I2C_Write(2);              // Start from address 2 - Informeaza PCF8583 ca urmeaza sa fie citit de la adresa 2 - seteraza pointerul de citire din PCF
Soft_I2C_Start();               // Issue repeated start signal - aici informam PCF8583 ca tranzactia continua si nu s-a incheiat
Soft_I2C_Write(0xA1);           // Address PCF8583 for reading R/W=1 - aici il informam pe PCF8583 ca citim, daca te uiti e A1 in loc de A0 adica ultimul bit e 1 (RD=1) 
seconds = Soft_I2C_Read(1);     // Read seconds byte - ctitim adresa numarul 2 (pe care am setat-o in linia 3 de cod)
minutes = Soft_I2C_Read(1);     // Read minutes byte - citim adresa 3
hours = Soft_I2C_Read(1);       // Read hours byte - citim adresa 4
day = Soft_I2C_Read(1);         // Read year/day byte - citim adresa 5
month = Soft_I2C_Read(0);       // Read weekday/month byte - - citim adresa 6
Soft_I2C_Stop();                // Issue stop signal - trimitem conditia de stop ca sa incheiem tranzactia

am adaugat niste comentarii in plus

RR

PS - nu toate cipurile de I2C au nevoie de a doua conditie de start, de obicei e specificat in datasheet daca e necesar. (se cheama repeat start in unele datasheet-uri)

Editat de roadrunner
Link spre comentariu
Distribuie pe alte site-uri

Acum am inteles sa zic in proportie de 90%. Multumesc mult roadrunner.

1. adresa asta 0xA0 o gasesc in datasheet-ul piesei electronice cu care vreau sa comunice microcontrolerul sau este universala ? Ma refer la randul asta:

Soft_I2C_Write(0xA0);           // Address PCF8583, see PCF8583 datasheet - Tranzactie de scriere a cipului cu adresa A0 de pe bus

2. atat la scriere cat si la citire trebuie scris randul de mai sus plus randul de mai jos?

Soft_I2C_Write(0xA1);           // Address PCF8583 for reading R/W=1 - aici il informam pe PCF8583 ca citim, daca te uiti e A1 in loc de A0 adica ultimul bit e 1 (RD=1) 

3. daca vrem sa scriem in loc sa citim de la adresa 2 - codul de mai jos - cum procedam?

Soft_I2C_Write(2);              // Start from address 2 - Informeaza PCF8583 ca urmeaza sa fie citit de la adresa 2 - seteraza pointerul de citire din PCF
Editat de dan_e
Link spre comentariu
Distribuie pe alte site-uri

Acum 1 oră, roadrunner a spus:

 


Soft_I2C_Start();               // Issue start signal  - conditie de start sa trezeasca pe toti membrii de pe bus
Soft_I2C_Write(0xA0);           // Address PCF8583, see PCF8583 datasheet - Tranzactie de scriere a cipului cu adresa A0 de pe bus 
Soft_I2C_Write(2);              // Start from address 2 - Informeaza PCF8583 ca urmeaza sa fie citit de la adresa 2 - seteraza pointerul de citire din PCF

seconds = Soft_I2C_Read(1);     // Read seconds byte - ctitim adresa numarul 2 (pe care am setat-o in linia 3 de cod)

 

Nu cumva e o greseala in comentariul tau citat mai sus ! Adica, citeste (1) si mai sus scrie Write(2), dar ai spus ca citeste adresa nr.2 !!

Link spre comentariu
Distribuie pe alte site-uri

nu e greseala  instructiunea de mai jos - schimba pointerul de memorie din circuitul PCF la adresa 2

Soft_I2C_Write(2);

dupa asta poti citii sau scrie incepande de la adresa 2.

practic linia asta nu face citirea sau scrierea registrului/locatiei de memorie cu adresa 2 ci informeaza cipul ca urmatoare operatie de scriere sau citire se va efectua la adresa 2.

 

de exemplu daca linia aia ar fi fost ca mai jos am fi citit incepand de la adresa 66

......
Soft_I2C_Write(66);              // Start from address 66 - Informeaza PCF8583 ca urmeaza sa fie citit de la adresa 66 - seteraza pointerul de citire din PCF
Soft_I2C_Start();               // Issue repeated start signal - aici informam PCF8583 ca tranzactia continua si nu s-a incheiat
Soft_I2C_Write(0xA1);           // Address PCF8583 for reading R/W=1 - aici il informam pe PCF8583 ca citim, daca te uiti e A1 in loc de A0 adica ultimul bit e 1 (RD=1) 
seconds = Soft_I2C_Read(1);     // ctitim adresa numarul 66 (pe care am setat-o in linia 3 de cod)
minutes = Soft_I2C_Read(1);     // citim adresa 67
hours = Soft_I2C_Read(1);       // citim adresa 68
day = Soft_I2C_Read(1);         // citim adresa 69
......

RR

 

Editat de roadrunner
  • Thanks 1
Link spre comentariu
Distribuie pe alte site-uri

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
  • Navigare recentă   0 membri

    • Nici un utilizator înregistrat nu vede această pagină.
×
×
  • Creează nouă...

Informații Importante

Folosim cookie-uri și tehnologii asemănătoare pentru a-ți îmbunătăți experiența pe acest website, pentru a-ți oferi conținut și reclame personalizate și pentru a analiza traficul și audiența website-ului. Înainte de a continua navigarea pe www.tehnium-azi.ro te rugăm să fii de acord cu: Termeni de Utilizare.

ATENTIE !!! Functionarea Tehnium Azi depinde de afisarea de reclame.

Pentru a putea accesa in continuoare site-ul web www.tehnium-azi.ro, va rugam sa dezactivati extensia ad block din browser-ul web al vostru. Dupa ce ati dezactivat extensia ad block din browser dati clic pe butonul de mai jos.

Multumim.

Apasa acest buton dupa dezactivarea extensiei Adblock