?lang_form? ?lang_select? ?lang_submit? ?lang_endform?
{HEADER END}
{FILE START}

library

?curdirlinks? - Rev 3

?prevdifflink? - Blame - ?getfile?

///////////////////////////////////////////////////////////////////////////////
//
//   KNIHOVNA PRO PRACI S EXTERNI PAMETI EEPROM RADY 93XX (MICROWIRE SBERNICE)
//
///////////////////////////////////////////////////////////////////////////////
//
// PEFI S.ICZ a.s. 2003
//
// Verze 1.0  - uvodni verze
//
//////////////////////////////////////////////////////////////////////////////
//
// funkce:
//  ExtEE_init()
//   - inicializuje porty
//  EXTEE_DATA_WIDTH_TYPE ExtEE_read_item(EXTEE_ADR_WIDTH_TYPE adr)
//   - precte bajt/word z pameti 
//
//  ExtEE_read_array(EXTEE_ADR_WIDTH_TYPE adr,EXTEE_DATA_WIDTH_TYPE *data, int8 len)
//   - precte pole bajtu/wordu z pameti
//
//  ExtEE_write_enable()
//  - povoli smazani a zapis do pameti
//
//  ExtEE_write_disable()
//  - zakaze smazani a zapis do pameti
//
//  ExtEE_write_item(EXTEE_ADR_WIDTH_TYPE adr,EXTEE_DATA_WIDTH_TYPE data)
//  - zapise bajt/word do pameti
//
//  ExtEE_write_array(EXTEE_ADR_WIDTH_TYPE adr,EXTEE_DATA_WIDTH_TYPE *data,int8 len)
//  - zapise pole bajtu/wodru do pameti
//
//  ExtEE_write_all(EXTEE_DATA_WIDTH_TYPE data)
//  - vyplni celou pamet zadanym bajtem/wordem
//
//  ExtEE_erase_item(EXTEE_ADR_WIDTH_TYPE adr)
//  - smaze bajt/word v pameti
//
//  ExtEE_erase_all()
//  - smaze celou pamet (vyplni 0xFF/0xFFFF)
//
// definice a prepinace
// #define EXTEE_CS                    /* pin, na kterem je pripojen signal CS  */
// #define EXTEE_DI                    /* pin, na kterem je pripojen signal DI  */
// #define EXTEE_DO                    /* pin, na kterem je pripojen signal DO  */
// #define EXTEE_CLK                   /* pin, na kterem je pripojen signal CLK */
// #define EXTEE_DATA_WIDTH            /* pocet bitu dat, bud 8 nebo 16 bitu */
// #define EXTEE_ADR_WIDTH             /* pocet bitu adresy */
//
//
// defaultni definice
#ifndef EXTEE_CS
 #define EXTEE_CS          PIN_A5      /* pin, na kterem je pripojen signal CS  */
#endif
#ifndef EXTEE_DI
 #define EXTEE_DI          PIN_C4      /* pin, na kterem je pripojen signal DI  */
#endif
#ifndef EXTEE_DO
 #define EXTEE_DO          PIN_C5      /* pin, na kterem je pripojen signal DO  */
#endif
#ifndef EXTEE_CLK
 #define EXTEE_CLK         PIN_C3      /* pin, na kterem je pripojen signal CLK */
#endif
 
#ifndef EXTEE_DATA_WIDTH
 #define EXTEE_DATA_WIDTH      8       /* pocet bitu dat  8 nebo 16*/
#endif
#ifndef EXTEE_ADR_WIDTH
 #define EXTEE_ADR_WIDTH       7       /* pocet bitu adresy */
#endif
// POZN: Nastaveni sirky dat a adresy odpovida pameti 93C46 v 8 bitovem provedeni



/****************************************************************************************************/
// Privatni sekce, cist jen v pripade, ze neco nefunguje
/****************************************************************************************************/
// definice prikazu
// prikazy jsou umisteny pred nejvyssi bajt adresy
// u prikazu WEN,WDS,ERAL,WRAL prikaz zasahuje do dvou nejvyssich bitu adresy
#define EXTEE_READ_CMD       (0x06l<<EXTEE_ADR_WIDTH)        /* prikaz pro cteni bajtu/wordu z pameti */
#define EXTEE_WRITE_CMD      (0x05l<<EXTEE_ADR_WIDTH)        /* prikaz pro zapis bajtu/wordu do pameti */
#define EXTEE_ERASE_CMD      (0x07l<<EXTEE_ADR_WIDTH)        /* prikaz pro smazani bajtu/wordu v pameti */
#define EXTEE_WEN_CMD        (0x13l<<EXTEE_ADR_WIDTH-2)      /* prikaz pro povoleni zapisu */
#define EXTEE_WDS_CMD        (0x10l<<EXTEE_ADR_WIDTH-2)      /* prikaz pro zakaz zapisu */
#define EXTEE_ERAL_CMD       (0x12l<<EXTEE_ADR_WIDTH-2)      /* prikaz pro smazani cele pameti */
#define EXTEE_WRAL_CMD       (0x11l<<EXTEE_ADR_WIDTH-2)      /* prikaz,pro vyplneni cele pameti */
//
// definice typu pro data a adresy
#if EXTEE_DATA_WIDTH==8
 #define EXTEE_DATA_WIDTH_TYPE    int8
#elif EXTEE_DATA_WIDTH==16
 #define EXTEE_DATA_WIDTH_TYPE    int16
#else Error Unable data width. Supported width is 8 or 16 bit only.
#endif
#if EXTEE_ADR_WIDTH>8
 #define EXTEE_ADR_WIDTH_TYPE     int16
#else
 #define EXTEE_ADR_WIDTH_TYPE     int8
#endif 

//////////////////////////////////////////////////////////
///// FUNKCE pro inicializaci a pomocne funkce
//////////////////////////////////////////////////////////
// inicializuje port
//
void ExtEE_init()
{
   output_low(EXTEE_CS);
   output_low(EXTEE_CLK);
   output_low(EXTEE_DI);
}


// pomocna funkce
// zapise prikaz a adresu do pameti
//
void ExtEE_write_cmd_adr(int16 cmdadr)
{
 int8 i;

  for(i=0;i<EXTEE_ADR_WIDTH+3;i++)
  {
    if(bit_test(cmdadr,EXTEE_ADR_WIDTH+3-1)) output_high(EXTEE_DI); // serializujeme z nejvyssiho bitu zaznamu
     else output_low(EXTEE_DI);
    output_high(EXTEE_CLK); // hodiny do 1
    output_low(EXTEE_CLK);  // hodiny do 0
    cmdadr=cmdadr<<1;
  }
}





//////////////////////////////////////////////////////////
//    FUNKCE PRO CTENI Z PAMETI
//////////////////////////////////////////////////////////
// pomocna funkce pro cteni
// precte data z pameti, nestara se o adresu ani o vyber pameti, jen prevede seriova data na paralelni
//
EXTEE_DATA_WIDTH_TYPE ExtEE_read_data()
{
  EXTEE_DATA_WIDTH_TYPE data;
  int8 i;

  data=0;
  for(i=0;i<EXTEE_DATA_WIDTH;i++)
  {
   data=data<<1;
   output_high(EXTEE_CLK);       // hodiny do 1
   data=data | input(EXTEE_DO);
   output_low(EXTEE_CLK);        // hodiny do 0
  }
  return(data);
}


// precte bajt/word z pameti
//
EXTEE_DATA_WIDTH_TYPE ExtEE_read_item(EXTEE_ADR_WIDTH_TYPE adr)
{
  EXTEE_DATA_WIDTH_TYPE data;

  output_high(EXTEE_CS);                      // vyber pamet
  ExtEE_write_cmd_adr(EXTEE_READ_CMD | adr);  // posli prikaz a adresu
  data=ExtEE_read_data();                     // precti bajt/word dat
  output_low(EXTEE_CS);                       // uvolni pamet
 return(data);
}


// precte pole bajtu/wordu z pameti
//
void ExtEE_read_array(EXTEE_ADR_WIDTH_TYPE adr,EXTEE_DATA_WIDTH_TYPE *data, int8 len)
{
  output_high(EXTEE_CS);                      // vyber pamet
  ExtEE_write_cmd_adr(EXTEE_READ_CMD | adr);  // posli prikaz a adresu
  do
  {
   *data=ExtEE_read_data();                   // precti bajt/word dat
   data++;                       
  } while(--len);
  output_low(EXTEE_CS);                       // uvolni pamet
}









//////////////////////////////////////////////////////////
///// FUNKCE pro povoleni/zakazani zapisu/mazani pameti
//////////////////////////////////////////////////////////
// povoli smazani a zapis do pameti
//
void ExtEE_write_enable()
{
   output_high(EXTEE_CS);              // vyber pamet
   ExtEE_write_cmd_adr(EXTEE_WEN_CMD); // posli prikaz a adresu
   output_low(EXTEE_CS);               // uvolni pamet
}


// zakaze smazani a zapis do pameti
//
void ExtEE_write_disable()
{
   output_high(EXTEE_CS);              // vyber pamet
   ExtEE_write_cmd_adr(EXTEE_WDS_CMD); // posli prikaz a adresu
   output_low(EXTEE_CS);               // uvolni pamet
}





//////////////////////////////////////////////////////////
///// FUNKCE pro zapis do pameti
//////////////////////////////////////////////////////////
// zapise bajt/word do pameti
//
void ExtEE_write_item(EXTEE_ADR_WIDTH_TYPE adr,EXTEE_DATA_WIDTH_TYPE data)
{
 int8 i;

 output_high(EXTEE_CS);                      // vyber pamet
 ExtEE_write_cmd_adr(EXTEE_WRITE_CMD | adr); // posli prikaz a adresu
 for(i=0;i<EXTEE_DATA_WIDTH;i++)
  {
    if(bit_test(data,EXTEE_DATA_WIDTH-1)) output_high(EXTEE_DI); // serializujeme z nejvyssiho bitu dat
     else output_low(EXTEE_DI);
    output_high(EXTEE_CLK);   // hodiny do 1
    output_low(EXTEE_CLK);    // hodiny do 0
    data=data<<1;
  }
  output_low(EXTEE_CS);       // uvolni pamet, zahaji se zapis v pameti
  output_high(EXTEE_CS);      // vyber pamet
  while(!input(EXTEE_DO));    // cekej az pamet bajt zapise
  output_low(EXTEE_CS);       // uvolni pamet
}

 
// zapise pole bajtu/wodru do pameti
//
void ExtEE_write_array(EXTEE_ADR_WIDTH_TYPE adr,EXTEE_DATA_WIDTH_TYPE *data,int8 len)
{
  do
  {
   ExtEE_write_item(adr++,*data);
   data++;
  }while(--len);
}
 
 
// vyplni celou pamet zadanym bajtem
//
void ExtEE_write_all(EXTEE_DATA_WIDTH_TYPE data)
{
 int8 i;

 output_high(EXTEE_CS);               // vyber pamet
 ExtEE_write_cmd_adr(EXTEE_WRAL_CMD); // posli prikaz a adresu
 for(i=0;i<EXTEE_DATA_WIDTH;i++)
  {
    if(bit_test(data,EXTEE_DATA_WIDTH-1)) output_high(EXTEE_DI); // serializujeme z nejvyssiho bitu dat
     else output_low(EXTEE_DI);
    output_high(EXTEE_CLK);   // hodiny do 1
    output_low(EXTEE_CLK);    // hodiny do 0
    data=data<<1;
  }
  output_low(EXTEE_CS);       // uvolni pamet, zahaji se zapis v pameti
  output_high(EXTEE_CS);      // vyber pamet
  while(!input(EXTEE_DO));    // cekej az pamet bajt zapise
  output_low(EXTEE_CS);       // uvolni pamet
}





//////////////////////////////////////////////////////////
///// FUNKCE pro mazani pameti
//////////////////////////////////////////////////////////
// smaze bajt/word v pameti
//
void ExtEE_erase_item(EXTEE_ADR_WIDTH_TYPE adr)
{
 output_high(EXTEE_CS);                      // vyber pamet
 ExtEE_write_cmd_adr(EXTEE_ERASE_CMD | adr); // posli prikaz a adresu
 output_low(EXTEE_CS);       // uvolni pamet, zahaji se mazani v pameti
 output_high(EXTEE_CS);      // vyber pamet
 while(input(!EXTEE_DO));    // cekej az pamet bajt smaze
 output_low(EXTEE_CS);       // uvolni pamet
}


// smaze celou pamet (vyplni 0xFF)
//
void ExtEE_erase_all()
{
 output_high(EXTEE_CS);               // vyber pamet
 ExtEE_write_cmd_adr(EXTEE_ERAL_CMD); // posli prikaz a adresu
 output_low(EXTEE_CS);       // uvolni pamet, zahaji se mazani  pameti
 output_high(EXTEE_CS);      // vyber pamet
 while(!input(EXTEE_DO));    // cekej az se pamet smaze
 output_low(EXTEE_CS);       // uvolni pamet
}
// End of File
{FILE END}
{FOOTER START}

Powered by WebSVN v2.8.3