AVR - Microchip 24C04 EEPROM használata

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.