📄 eerom.c
字号:
#include "GLOBAL.H"
/***********************************************************
总空间大小: 1K 0 - 1023
EEPROM 地址分配说明:
F 参数 F0 - F255 : 地址: 0 - 511; 0 1 保存F0, 2 3保存 F1 依次类推
识别标志: "55AA" 地址: 1001 1002 1003 1004 //当连续55AA,说明已经初始化,否则初始化。
调整液晶显示参数: 地址: 1006 LCD_OFFSET 默认值 = 35
Modbus初始化参数: 地址:1010、1011、1012、1013
***********************************************************/
#define SDA PDR1_P16
#define SDA1 { DDR1_D16 = 0; }
#define SDA0 { DDR1_D16 = 1; PDR1_P16 = 0; }
#define SCL1 { DDR4_D41 = 0; }
#define SCL0 { DDR4_D41 = 1; PDR4_P41 = 0; }
#define AT24C08 0xa0
#define PAGE_SIZE 16
//是否第一次读写EEPROM
void init_eeprom(void)
{
uchar i1,i2,i3,i4; //EEPROM 初始标志
i1 = read_eerom(1001); // '5' 从EEPROM读取识别标志
i2 = read_eerom(1002); // '5'
i3 = read_eerom(1003); // 'A'
i4 = read_eerom(1004); // 'A'
if ( !((i1 == '5')&&(i2 == '5') &&(i3 == 'A')&&(i4 == 'A')) )
{
write_eerom(1010, 31); //主设备地址,默认31
write_eerom(1011, 0); //MODBUS模式,默认RTU
write_eerom(1012, 3); //波特率高字节,默认9600
write_eerom(1013, 0); //数据格式,默认 8 N 1
write_eerom(1001, '5'); // '5'
write_eerom(1002, '5'); // '5'
write_eerom(1003, 'A'); // 'A'
write_eerom(1004, 'A'); // 'A'
write_eerom(1006, 35); // 35 调整液晶显示参数
}
}
void wait_1uS(void)
{
uint i;
for (i = 0; i < 50;i++)
__wait_nop();
}
void wait_ms(uint time)
{
uint i,j;
for (i = 0; i < time; i++)
{
for (j = 0; j < 500; j++) __wait_nop();
}
}
void start_i2c(void)
{
SDA1;
wait_1uS();
SCL1;
wait_1uS();
SDA0;
wait_1uS();
SCL0
}
void stop_i2c(void)
{
SDA0;
wait_1uS();
SCL1;
wait_1uS();
SDA1;
wait_1uS();
SCL0;
}
void send_ack(void)
{
SDA0;
wait_1uS();
SCL1;
wait_1uS();
SCL0;
wait_1uS();
}
void send_nak(void)
{
SDA1;
wait_1uS();
SCL1;
wait_1uS();
SCL0;
wait_1uS();
}
uchar wait_ack(void)
{
uint timeout;
timeout = 1000;
SDA1;
wait_1uS();
SCL1;
wait_1uS();
while (SDA)
{
timeout--;
if (timeout == 0)
{
stop_i2c();
return (FALSE);
}
}
SCL0;
return (TRUE);
}
void sendbyte(uint ch)
{
uint i;
SCL0;
for (i = 8; i != 0; i--)
{
if ((ch & 0x80) != 0) SDA1
else SDA0;
ch <<= 1;
wait_1uS();
SCL1;
wait_1uS();
SCL0;
}
}
uint recvbyte(void)
{
uint i,result;
result = 0;
SDA1;
for (i = 8; i != 0; i--)
{
result <<= 1;
SCL0;
wait_1uS();
SCL1;
wait_1uS();
if (SDA) result |= 1;
}
SCL0;
return (result);
}
void write_eerom(uint addr,uchar ch)
{
uint i;
i = ((addr >> 7) & 0x6) + AT24C08;
start_i2c();
sendbyte(i);
wait_ack();
sendbyte(addr);
wait_ack();
sendbyte(ch);
wait_ack();
stop_i2c();
wait_ms(5);
}
uint read_eerom(uint addr)
{
uint i,result;
i = ((addr >> 7) & 0x6) + AT24C08;
start_i2c();
sendbyte(i);
wait_ack();
sendbyte(addr);
wait_ack();
start_i2c();
sendbyte(i+1);
wait_ack();
result = recvbyte();
send_nak();
stop_i2c();
return (result);
}
/*
void read_eerom_block(uint addr,uchar *ch,uint len)
{
uint i;
if (len == 0) return;
i = ((addr >> 0x7) & 0x6) + AT24C08;
start_i2c();
sendbyte(i);
wait_ack();
sendbyte(addr);
wait_ack();
start_i2c();
sendbyte(i+1);
wait_ack();
for (i = len; i != 0; i--,ch++)
{
if (i == 1)
{
*ch = recvbyte();
send_nak();
}
else
{
*ch = recvbyte();
send_ack();
}
}
stop_i2c();
}
void write_eerom_block(uint addr,uchar *ch,uint len)
{
uint i,j;
if (len == 0) return;
while (len > 0)
{
i = ((addr >> 0x7) & 0x6) + AT24C08;
start_i2c();
sendbyte(i);
wait_ack();
sendbyte(addr);
wait_ack();
if (len > PAGE_SIZE)
{
len -= PAGE_SIZE;
j = PAGE_SIZE;
}
else
{
j = len;
len = 0;
}
for (i = 0; i < j; i++,ch++)
{
sendbyte(*ch);
wait_ack();
}
stop_i2c();
addr += PAGE_SIZE;
wait_ms(5);
}
}
*/
/*******************************************************
* 名称: save_eerom
* 功能: 保存 F 参数到EEPROM 中
* 地址范围: 0 - 511; 0 1 保存F0, 2 3保存 F1 依次类推
* 输入: no 参数编号 p 参数值
* 输出:
* 返回: 无
********************************************************/
void save_eerom(uchar no,uint p)
{
write_eerom(no+no,p & 0xff);
write_eerom(no+no+1,p >> 8);
}
/*******************************************************
* 名称:upload_para
* 功能:从EEPROM 中读取参数值
* 地址范围: 0 - 511; 0 1 保存F0, 2 3保存 F1 依次类推
* 输入:no 参数编号
* 输出:
* 返回:no 参数编号所对应的参数值
********************************************************/
uint upload_para(uchar no)
{
uint para;
para = read_eerom(no+no) + ((read_eerom(no+no+1))<<8);
return(para);
}
/*
void restore_para(void)
{
uchar i;
uint j;
for (i = 0; i < max_para; i++)
{
j = i + i;
para[i] = read_eerom(j) + (read_eerom(j + 1) << 8);
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -