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;
} |
|