Reklama

Základy ovládání mikrokontroléru ATmega(16/32) 15.díl – Popis implementace komunikace I2C a EEPROM paměti 24LC512

Úvod

V předchozím díle jsme si ukázali jak zprovoznit dvouřádkový LCD display pomocí knihovny, kterou napsal Peter Fleury. Další zajímavá knihovna pro AVR, kterou zde lze nalézt slouží pro řízení komunikace I2C. A právě zprovoznění I2C komunikace pro mikrokontroléry ATmega16/32 je tématem tohoto příspěvku. Základy protokolu I2C jsme již řešili a lze si je přečíst zde: Protokol I2C

Popis implementace I2C a EEPROM paměti 24LC512

Zdrojové kódy pro ovládání I2C komunikace lze stáhnout zde:
http://homepage.hispeed.ch/peterfleury/i2cmaster.zip
a jednoduchý vzorový kód lze nalézt zde:
http://homepage.hispeed.ch/peterfleury/group__pfleury__ic2master.html.
 

Po stažení souboru „i2cmaster.zip“ si vložíme do projektu soubory „i2cmaster.h“ a „twimaster.c“ podobně jako v díle s LCD displejem, tzn. pomocí záložky „Solution Explorer“, kde klikneme pravým tlačítkem myši na název projektu a vybereme „Add – Existing Item…“, viz Obr. 1.

Obr. 1: Vložení stažených souborů

Obr. 1: Vložení stažených souborů

 
Ve zdrojovém kódě „twimaster.c“ přepíšeme definici taktovací frekvence mikrokontroléru:
#define F_CPU 4000000UL na #define F_CPU 16000000UL.
 
Dále je také definovaná frekvence I2C komunikace pomocí:
#define SCL_CLOCK 100000L, kde je nastavena frekvence 100 kHz.
 
Pokud jsou do projektu vložené pouze soubory „i2cmaster.h“ a „twimaster.c“, tak je nutné přepsat v „twimaster.c“ #include <i2cmaster.h> na #include “i2cmaster.h”. Nebo lze zkopírovat celou staženou složku někam k projektu a v nastavení projektu vložit do “AVR/GNU C Compiler -> Directories -> Include Paths” cestu k této složce a pak lze ponechat #include <i2cmaster.h>.
 

Pro demonstraci implementace I2C je použit mikrokontrolér ATmega jako zařízení „MASTER“ a sériová EEPROM paměť 24LC512 jako zařízení „SLAVE“. Jedná se o 512 kbit (64k * 8b) paměť, která je řízená sériově pomocí I2C na frekvenci 100 – 400 kHz. Výrobce udává, že tato paměť vydrží více než milion zápisů, takže se nemusíte bát, že by se vám paměť brzy zničila. Před každým požadavkem pro čtení, nebo zápisem dat předchází řídící byte. Řídící byte obsahuje adresu zařízení a výběr, zda se jedná o čtení, nebo zápis. Popis řídícího bytu lze vidět na Obr. 2.

Obr. 2: Řídící byte

Obr. 2: Řídící byte, převzato z [1]

 

Bity A0, A1 a A2 jsou volitelné, aby bylo možné na jednu sběrnici připojit až osm zařízení, tzn. lze vytvořit až 4 Mbit paměť. Nastavení bitů A0 – A2 závisí na logických úrovních připojených na piny A0 – A2. Bitem R/W ovládáme režim čtení / zápis. Pokud je tento bit ve stavu log. 1, tak bude následovat čtení dat a naopak ve stavu log. 0 bude následovat zápis dat do paměti EEPROM.

 

Zápis dat do paměti

Pokud chcete zapisovat do paměti, musí být pin WP („Write Protection“) ve stavu log. 0. Pokud by na tomto pinu byl stav log. 1., tak je obvod chráněn proti zápisu.
Zapsat do paměti lze buď pouze jeden byte „Byte write“, nebo více bytů za sebou „Page write“. V režimu zápisů více bytů po sobě lze nahrát maximálně 127 hodnot. Komunikační paket pro oba režimy ukazuje Obr. 3.
Obr. 3: Zápis dat do paměti

Obr. 3: Zápis dat do paměti, převzato z [1]

Čtení dat z paměti

Čtení lze také použít ve dvou režimech. První režim slouží k přečtení pouze jednoho bytu „Random read“ a druhý režim „Sequential read“ umožňuje čtení několika dat z paměti po sobě. Komunikační paket pro oba režimy ukazuje Obr. 4.
Obr. 4: Čtení dat z paměti

Obr. 4: Čtení dat z paměti, převzato z [1]

 

Elektronické schéma zapojení

 
Obr. 5: Elektronické schéma zapojení

Obr. 5: Elektronické schéma zapojení
Okomentovaný zdrojový kód
 

001: #define F_CPU 16000000UL// frekvence hodinoveho signalu (nutné pro delay.h)
002:
003: #include <avr/io.h>// knihovna AVR pro Input/output
004: #include <util/delay.h>// hlavickovy soubor pro zpozdeni
005: #include “i2cmaster.h”// hlavickovy soubor pro I2C
006:
007: #define Dev24LC512 0b10101100// adresa EEPROM 24LC512
008: //A2 a A1 = 1; A0 = 0
009: uint8_t value;
010:
011: int main(void)
012: {
013: DDRA = 0xFF; // nastavit PORTA jako vystup
014: PORTA = 0x00;// vsechny LED zhasnout
015:
016: value = 0;
017:
018: i2c_init();// inicializace I2C, zapsat pouze jednou
019:
020: // Zapis 255 hodnot na pozice 0 – 255
021: for (int i = 0; i < 255; i++)
022: {
023: // start byte s adresou a vyberem zapisu
024: i2c_start_wait(Dev24LC512+I2C_WRITE);
025: i2c_write(0x00);// adresa – High byte
026: i2c_write(i);// adresa – Low byte
027: i2c_write(i);// zapis hodnoty na pozici
028: i2c_stop();// I2C stop
029: }
030:
031: while(1)
032: {
033: // cteni hodnot z pozic 0 – 255, vzdy pouze jeden byte
034: for (int i = 0; i < 255; i++)
035: {
036: _delay_ms(250);
037: // start byte s adresou a vyberem zapisu
038: i2c_start_wait(Dev24LC512+I2C_WRITE);
039: i2c_write(0x00); // adresa High byte
040: i2c_write(i);// adresa Low byte
041: // opakovany start byte s adresou a vyberem zapisu
042: i2c_rep_start(Dev24LC512+I2C_READ);
043:
044: value = i2c_readNak();// precteni jednoho bytu z EEPROM, pokud
045: // nasleduje stop bit, pro pripad cteni
046: // vice bytu po sobe se vyuziva
047: // funkce i2c_readAck()
048: i2c_stop(); // I2C stop
049:
050: PORTA = value; // zobrazeni aktualne nactene hodnoty
051: // z pameti EEPROM
052: }
053:
054: }
055: return 0;
056: }

Vzorové zdrojové kódy slouží pouze k jednoduché demonstraci funkce, proto často obsahují globální proměnné, neobsahují většinou ukazatele, dále také neobsahují kontroly proměnných, definování nevyužitých pinů mikrokontroléru a podobné správné programátorské návyky. Proto je nutné tyto kódy brát s patřičnou rezervou.
 

 

Aktualizace: 28.5.2015

[1] MICROCHIP. 24AA512/24LC512/24FC512 – 512K I2C™ Serial EEPROM. [online] citováno 14. prosince 2014. Dostupné na www: http://ww1.microchip.com/downloads/en/DeviceDoc/21754M.pdf
Jiné příspěvky v kategorii:

Základy ovládání mikrokontroléru ATmega(16/32) 1.díl – První kroky

Základy ovládání mikrokontroléru ATmega(16/32) 2. díl – Kompilace a krokování programu

Základy ovládání mikrokontroléru ATmega(16/32) 3.díl – Nahrání vytvořeného zdrojového kódu do mikrokontroléru

Základy ovládání mikrokontroléru ATmega(16/32) 4.díl – Ovládání vstupně/výstupních portů

Základy ovládání mikrokontroléru ATmega(16/32) 5.díl – Ošetření zákmitů na vstupním pinu mikrokontroléru

Základy ovládání mikrokontroléru ATmega(16/32) 6.díl – Externí přerušení

Základy ovládání mikrokontroléru ATmega(16/32) 7. díl – Jednoduchá elektronická hrací kostka

Základy ovládání mikrokontroléru ATmega(16/32) 8.díl – A/D převodník (1.část)

Základy ovládání mikrokontroléru ATmega(16/32) 9.díl – A/D převodník (2.část)

Základy ovládání mikrokontroléru ATmega(16/32) 10.díl – A/D převodník (3.část)

Základy ovládání mikrokontroléru ATmega(16/32) 11.díl – Čítač / Časovač (1.část – Základní popis)

Základy ovládání mikrokontroléru ATmega(16/32) 12.díl – Čítač / Časovač (2.část – Popis registrů)

Základy ovládání mikrokontroléru ATmega(16/32) 13.díl – Čítač / Časovač (3.část – Praktická ukázka)

Základy ovládání mikrokontroléru ATmega(16/32) 14.díl – Dvouřádkový LCD displej

Základy ovládání mikrokontroléru ATmega(16/32) 16.díl – Watchdog

Základy ovládání mikrokontroléru ATmega(16/32) 17.díl – Obsluha maticové klávesnice

Základy ovládání mikrokontroléru ATmega(16/32) 18.díl – Jednotka USART (1. část – Popis)

Základy ovládání mikrokontroléru ATmega(16/32) 19.díl – Jednotka USART (2. část – Praktická ukázka)

Základy ovládání mikrokontroléru ATmega(16/32) 20. díl – Generování audio signálu pomocí PWM

Základy ovládání mikrokontroléru ATmega(16/32) 21. díl – Analogový komparátor

Základy ovládání mikrokontroléru ATmega(16/32) 22. díl – Krokování programu v jazyce symbolických adres (JSA)

 

Tajned facebook
 

Za případné chyby v textu, ve zdrojovém kódě, nebo ve schématickém zapojení se omlouváme.
AUTOŘI NEBEROU ŽÁDNOU ODPOVĚDNOST ZA PŘÍPADNÉ ÚJMY NA ZDRAVÍ ČI MAJETKU.