2016-05-29
A Microchip 24C04-je volt az első I2C chip amit kézbe vettem, és ezzel lőttem be a TWI kezelő osztályt is. Amikor ezt vettem, még perspektivikusnak látszott a PIC-ekhez. Az AVR chip-ek jobban el vannak látva perifériákkal, ha több memóriára van szükségünk, egyszerűbb egy nagyobb típust választani. De hát ez volt a láda fiában, ezzel próbálkoztam. A többi I2C chip-hez képet a memóriák kezelése, nem bonyolultabb, de mégis a több kódot igényel. Itt megint egy minimál megoldást adok közre, egy lépésben egy byte-ot ír, vagy olvas. Maga a 24C04 lehetővé teszi blokkos írást/olvasást is. Aki szükségét érzi, nyilván le fogja programozni. A chip tartalma 2 ( 256 byte-os) blokkban érhető el. Az IC használható EPROM-ként, vagyis csak olvasható memóriaként is, ilyenkor a WP lábat össze kell kötni a +VCC-vel. Viszon ilyenkor a progi ki fog akadni, ha írni próbálunk a chip-re. A 24C04 címe fix, a cím lábak nincsenek kivezetve, a hozzájuk tratozó bitekkel választjuk ki, hogy melyik blokkhoz akarunk éppen hozzáférni.
/*******************************************************************************
* Author - Kiraly Tibor
* http://www.tkiraaly.hu
* Date - 2016.05.25.
* Chip - 24C04
* Compiler - avr-gcc
*
* k24c04.cpp
* 24C04 eeprom kezelo objektum
*
********************************************************************************
*
* 24LC04B - 2 (blocks) x 256 x 8 bit
* 24LC08B - 4 (blocks) x 256 x 8 bit
*
* address= 10100XBBR
* X not used
* Block ( default 00)
* R/~W
*
* 2,5V - 100 kHz, 5V - 400 kHz
*
* +---------+
* NC ++ 1 8 | +VCC
* NC | 2 7 | WP Write Protect - connect to +VCC
* NC | 3 6 | SCL
* GND | 4 5 | SDA
* +----------+
*
********************************************************************************
Pelda:
#include "k24c04.cpp"
..
k24c04.write( 0, 33, 1);
k24c04.read( 0, 33);
*******************************************************************************/
#ifndef tkiraaly_k24c04
#define tkiraaly_k24c04
#include "ktwi.cpp"
class k24c04_ : public ktwi
{
private:
U8 dev_address;
void wait( void); // varakozas elozo iras befejezesere
void set_block( U8); // block kivalasztasa
public:
k24c04_() {};
U8 read( U8, U8); // egy byte olvasasa
void write( U8, U8, U8); // egy byte irasa
};
k24c04_ k24c04;
void k24c04_::set_block( U8 block) // block kivalasztasa
{
switch( block& 0B00000011)
{
case 1: dev_address= 0B10100010; break;
case 2: dev_address= 0B10100100; break;
case 3: dev_address= 0B10100110; break;
default: dev_address= 0B10100000;
}
}
void k24c04_::wait( void) // varakozas elozo iras befejezesere
{
do
{
start();
}
while( !send_byte( dev_address+ KTWI_WRITE));
}
void k24c04_::write( U8 block, U8 address, U8 data) // egy byte irasa
{
set_block( block);
wait();
send_byte( address);
send_byte( data);
stop();
}
U8 k24c04_::read( U8 block, U8 address) // egy byte olvasasa
{
U8 a= 0;
set_block( block);
wait();
send_byte( address);
start();
send_byte( dev_address+ KTWI_READ);
a= get_byte_nack();
stop();
return a;
}
#endif
Kicsit összetettebb tesztprogramot készítettem hozzá. Egy terminál emulátoron keresztül vezérelhetjük a kapcsolásunkat. Apropó a kapcsolás tulajdonképpen szinte megegyezik a KTWI/KLM75-nél lerajzolttal.
/*******************************************************************************
* Author - Kiraly Tibor
* http://www.tkiraaly.hu
* Date - 2016.05.25.
* Chip - Atmel ATmega8
* Compiler - avr-gcc
*
* k24c04_demo.cpp
* k24c04 demo
*
*******************************************************************************/
#define F_CPU 4 MHZ
#include "katmega8.h"
#include <util/delay.h>
#include "kserial.cpp"
#include "k24c04.cpp"
volatile U8 c= 0; // bejovo char
ISR( IT_USART_RXC) // USART megszakitas kezelese
{
c= UDR;
}
int main( void)
{
U8 i;
kserial.newline();
kserial.newline();
kserial.print( F( "k24c04 demo - T/C/L/M"));
kserial.newline();
for(;;)
{
if (c)
{
switch( c)
{
case 'T':
case 't':
kserial.print( F( "Teszt"));
kserial.newline();
break;
case 'C':
case 'c':
i= 10;
while( i--) k24c04.write( 0, i, 0);
kserial.print( F( "Torolve"));
kserial.newline();
break;
case 'L':
case 'l':
kserial.print( F( "Lista: - "));
i= 10;
while( i--)
{
kserial.print( k24c04.read( 0, i), 'x');
kserial.print( F( ", "));
}
kserial.newline();
break;
case 'M':
case 'm':
i= 10;
while( i--) k24c04.write( 0, i, i);
kserial.print( F( "Minta betoltve"));
kserial.newline();
}
c= 0;
}
}
}
#endif
És itt a vége, fussatok el véle, innen letölthetitek a .hex file-t összecsomagolva.