radzio.dxp.pl

Interfejs TWI (Two Wire Interface) występujący w niektórych mikrokontrolerach Atmel AVR (np ATmega16, 32) umożliwia współpracę z układami pracującymi na magistrali I2C opracowanej przez firmę Philips. Dzięki obecności sprzętowego interfejsu komunikacja z układami pracującymi na magistrali I2C jest znacznie prostsza i zajmuje mniej czasu procesora.

TWI Control Register – TWCR
Rejestr sterujący układu TWI. W rejestrze tym zawarte są następujące bity :

  • Bit 7 – TWINT: TWI Interrupt Flag
    Bit ten jest ustawiany sprzętowo po zakończeniu wykonywania przez układ TWI bieżącej operacji. Jeśli bit I w rejestrze statusu oraz bit TWIE w rejestrze TWCR jest ustawiony, to nastąpi wywołanie procedury obsługi przerwania od układi TWI. Bit TWINT jest zerowany programowo poprzez zapis jedynki. Należy pamiętać, że bit nie jest zerowany automatycznie po wywołaniu procedury obsługi przerwania. Należy również pamiętać, że wyzerowanie tego bitu rozpoczyna wykonywanie operacji przez układ TWI, tak więc wszelkie operacje na zawartości rejestrów TWAR, TWSR oraz TWDR muszą zostać zakończone przez wyzerowaniem bitu TWINT
  • Bit 6 – TWEA: TWI Enable Acknowledge Bit
    Bit steruje generowaniem sygnału ACK. Jeśli bit TWEA jest ustawiony to sygnał ACK jest generowany w następujących okolicznościach :
    - układ odebrał własny adres Slave
    - odebrano sygnał globalnego wywołania przy ustawionym bicie TWGCE w rejestrze TWAR
    - odebrano dane w trybie Master Receiver lub Slave Receiver
     
  • Bit 5 – TWSTA: TWI START Condition Bit
    Bit ten jest ustawiany w celu rozpoczęcia transmisji w trybie Master.Układ TWI sprawdza czy magistrala jest wolna i generuje sygnał START. Jeśli magistrala jest zajęta, układ TWI oczekuje na sygnał STOP i wystawia sygnał START w celu uzyskania statusu MASTER na magistali. Bit TWSTA musi zostać wyzerowany programowo po wygenerowaniu sygnału START.
  • Bit 4 – TWSTO: TWI STOP Condition Bit
    Ustawienie bitu TWSTO powoduje wygenerowanie w trybie Master sygnału STOP na magistrali. Bit ten jest automatycznie zerowany po wygenerowaniu sygnału STOP.
  • Bit 3 – TWWC: TWI Write Collision Flag
    Bit jest ustawiany przy próbie zapisu do rejestru TWDR przy wyzerowanym bicie TWINT. Bit jest zerowany po zapisie do rejestru TWDR przy ustawionym bicie TWINT.
  • Bit 2 – TWEN: TWI Enable Bit
    Bit aktywujący interfejs TWI. Gdy bit TWEN jest ustawiony układ TWI przejmuje kontrolę nad wyprowadzeniami mikrokontrolera podłączonymi do linii SDA i SCL. Gdy bit TWEN jest wyzerowany, układ TWI jest wyłączany oraz wszelkie trwające operacje są przerywane.
  • Bit 1 – Res: Reserved Bit
    Ten bit jest zarezerwowany.
  • Bit 0 – TWIE: TWI Interrupt Enable
    Jeśli bit TWIE jest ustawiony, oraz bit I w rejestrze statusowym jest ustawiony, to przerwanie od układu TWI będzie aktywne tak długo, jak bit TWINT będzie ustawiony.
     

Przedstawione poniżej procedury umożliwiają pracę interfejsu TWI w trybie MASTER.

Zawartość pliku TWI.h :

 
#include <avr/io.h>

#define ACK 1
#define NOACK 0

// procedura transmisji sygnału START
void twistart(void);
// procedura transmisji sygnału STOP
void twistop(void);
// procedura transmisji bajtu danych
void twiwrite(char data);
//procedura odczytu bajtu danych
char twiread(char ack);

Zawartość pliku TWI.c :

#include "TWI.h"

// procedura transmisji sygnału START
void twistart(void)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
}

// procedura transmisji sygnału STOP
void twistop(void)
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
while ((TWCR & (1<<TWSTO)));
}

// procedura transmisji bajtu danych
void twiwrite(char data)
{
TWDR = data;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
}

//procedura odczytu bajtu danych
char twiread(char ack)
{
TWCR = ack
? ((1 << TWINT) | (1 << TWEN) | (1 << TWEA))
: ((1 << TWINT) | (1 << TWEN)) ;
while (!(TWCR & (1<<TWINT)));
return TWDR;
}

 

 
(c) Radosław Kwiecień