#include "config.h"
#include "EEPROM.h"
#define EE_ADDRESS1 0x0200
#define CMD_IDLE 0
#define CMD_READ 1
#define CMD_PROGRAM 2
#define CMD_ERASE 3
#define ENABLE_IAP 0x80 //if SYSCLK<30MHz
extern int xdata g_x,g_y,g_z; //ÍÓÂÝÒǽÃÕý²ÎÊý
extern float xdata a_x,a_y; //½Ç¶È½ÃÕý²ÎÊý
extern float data AngleX,AngleY;
u8 xdata tmp[20];
//========================================================================
// º¯Êý: void DisableEEPROM(void)
// ÃèÊö: ½ûÖ¹·ÃÎÊISP/IAP.
// ²ÎÊý: non.
// ·µ»Ø: non.
// °æ±¾: V1.0, 2012-10-22
//========================================================================
void DisableEEPROM(void)
{
IAP_CONTR = 0; //½ûÖ¹ISP/IAP²Ù×÷
IAP_CMD = 0; //È¥³ýISP/IAPÃüÁî
IAP_TRIG = 0; //·ÀÖ¹ISP/IAPÃüÁîÎó´¥·¢
IAP_ADDRH = 0xff; //Çå0µØÖ·¸ß×Ö½Ú
IAP_ADDRL = 0xff; //Çå0µØÖ·µÍ×Ö½Ú£¬Ö¸Ïò·ÇEEPROMÇø£¬·ÀÖ¹Îó²Ù×÷
}
//========================================================================
// º¯Êý: void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
// ÃèÊö: ´ÓÖ¸¶¨EEPROMÊ×µØÖ·¶Á³ön¸ö×Ö½Ú·ÅÖ¸¶¨µÄ»º³å.
// ²ÎÊý: EE_address: ¶Á³öEEPROMµÄÊ×µØÖ·.
// DataAddress: ¶Á³öÊý¾Ý·Å»º³åµÄÊ×µØÖ·.
// number: ¶Á³öµÄ×Ö½Ú³¤¶È.
// ·µ»Ø: non.
// °æ±¾: V1.0, 2012-10-22
//========================================================================
void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
{
F0 = EA;
EA = 0; //½ûÖ¹ÖжÏ
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_READ;
do
{
IAP_ADDRH = EE_address / 256; //Ë͵ØÖ·¸ß×Ö½Ú£¨µØÖ·ÐèÒª¸Ä±äʱ²ÅÐèÖØÐÂË͵ØÖ·£©
IAP_ADDRL = EE_address % 256; //Ë͵ØÖ·µÍ×Ö½Ú
IAP_TRIG = 0x5a; IAP_TRIG = 0xa5;
_nop_();
*DataAddress = IAP_DATA; //¶Á³öµÄÊý¾ÝËÍÍù
EE_address++;
DataAddress++;
}while(--number);
DisableEEPROM();
EA = F0; //ÖØÐÂÔÊÐíÖжÏ
}
/******************** ÉÈÇø²Á³ýº¯Êý *****************/
//========================================================================
// º¯Êý: void EEPROM_SectorErase(u16 EE_address)
// ÃèÊö: °ÑÖ¸¶¨µØÖ·µÄEEPROMÉÈÇø²Á³ý.
// ²ÎÊý: EE_address: Òª²Á³ýµÄÉÈÇøEEPROMµÄµØÖ·.
// ·µ»Ø: non.
// °æ±¾: V1.0, 2013-5-10
//========================================================================
void EEPROM_SectorErase(u16 EE_address)
{
F0 = EA;
EA = 0; //½ûÖ¹ÖжÏ
IAP_ADDRH = EE_address / 256; //ËÍÉÈÇøµØÖ·¸ß×Ö½Ú£¨µØÖ·ÐèÒª¸Ä±äʱ²ÅÐèÖØÐÂË͵ØÖ·£©
IAP_ADDRL = EE_address % 256; //ËÍÉÈÇøµØÖ·µÍ×Ö½Ú
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_ERASE;
IAP_TRIG = 0x5a; IAP_TRIG = 0xa5;
_nop_();
DisableEEPROM();
EA = F0; //ÖØÐÂÔÊÐíÖжÏ
}
//========================================================================
// º¯Êý: void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
// ÃèÊö: °Ñ»º³åµÄn¸ö×Ö½ÚдÈëÖ¸¶¨Ê×µØÖ·µÄEEPROM.
// ²ÎÊý: EE_address: дÈëEEPROMµÄÊ×µØÖ·.
// DataAddress: дÈëÔ´Êý¾ÝµÄ»º³åµÄÊ×µØÖ·.
// number: дÈëµÄ×Ö½Ú³¤¶È.
// ·µ»Ø: non.
// °æ±¾: V1.0, 2012-10-22
//========================================================================
void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
{
F0 = EA;
EA = 0; //½ûÖ¹ÖжÏ
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_PROGRAM;
do
{
IAP_ADDRH = EE_address / 256; //Ë͵ØÖ·¸ß×Ö½Ú£¨µØÖ·ÐèÒª¸Ä±äʱ²ÅÐèÖØÐÂË͵ØÖ·£©
IAP_ADDRL = EE_address % 256; //Ë͵ØÖ·µÍ×Ö½Ú
IAP_DATA = *DataAddress; //ËÍÊý¾Ýµ½IAP_DATA£¬Ö»ÓÐÊý¾Ý¸Ä±äʱ²ÅÐèÖØÐÂËÍ
IAP_TRIG = 0x5a; IAP_TRIG = 0xa5;
_nop_();
EE_address++;
DataAddress++;
}while(--number);
DisableEEPROM();
EA = F0; //ÖØÐÂÔÊÐíÖжÏ
}
void IAP_Gyro(void) //ÍÓÂÝÒÇУ׼
{
u8 i,j;
((int *)&tmp)[0] = g_x; //¶ÁÈ¡ÍÓÂÝÒÇÊý¾Ý
((int *)&tmp)[1] = g_y;
((int *)&tmp)[2] = g_z;
((int *)&tmp)[3] = 0x55aa;
((float *)&tmp)[2] = a_x;
((float *)&tmp)[3] = a_y;
for(i=0,j=0; i<16; i++) j += tmp[i];
j = ~j + 1;
tmp[i] = j;
EEPROM_SectorErase(EE_ADDRESS1); //ÉÈÇø²Á³ý
EEPROM_write_n(EE_ADDRESS1, tmp, 17);
}
void IAPRead(void) //¶ÁÈ¡ÍÓÂÝÒǾ²²î
{
u8 i,j;
EEPROM_read_n(EE_ADDRESS1, tmp, 17);
for(i=0,j=0; i<17; i++) j += tmp[i];
if((j == 0) && (((int *)&tmp)[3] == 0x55aa)) //ÅжÏÊý¾ÝÊÇ·ñÒѾ¸üйý£¬¸üйý²Å¶ÁÈ¡Êý¾Ý
{
g_x = ((int *)&tmp)[0];
g_y = ((int *)&tmp)[1];
g_z = ((int *)&tmp)[2];
a_x = ((float *)&tmp)[2];
a_y = ((float *)&tmp)[3];
}
else
{
g_x = 0;
g_y = 0;
g_z = 0;
a_x = 0;
a_y = 0;
}
}
stc8a的EEPROM.c
最新推荐文章于 2024-06-04 18:18:59 发布