Mikrokontrolery ARM cz19


K U R S
Mikrokontrolery z rdzeniem ARM,
część 19
Interfejsy szeregowe: I2C  przykład
Niestety w zestawie ZL6ARM, Omówiliśmy rejestry niezbędne do posługiwania
który jest naszą platformą sprzę-
się sprzętowym interfejsem I2C, zatem możemy
tową, nie ma żadnego urządzenia
przystąpić do części praktycznej. W artykule
podłączonego do magistrali I2C, dla-
przedstawiamy przykład obsługi pamięci EEPROM
tego przed uruchomieniem przykła-
dołączanej do mikrokontrolera LPC za pomocą
du będziemy musieli przeprosić się
z lutownicą i zmontować na  pa- magistrali I2C.
jąku układ z pamięcią AT24C128
przedstawiony na rys. 54. Linie List. 10.
/Ustawienia kontrolera VIC
SDA i SCL zgodnie ze specyfikacją
#define SCL0_P02_SEL (1<<4)
I2C są  podciągnięte za pomocą re- #define SDA0_P03_SEL (1<<6)
//Adres urzadzenia na magistrali I2C
zystorów 10 kV do plusa napięcia
#define I2C_MEMADDR 0xA0
zasilającego. Tak podłączona pamięć
/* Inicjalizuje interfejs I2C pamiec AT24C128*/
będzie widoczna na magistrali pod
void EepromInit(void)
{
adresem 0xA0. Na list. 10 poka-
PINSEL0 |= SCL0_P02_SEL | SDA0_P03_SEL;
zano fragment programu (ep8c.zip,
//FI2C = PCLK/(SCLL+SCLH)  100KHz
I2C0SCLL = 300;
dostępny na CD EP6/2007B) reali-
I2C0SCLH = 300;
zujący procedury zapisu i odczytu //Wyzeruj wszystkie flagi
I2C0CONCLR = 0x6C;
pamięci AT24C128.
//Wlacz interfejs I2C  MASTER
I2C0CONSET = I2C0CONSET_I2EN;
Funkcja EepromInit() dokonuje
}
inicjalizacji kontrolera I2C. Najpierw
/* Zapisuje komorke pamieci AT24C128
ustawiane są funkcje alternatywne
* addr  adres komorki pamieci do zapisania
portu, tak aby pełniły one rolę li- * val  vartosc liczbowa do zapisania
* Zwraca 0 dla sukces lub wartosc ujemna dla bledu
nii SDA oraz SCL, ustawiana jest
*/
prędkość transmisji magistrali I2C, int EepromWrite(unsigned short addr,unsigned char val)
{
a na koniec włączany jest kontroler
int tmp;
//Licznik nadanych bajtow
magistrali. Funkcja EepromWrite() za-
int cnt = 0;
pisuje pod adresem addr w pamię-
//Rozpocznij nadawanie bitu start
I2C0CONSET = I2C0CONSET_STA;
ci AT24C128 liczbę val. Operacja
//Petla oczekiwania
ta rozpoczyna się od nadania bitu while(1)
{
startu poprzez ustawienie bitu STA
//Czekaj na zdarzenia
while(I2C0STAT==0xF8);
w rejestrze I2C0CONSET, następnie
//Status magistrali
program wchodzi do pętli, w któ-
switch(I2C0STAT)
{
rej w zależności od odpowiedniego
//Bit start zostal nadany
stanu rejestru I2C0STAT podejmu- case 0x08:
//Wyslij adres pamieci I2C
je określone czynności. Po nada-
I2C0DAT = I2C_MEMADDR;
niu bitu startu, rejestr I2C0STAT I2C0CONSET = I2C0CONSET_AA;
I2C0CONCLR = I2C0CONCLR_SIC|I2C0CONCLR_STAC;
przyjmuje wartość 0x08, w wyniku
break;
//Adres I2C zostal nadany
czego do rejestru I2C0DAT wpisy-
case 0x18:
wany jest sprzętowy adres pamięci
//Wyslij starszy bajt adresu
I2C0DAT = addr>>8;
EEPROM, ustawiany jest bit po-
I2C0CONSET = I2C0CONSET_AA;
twierdzenia i kasowany bit startu. I2C0CONCLR = I2C0CONCLR_SIC;
cnt=0;
Następnie kasowany jest bit SI, co
break;
//Dane zostaly nadane
powoduje wykonanie następnego
case 0x28:
//Pierwszy raz
if(cnt==0)
{
//Mlodsza czesc adresu
I2C0DAT = addr;
I2C0CONSET = I2C0CONSET_AA;
I2C0CONCLR = I2C0CONCLR_SIC;
}
//Drugi raz
else if(cnt==1)
{
//Dana do umiesczenia w komorce pamieci
I2C0DAT = val;
I2C0CONSET = I2C0CONSET_AA;
I2C0CONCLR = I2C0CONCLR_SIC;
}
Rys. 54.
Elektronika Praktyczna 6/2007
109
K U R S
List. 10. c.d.
polecenia przez kontroler I2C. Po
//Trzeci raz
nadaniu adresu sprzętowego w ten
else if(cnt==2)
sam sposób jest nadawana starsza {
//Wyslij STOP
część adresu pamięci, następnie
I2C0CONSET = I2C0CONSET_AA|I2C0CONSET_STO;
I2C0CONCLR = I2C0CONCLR_SIC;
młodsza część adresu pamięci oraz
return 0;
dane do zapisania. Na zakończe- }
cnt++;
nie nadawany jest bit stopu. Jeśli
break;
//Jezeli blad zatrzymaj i wyjdz
rejestr I2C0STAT przyjmie wartość
default:
inną od wyszczególnionych w sek-
tmp = I2C0STAT;
I2C0CONSET = I2C0CONSET_AA|I2C0CONSET_STO;
cjach case, oznacza to wystąpienie
I2C0CONCLR = I2C0CONCLR_SIC;
błędu. Funkcja wychodzi wówczas
return  tmp;
}
z pętli głównej i zwraca wartość
}
mniejszą od zera. Funkcja ReadE- }
eprom() odczytuje bajt spod adresu
/* Odczytuje komorke pamieci AT24C128
* addr  adres komorki pamieci
pamięci EEPROM wskazanego jako
* Zwraca zawartosc komorki gdy OK w przypadku bledu
argument. Jest ona nieco bardziej * zwraca wartosc mniejsza od zera
*/
skomplikowana od poprzedniej
int EepromRead(unsigned short addr)
z uwagi na to, że najpierw musi- {
int tmp;
my zapisać do pamięci adres, spod
int cnt = 0;
//Transmit Start BIT
którego chcemy odczytać dane. Na-
I2C0CONSET = I2C0CONSET_STA;
stępnie musimy wysłać ponownie //Petla oczekiwania
while(1)
bit startu, przesłać adres sprzętowy
{
//Czekaj na zdarzenie
tym razem z najmłodszym bitem
while(I2C0STAT==0xF8);
ustawionym do odczytu i dopiero
//Okresl rodzaj
switch(I2C0STAT)
po tej czynności dane mogą być
{
odczytane z pamięci. Ponieważ od- //Bit startu nadany
case 0x08:
czytujemy tylko jeden bajt danych,
//Wyslij Adres pamieci I2C
I2C0DAT = I2C_MEMADDR;
w stanie po wysłaniu adresu w try-
I2C0CONSET = I2C0CONSET_AA;
bie do odczytu (0x58) zerujemy
I2C0CONCLR = I2C0CONCLR_SIC|I2C0CONCLR_STAC;
break;
bit AA w rejestrze I2C0CONCLR,
//Adres zostal nadany
w wyniku czego nie zostanie wy- case 0x18:
//Wyslij starsza czesc adresu
słane potwierdzenie. Będzie to sy-
I2C0DAT = addr>>8;
I2C0CONSET = I2C0CONSET_AA;
gnałem dla układu podrzędnego, że
I2C0CONCLR = I2C0CONCLR_SIC;
jest to ostatnia dana. W przypadku,
cnt=0;
break;
gdy chcielibyśmy przesłać większą
//Dane zostaly nadane
ilość danych, należy bit AA usta- case 0x28:
//Pierwszy raz
wić, a wyzerować tuż przed od-
if(cnt==0)
{
bieraniem ostatniego bajtu danych.
//Wyslij mlodsza czesc adresu
Funkcje te zostały napisane bez
I2C0DAT = addr;
I2C0CONSET = I2C0CONSET_AA;
użycia systemu przerwań, tak aby
I2C0CONCLR = I2C0CONCLR_SIC;
pokazać samą ideę użycia kontrole- }
else
ra I2C. Bez wykorzystania systemu
{
//Wyslij ponowny bit startu
przerwań pożytek ze sprzętowego
I2C0CONSET = I2C0CONSET_STA;
interfejsu I2C w trybie nadrzędnym
I2C0CONCLR = I2C0CONCLR_SIC;
}
i tak jest niewielki, ponieważ mi-
cnt++;
break;
krokontroler w aktywnej pętli cały
//Kolejny bit startu zostal nadany
czas zajmuje się badaniem rejestru
case 0x10:
//Nadaj adres I2C w trybie read
statusu. Dopiero wykorzystanie sys-
I2C0DAT = I2C_MEMADDR|1;
temu przerwań pozwoli wykorzy- I2C0CONSET = I2C0CONSET_AA;
I2C0CONCLR = I2C0CONCLR_SIC|I2C0CONCLR_STAC;
stać procesor do realizacji innych
break;
//Wyslano adres pomyslnie
zadań.
case 0x40:
Program Ep8c.zip wykorzystu-
//Rozpocznik odbieranie danej
I2C0CONCLR = I2C0CONCLR_SIC|I2C0CONCLR_AAC;
jąc poprzednio omówione proce-
break;
dury interfejsu UART, wysyła na- //Odebrano dana  pierwsza i ostatnia
case 0x58:
pis powitalny, a następnie oczekuje
//Wyslij stop
tmp = I2C0DAT;
od użytkownika wpisania komendy
I2C0CONSET = I2C0CONSET_AA|I2C0CONSET_STO;
write=tekst Wydanie tej komendy
I2C0CONCLR = I2C0CONCLR_SIC;
return tmp;
powoduje zapisanie w zewnętrznej
//Jezeli blad
pamięci EEPROM łańcucha teksto- default:
//Zatrzymaj i wyjdz
wego, którego odczyt jest możliwy
tmp = I2C0STAT;
I2C0CONSET = I2C0CONSET_AA|I2C0CONSET_STO;
za pomocą komendy read.
I2C0CONCLR = I2C0CONCLR_SIC;
Lucjan Bryndza, EP
return  tmp;
}
lucjan.bryndza@ep.com.pl
}
}
Elektronika Praktyczna 6/2007
110


Wyszukiwarka

Podobne podstrony:
Mikrokontrolery ARM cz1
Mikrokontrolery ARM cz10
Mikrokontrolery ARM cz14
Mikrokontrolery ARM cz8
Mikrokontrolery ARM cz12
Mikrokontrolery ARM cz15
Mikrokontrolery ARM cz21
Mikrokontrolery ARM cz3
Mikrokontrolery ARM cz6
Mikrokontrolery ARM cz22
Mikrokontrolery ARM cz18
Mikrokontrolery ARM cz18
Mikrokontrolery ARM cz11
Mikrokontrolery ARM cz13
Mikrokontrolery ARM cz17
Mikrokontrolery ARM cz5
Mikrokontrolery ARM cz20
Mikrokontrolery ARM cz7
Mikrokontrolery ARM cz9

więcej podobnych podstron