This is an old revision of the document!


Laboratorul 0xC6: I2C

This lab covers the topic of I2C. For more in-depth knowledge about working with I2C you can consult the ATmega324 datasheet.

I2C (Inter-Integrated Circuit)

Protocolul I2C (sau IIC - Inter-Integrated Circuit) este un protocol de comunicație serială sincron, multi-master - multi-slave, dezvoltat de către Phillips în anul 1982. O magistrală I2C este formată din următoarele semnale:

  • SDA - linia de date
  • SCL - semnalul de ceas

Semnalul de ceas este generat de către master iar linia de date este controlată atât de master cât și de către slave. La un moment dat un singur dispozitiv de pe magistrală poate controla linia de date. Din acestă cauză protocolul I2C este half-duplex.

Modul de functionare

Față de SPI unde master-ul activa, prin intermediul semnalului de Slave Select, dispozitivul cu care dorea să comunice, I2C nu necesită un asemenea semnal adițional. Protocolul I2C introduce noțiunea de Slave Address. Adresa unui dispozitiv de tip slave este un număr pe 7 biți (cel mai comun), pe 8 biți sau 10 biți. Comunicația dintre un master și un slave se face prin mesaje și este tot timpul inițiată de către master. Aceste mesaje pot fi sparte în două tipuri de cadre:

  • un cadru de adresa
  • unul sau mai multe cadrea de date

Aceste cadre sunt interschimbate numai după ce master-ul a trimis condiția de start. Sfârșitul unui mesaj este identificat prin condiția de stop.

Conditia de Start

Înainte ca master-ul să trimită pe linia de date adresa slave-ului cu care dorește să comunice, acesta trebuie sa genereze o condiție de start. Condiția de start determină toate dispozitivele slave să ”asculte” linia de date pentru că va urma o adresă. Pentru a genera această condiție, master-ul lasă linia SCL in HIGH și pune linia SDA pe LOW.

Cadrul de Adresa

După ce masterul a generat condiția de start, acesta trimite pe linia de date (SDA) adresa dispozitivului slave cu care dorește să comunice. Adresa este (de cele mai multe ori) un număr pe 7 biți (biții A6-A0 din frame-ul din figura de mai jos). Bitul 0 menționează dacă master-ul inițiază o operație de Citire (bitul 0 este 1) sau o operație de Scriere (bitul 0 este 0), așa cum se poate observa în figura.

Slave-ul care își recunoaște adresa trimite un ACK master-ului prin punerea liniei SDA pe LOW în al nouălea ciclu de ceas. Starea default a liniilor SDA/SCL este HIGH datorită rezistențelor de pull-up. Master-ul/Slave-ul doar ”trag” liniile pe LOW.

Master-ul identifică dacă a primit ACK (SDA pus pe LOW) sau NACK (SDA a rămas HIGH pe durata celui de-al nouălea ciclu de ceas).

Cadrele de Date

Dacă master-ul a primit ACK (dacă există un slave pe magistrală cu adresa respectivă), el poate continua cu transmiterea datelor (operație de scriere), sau cu recepția datelor (operație de citire). Numărul de cadre de date este arbitrar, pot fi interschimbate oricâte. Fiecare cadru trimis/recepționat este ACK'd sau NACK'd. În funcție de operație (citire sau scriere), ACK-ul/NACK-ul este trimis fie de master fie de slave.

  • Daca master-ul a inițiat o operație de scriere, fiecare cadru trimis este confirmat (ACK'd) de către slave
  • Daca master-ul a inițiat o operatie de citire, fiecare cadru recepționat este confirmat de (ACK'd) de master. Când master-ul dorește să oprească tranzacția după ce un anumit număr de cadre a fost recepționat, în loc să trimtă ACK trimite NACK. Astfel slave-ul se va opri din transmitere

Conditia de Stop

După ce toate cadrele de date au fost interschimbate, master-ul generează condiția de stop. Aceasta este realizată prin eliberarea linie SDA (trecere din LOW în HIGH) după eliberarea liniei SCL (trecere din LOW în HIGH).

I2C in Atmega324

Atmega324p poate funcționa atât în modul I2C Master cât și I2C Slave. Acesta mai este cunoscut și cu numele de TWI (Two-Wire Interface).

Register Description

TWBR - TWI Bit Rate Register (datasheet 21.9.1. - pagina 235)

TWCR - TWI Control Register (datasheet 21.9.2. - pagina 235)

TWSR - TWI Status Register (datasheet 21.9.3. - pagina 237)

TWDR - TWI Data Register (datasheet 21.9.4. - pagina 237)

Biblioteca I2C Master - API

În acest laborator vom utiliza o bibliotecă pentru a ușura lucrul cu dispozitivele I2C. API-ul acesteia poate fi văzut în headerul ”i2c_master.h” din scheletul de laborator.

Memoria Seriala 24c02

Caracteristici:

  • Capacitate: 2048 biti = 256 bytes
  • Tehnologie de stocare: EEPROM
  • Interfata de conectare: I2C
  • Numar maxim de slave-uri pe acelasi bus: 8
  • Header I2C: 0xA
  • Numar de bytes de adresa memorie: 1
  • Tip de asteptare dupa scriere: 4 msec

Header-ul, primul byte care este trimis intotdeauna dupa Start, este un byte compus din header + adresa slave-ului + un bit care indica daca urmeaza o transmitere (0)(write) sau o receptie (1)(read).

Pentru a putea scrie in memorie, trebuie trimisa o secventa: START

  • Send header + slave address + bit transmisie
  • Send memory address
  • Send the data byte

STOP

Pentru a putea citi din memorie, trebuie trimisa urmatoarea secventa: START

  • Send header + slave address + bit transmisie
  • Send memory address

START

  • Send header + slave address + bit reception
  • Receive data and send ACK
  • Receive data and send ACK
  • Receive data and send NO_ACK

STOP

Setup

Dupa executia tuturor task-urilor:

Tasks

Skeletul programului este aici: lab_0xc6_skeleton.zip.

Memorie seriala 2kbits - n24c02-d.pdf

  1. In primul task trebuie trimisa o simpla secventa pentru a obtine confirmarea (acknowledge-ul) de la device-ul slave cu adresa de slave 0.
  2. Folosind metoda de la task-ul anterior, sa se scaneze si astfel sa se detecteze ce device-uri exista pe bus-ul I2C
  3. In task-ul acesta trebuie scrise doua valori la doua adrese diferite in acelasi device ce are adresa de slave 0
  4. In acest task trebuie citit continutul memorie (primii 4 bytes) ai slave-ului aflat la adresa 0

Responsabil: Adrian Mocanu

pm/lab/lab0xc0-7.1588535189.txt.gz · Last modified: 2020/05/03 22:46 by iuliana.brinzoi
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0