📄 eeprom.c
字号:
#include "config.h"
#define MC24LC01ADDR 0xA0
I2C_Param *I2C_Pam;
/*********************************************************************************************************
** 函数名称: M24C01_Write
** 功能描述: 写24C01命令
** 输 入: SendBuf: 指向将要写的数据Buf的指针
** Len:写的数据数目,不包括地址字节
** 输 出: 发送的数据字节数
** 全局变量: 无
** 调用模块:
********************************************************************************************************/
uint8 M24C01_Write(uint8 MemAddr,uint8 *SendBuf,uint8 Len)
{
uint8 k;
uint32 j;
IO0CLR = EEPROM_WP; // 写保护无效,引脚输出低电平
I2C_Pam=(I2C_Param *)I2C_Param_Addr;
for(k=0;k<Len;k++){
I2C_Pam->Buf[0] = MemAddr++;
I2C_Pam->Buf[1] = *SendBuf;
I2C_Pam->Addr = MC24LC01ADDR;
I2C_Pam->WrLen=2;
I2C_Pam->RTBuf=I2C_Pam->Buf;
if(I2cWrite()!=2) break;
SendBuf++;
for(j=0;j<30000;j++); // 延时3.2mS,最少>2.5mS
}
IO0SET = EEPROM_WP; // 写保护有效,引脚输出高电平
return k;
}
/*********************************************************************************************************
** 函数名称: M24C01_Read
** 功能描述: 写24C01命令
** 输 入: RxdBuf: 指向读取数据Buf的指针
** Len:将要读取的数据数目
** 输 出: 读取的数据字节数
** 全局变量: 无
** 调用模块:
********************************************************************************************************/
uint8 M24C01_Read(uint8 MemAddr,uint8 *RxdBuf,uint8 Len)
{
I2C_Pam=(I2C_Param *)I2C_Param_Addr;
*RxdBuf = MemAddr;
I2C_Pam->Addr = MC24LC01ADDR;
I2C_Pam->WrLen=1;
I2C_Pam->RdLen=Len;
I2C_Pam->RTBuf=RxdBuf;
return(I2cRead());
}
void SaveSecurityCode(uint8 *SecuBuf)
{
uint16 sum;
uint16 i;
sum=0;
for (i=0;i<30;i++) {
sum += *(SecuBuf+i);
}
sum=-sum;
*(SecuBuf+30)=sum;
*(SecuBuf+31)=sum>>8;
M24C01_Write(0x30,SecuBuf,0x20); // 0x30- 0x4F,后2个为累加和
M24C01_Write(0x58,SecuBuf,0x20); // 0x58 - 0x78
}
void LoadSecurityCode(uint8 *SecuBuf)
{
uint16 sum;
uint8 i;
M24C01_Read(0x30,SecuBuf,0x20);
sum=0;
for (i=0;i<30;i++) {
sum += *(SecuBuf+i);
}
sum += *(SecuBuf+30);
sum += *(SecuBuf+31) << 8;
if(sum==0) return;
M24C01_Read(0x58,SecuBuf,0x20);
sum=0;
for (i=0;i<30;i++) {
sum += *(SecuBuf+i);
}
sum += *(SecuBuf+30);
sum += *(SecuBuf+31) << 8;
if(sum != 0) { // 密码无效
*SecuBuf=0x78;
*(SecuBuf+1)=0x56;
*(SecuBuf+2)=0x34;
*(SecuBuf+3)=0x12;
*(SecuBuf+28)=0x0;
}
}
void SaveSerialNo(char *SeriBuf)
{
M24C01_Write(0x08,(uint8 *)SeriBuf,0x20); // 0x08 - 0x28
}
void LoadSerialNo(char *SeriBuf)
{
M24C01_Read(0x08,(uint8 *)SeriBuf,0x20);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -