📄 sst39vf1601.c
字号:
SectorErase(index_address/(2*1024));
}
else
{
SectorErase(481);
index_address=481*2*1024;
}
}
index_start_address=index_address;
i=0;
}
else
{
if(!(++index_address%(2*1024)))
{
if((index_address/(2*1024))<496)
{
SectorErase(index_address/(2*1024));
}
else
{
SectorErase(481);
index_address=481*2*1024;
}
}
}
}
else
{
if(!WordProgram(index_address,WordRead(old_index_start_address+i-15*2*1024)))
{
if(!(++index_address%(2*1024)))
{
if((index_address/(2*1024))<496)
{
SectorErase(index_address/(2*1024));
}
else
{
SectorErase(481);
index_address=481*2*1024;
}
}
index_start_address=index_address;
i=0;
}
else
{
if(!(++index_address%(2*1024)))
{
if((index_address/(2*1024))<496)
{
SectorErase(index_address/(2*1024));
}
else
{
SectorErase(481);
index_address=481*2*1024;
}
}
}
}
}
goto L1;
}
else
{
if(!(++index_address%(2*1024)))
{
if((index_address/(2*1024))<496)
{
SectorErase(index_address/(2*1024));
}
else
{
SectorErase(481);
index_address=481*2*1024;
}
}
}
if(!WordProgram(index_address,log_address))//2.写新日志存储地址低16位到日志目录
{
old_index_start_address=index_start_address;
goto L2;
}
else
{
if(!(++index_address%(2*1024)))
{
if((index_address/(2*1024))<496)
{
SectorErase(index_address/(2*1024));
}
else
{
SectorErase(481);
index_address=481*2*1024;
}
}
}
if(!WordProgram(index_address,log_len))//3.写新日志长度到日志目录
{
old_index_start_address=index_start_address;
goto L2;
}
//更新总日志数并将新目录起始地址存储
total_log++;
if(total_log>Max_log)
{
total_log=Max_log;
index_start_address+=3;
}
SectorErase(480);
if(WordProgram(480*2*1024,total_log)&&WordProgram(480*2*1024+1,index_start_address>>16)&&WordProgram(480*2*1024+2,index_start_address))
{
return 1;
}
else
{
return 0;
}
}
/****************************************************************************
* 名称:log_read()
* 入口参数:ID:待查日志序号
Addr:日志存放地址
* 出口参数:返回实际查询日志类型
* 功能:单个日志查询
****************************************************************************/
uint16 log_read(uint16 ID,uint16 *Addr)
{
uint8 i;
uint16 total_log,log_len,*p=Addr;
uint32 log_index_start_address,log_index_address,log_address;
total_log=WordRead(480*2*1024);
if(ID>total_log||ID==0)
{
return 0;
}
log_index_start_address=(WordRead(480*2*1024+1)<<16)+WordRead(480*2*1024+2);
log_index_address=log_index_start_address+(ID-1)*3;
if(log_index_address<496*2*1024-2)
{
log_address=(WordRead(log_index_address)<<16)+WordRead(log_index_address+1);
log_len=WordRead(log_index_address+2);
}
else if(log_index_address==496*2*1024-2)
{
log_address=(WordRead(496*2*1024-2)<<16)+WordRead(496*2*1024-1);
log_len=WordRead(481*2*1024);
}
else if(log_index_address==496*2*1024-1)
{
log_address=(WordRead(496*2*1024-1)<<16)+WordRead(481*2*1024);
log_len=WordRead(481*2*1024+1);
}
else
{
log_index_address-=15*2*1204;
log_address=(WordRead(log_index_address)<<16)+WordRead(log_index_address+1);
log_len=WordRead(log_index_address+2);
}
if(log_address>512*2*1024-1||log_address<496*2*1024)
{
return 0;
}
for(i=0;i<log_len;i++)//将待查日志拷贝到p地址开始的内存中
{
*(p+i)=WordRead(log_address+i);
}
return *p;
}
/****************************************************************************
* 名称:Alarm_Occur()
*入口参数:biaoshi:数据标示号
Alarm_status:告警状态(告警/告警恢复)
* 功能:发生告警
****************************************************************************/
uint8 Alarm_Occur(uint16 biaoshi,uint16 Alarm_status)
{
uint8 i=0;
struct str{
uint16 log_type;
uint16 index;
uint16 status;
uint8 Time[8];
}str1;
str1.log_type=0x01;
str1.index=biaoshi;
str1.status=Alarm_status;
Gettime();
for(i=0;i<8;i++)
str1.Time[i]=Date[i];
if(Create_log((uint16*)&str1,size=sizeof(str1)))
return TRUE;
else
return FALSE;
}
/****************************************************************************
* 名称:Alarm_message_SendStatus()
*入口参数:Send_status:发送状态(成功/不成功)
* 功能:告警信息发送状态
****************************************************************************/
uint8 Alarm_message_SendStatus(uint16 Send_status)
{
uint8 i=0;
struct str{
uint16 log_type;
uint16 status;
uint8 Time[8];
}str1;
str1.log_type=0x02;
str1.status=Send_status;
Gettime();
for(i=0;i<8;i++)
str1.Time[i]=Date[i];
if(Create_log((uint16*)&str1,sizeof(str1)))
return TRUE;
else
return FALSE;
}
/****************************************************************************
* 名称:OMC_AckStatus()
*入口参数:Ack_status:应答标志(正确应答/错误应答)
IP:指向网管中心IP地址
* 功能:网管中心应答状态
****************************************************************************/
uint8 OMC_AckStatus(uint16 Ack_status,uint8 *iP)
{
uint8 i=0;
struct str{
uint16 log_type;
uint16 status;
uint8 address[4];
uint8 Time[8];
}str1;
str1.log_type=0x03;
str1.status=Ack_status;
for(i=0;i<4;i++)
str1.address[i]=*(iP+i);
Gettime();
for(i=0;i<8;i++)
str1.Time[i]=Date[i];
if(Create_log((uint16*)&str1,sizeof(str1)))
return TRUE;
else
return FALSE;
}
/****************************************************************************
* 名称:OMC_Monitor_Set()
*入口参数:OMC IP地址、数据标示号、原值、设置值、设置状态(成功/不成功)
* 功能:收到OMC设置命令进行监控参数设置
****************************************************************************/
uint8 OMC_Monitor_Set(uint16 biaoshi,uint16 Pro_Value,uint16 Set_value,uint16 Set_status,uint8 *iP)
{
uint8 i=0;
struct str{
uint16 log_type;
uint8 address[4];
uint16 index;
uint16 proto_value;
uint16 setvalue;
uint16 status;
uint8 Time[8];
}str1;
str1.log_type=0x04;
for(i=0;i<4;i++)
str1.address[i]=*(iP+i);
str1.index=biaoshi;
str1.proto_value=Pro_Value;
str1.setvalue=Set_value;
str1.status=Set_status;
Gettime();
for(i=0;i<8;i++)
str1.Time[i]=Date[i];
if(Create_log((uint16*)&str1,sizeof(str1)))
return TRUE;
else
return FALSE;
}
/****************************************************************************
* 名称:OMC_Set_AckStatus()
*入口参数:应答状态(正确/不正确)
* 功能:OMC设置命令应答状态
****************************************************************************/
uint8 OMC_Set_AckStatus(uint16 Ack_status)
{
uint8 i=0;
struct str{
uint16 log_type;
uint16 status;
uint8 Time[8];
}str1;
str1.log_type=0x05;
str1.status=Ack_status;
Gettime();
for(i=0;i<8;i++)
str1.Time[i]=Date[i];
if(Create_log((uint16*)&str1,sizeof(str1)))
return TRUE;
else
return FALSE;
}
/****************************************************************************
* 名称:Local_Monitor_Set()
*入口参数:数据标示号、原值、设置值、设置状态(成功/不成功)
* 功能:本地监控参数设置
****************************************************************************/
uint8 Local_Monitor_Set(uint16 biaoshi,uint16 Pro_Value,uint16 Set_value,uint16 Set_status)
{
uint8 i=0;
struct str{
uint16 log_type;
uint16 index;
uint16 proto_value;
uint16 setvalue;
uint16 status;
uint8 Time[8];
}str1;
str1.log_type=0x06;
str1.index=biaoshi;
str1.proto_value=Pro_Value;
str1.setvalue=Set_value;
str1.status=Set_status;
Gettime();
for(i=0;i<8;i++)
str1.Time[i]=Date[i];
if(Create_log((uint16*)&str1,sizeof(str1)))
return TRUE;
else
return FALSE;
}
/****************************************************************************
* 名称:main()
* 功能:SST39VF1601擦除、编程操作。
****************************************************************************/
uint16 ram[20],ram1[4],ram2[37];
int main(void)
{
uint16 i;
I2C_Init(20000); // I2C配置及端口初始化
/* //for test
uint8 a=0;
dat=WordRead(0);
a=ChipErase();// 全片擦除
dat=WordRead(0);
WordProgram(0, 0x1234);
dat=WordRead(0);
dat=WordRead(1);
a=SectorErase(1);//0扇区擦除
dat=WordRead(1);
WordProgram(1, 0x2341);
dat=WordRead(1);
dat=WordRead(2);
a=BlockErase(2);//0块擦除
dat=WordRead(2);
WordProgram(2, 0x3412);
dat=WordRead(2);
ChipErase();
*/
while(1)
{
if(X1226_Setb)
{
Set_X1226_Time(Set_Date);
X1226_Setb=0;
}
/*else
{
IRcvStr(X1226_CCR|read,0x0030,2,Date,8);
dat=WordRead(480*2*1024);
Alarm_Occur(0x0142,0x00);
dat=WordRead(480*2*1024);
Alarm_message_SendStatus(0x01);
dat=WordRead(480*2*1024);
OMC_AckStatus(0x00,IP);
dat=WordRead(480*2*1024);
OMC_Monitor_Set(0x0136,0x23,0x58,0x01,IP);
dat=WordRead(480*2*1024);
OMC_Set_AckStatus(0x00);
dat=WordRead(480*2*1024);
Local_Monitor_Set(0x0121,0x43,0x46,0x01);
for(i=0;i<4;i++)
{
ram1[i]=WordRead(480*2*1024+i);
}
for(i=0;i<37;i++)
{
ram2[i]=WordRead(481*2*1024+i);
}
dat=log_read(1,ram);
dat=log_read(2,ram);
dat=log_read(3,ram);
dat=log_read(4,ram);
dat=log_read(5,ram);
dat=log_read(6,ram);
}*/
Gettime();
}
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -