///////////////////////////////////////////////////////////////////////////////
//
// 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
|