sggt/App/EEPROM/eeprom_spi.c

952 lines
27 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "eeprom_spi.h"
//使用方法:
// uint8_t eep_tx = 0x72;
// uint8_t eep_rx = 0;
// uint8_t eep_addr[3];
// uint8_t eep_test_flag = 0;
// uint8_t eep_status = 0;
// if(eep_test_flag == 0)
// {
// eep_test_flag = 1;
// eep_addr[0] = 0x00;
// eep_addr[1] = 0x00;
// eep_addr[2] = 0x00;
// eeprom_writedata(eep_addr, eep_tx);
// eep_rx = eeprom_readdata(eep_addr);
// }
// 结果eep_rx = 0x72
void eeprom_spi_init(void)
{
EEPROM_CS_H; // CS 初始化高手册中描述S拉低时片选
EEPROM_SCLK_L; // CLK 初始化低
EEPROM_WR_H; // 不使用硬件保护
}
void eeprom_spi_writebyte(uint8_t wrt_data)
{
uint8_t i = 0;
uint8_t temp = 0;
for(i = 0; i < 8; i++)
{
temp = ((wrt_data&0x80)==0x80)? 1:0;
wrt_data = wrt_data << 1;
EEPROM_SCLK_L; //CPOL=0
if(temp)
{
EEPROM_MOSI_H;
}
else
{
EEPROM_MOSI_L;
}
systick_delay_us(10); // 空等待
EEPROM_SCLK_H; //CPHA=0
systick_delay_us(10); // 空等待
}
EEPROM_SCLK_L;
}
uint8_t eeprom_spi_readbyte(void)
{
uint8_t i = 0;
uint8_t read_data = 0xFF;
for(i = 0; i < 8; i++)
{
read_data = read_data << 1;
EEPROM_SCLK_L;
systick_delay_us(10); // 空等待
EEPROM_SCLK_H;
systick_delay_us(10); // 空等待
if(EEPROM_MISO)
{
read_data = read_data + 1;
}
}
EEPROM_SCLK_L;
return read_data;
}
uint8_t SPI_WriteReadByte(uint8_t data)
{
uint16_t bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)
{
if(data & 0x80)
{
EEPROM_MOSI_H;
}
else
{
EEPROM_MOSI_L;
}
data = (data << 1);
EEPROM_SCLK_H;
systick_delay_us(5); // 空等待
if(EEPROM_MISO)
{
data |= 0x01;
}
EEPROM_SCLK_L;
systick_delay_us(5); // 空等待
}
return(data);
}
void eeprom_writedata(int32_t addr_long, uint8_t txd)
{
uint8_t write_en_flag = 0;
uint8_t ee_status = 0;
uint8_t addr[3];
addr[0] = addr_long >> 16;
addr[1] = addr_long >> 8;
addr[2] = addr_long;
int16_t wait_max = 0;
do
{
EEPROM_CS_L;
delay_cnt(10);
eeprom_spi_writebyte(WRITE_ENABLE);
delay_cnt(10);
EEPROM_CS_H;
EEPROM_CS_L;
delay_cnt(10);
eeprom_spi_writebyte(READ_STATUS);
ee_status = eeprom_spi_readbyte();
delay_cnt(10);
EEPROM_CS_H;
write_en_flag = ee_status & 0x03;
wait_max++;
if(wait_max > 500)
{
system_sts.eeprom_write_error = 1;
return;
}
} while (write_en_flag != 0x02);
EEPROM_CS_L;
delay_cnt(10);
eeprom_spi_writebyte(WRITE_MEMORY);
eeprom_spi_writebyte(addr[0]);
eeprom_spi_writebyte(addr[1]);
eeprom_spi_writebyte(addr[2]);
eeprom_spi_writebyte(txd);
delay_cnt(10);
EEPROM_CS_H;
}
uint8_t eeprom_readdata(int32_t addr_long)
{
uint8_t rxd = 0;
uint8_t write_en_flag = 0;
uint8_t ee_status = 0;
uint8_t addr[3];
addr[0] = addr_long >> 16;
addr[1] = addr_long >> 8;
addr[2] = addr_long ;
int16_t wait_max = 0;
do
{
EEPROM_CS_L;
delay_cnt(10);
eeprom_spi_writebyte(WRITE_ENABLE);
delay_cnt(10);
EEPROM_CS_H;
EEPROM_CS_L;
delay_cnt(10);
eeprom_spi_writebyte(READ_STATUS);
ee_status = eeprom_spi_readbyte();
delay_cnt(10);
EEPROM_CS_H;
write_en_flag = ee_status & 0x01;
wait_max++;
if(wait_max > 500)
{
system_sts.eeprom_read_error = 1;
return 0;
}
} while (write_en_flag);
EEPROM_CS_L;
delay_cnt(10);
eeprom_spi_writebyte(READ_MEMORY);
eeprom_spi_writebyte(addr[0]);
eeprom_spi_writebyte(addr[1]);
eeprom_spi_writebyte(addr[2]);
rxd = eeprom_spi_readbyte();
delay_cnt(10);
EEPROM_CS_H;
return rxd;
}
//保存修改过的数据
void eeprom_datasave_changed(void)
{
TABVIEW_DATA tab_temp;
memcpy(&tab_temp, &tabdata, sizeof(TABVIEW_DATA));
eeprom_dataread();
if( (tab_temp.item0_page0_vup[0] != tabdata.item0_page0_vup[0])||(tab_temp.item0_page0_vlow[0] != tabdata.item0_page0_vlow[0])||\
(tab_temp.item0_page0_vup[1] != tabdata.item0_page0_vup[1])||(tab_temp.item0_page0_vlow[1] != tabdata.item0_page0_vlow[1]) )
{
tabdata.item0_page0_vup[0] = tab_temp.item0_page0_vup[0];
tabdata.item0_page0_vlow[0] = tab_temp.item0_page0_vlow[0];
tabdata.item0_page0_vup[1] = tab_temp.item0_page0_vup[1];
tabdata.item0_page0_vlow[1] = tab_temp.item0_page0_vlow[1];
eeprom_datasave_single(EEPROM_TAG_VOLTAGE);
}
if( (tab_temp.item0_page0_cup != tabdata.item0_page0_cup)||(tab_temp.item0_page0_clow != tabdata.item0_page0_clow) )
{
tabdata.item0_page0_cup = tab_temp.item0_page0_cup;
tabdata.item0_page0_clow = tab_temp.item0_page0_clow;
eeprom_datasave_single(EEPROM_TAG_CURRENT);
}
if( (tab_temp.item0_page0_rup != tabdata.item0_page0_rup)||(tab_temp.item0_page1_rlow != tabdata.item0_page1_rlow) )
{
tabdata.item0_page0_rup = tab_temp.item0_page0_rup;
tabdata.item0_page1_rlow = tab_temp.item0_page1_rlow;
eeprom_datasave_single(EEPROM_TAG_RESISTANCE);
}
if( (tab_temp.item0_page1_fup != tabdata.item0_page1_fup)||(tab_temp.item0_page1_flow != tabdata.item0_page1_flow) )
{
tabdata.item0_page1_fup = tab_temp.item0_page1_fup;
tabdata.item0_page1_flow = tab_temp.item0_page1_flow;
eeprom_datasave_single(EEPROM_TAG_FREQUENCE);
}
for(uint8_t i = 0 ; i < 8; i++)
{
if( (tab_temp.item0_page1_TCup[i] != tabdata.item0_page1_TCup[i])||(tab_temp.item0_page1_TClow[i] != tabdata.item0_page1_TClow[i]) )
{
tabdata.item0_page1_TCup[i] = tab_temp.item0_page1_TCup[i];
tabdata.item0_page1_TClow[i] = tab_temp.item0_page1_TClow[i];
//数组索引0-7标签4-11
eeprom_datasave_single( i + 4 );
}
}
if( (tab_temp.item0_page2_RTDup != tabdata.item0_page2_RTDup)||(tab_temp.item0_page2_RTDlow != tabdata.item0_page2_RTDlow) )
{
tabdata.item0_page2_RTDup = tab_temp.item0_page2_RTDup;
tabdata.item0_page2_RTDlow = tab_temp.item0_page2_RTDlow;
eeprom_datasave_single(EEPROM_TAG_RTD);
}
if(tab_temp.item1_page0_sample_interval != tabdata.item1_page0_sample_interval)
{
tabdata.item1_page0_sample_interval = tab_temp.item1_page0_sample_interval;
eeprom_datasave_single(EEPROM_TAG_SAMPLE_INTERVAL);
}
if(tab_temp.item1_page0_plot_num != tabdata.item1_page0_plot_num)
{
tabdata.item1_page0_plot_num = tab_temp.item1_page0_plot_num;
eeprom_datasave_single(EEPROM_TAG_PLOT_COUNT);
}
if(tab_temp.item1_page0_color_input != tabdata.item1_page0_color_input)
{
tabdata.item1_page0_color_input = tab_temp.item1_page0_color_input;
eeprom_datasave_single(EEPROM_TAG_INPUT_COLOR);
}
if(tab_temp.item1_page0_color_output != tabdata.item1_page0_color_output)
{
tabdata.item1_page0_color_output = tab_temp.item1_page0_color_output;
eeprom_datasave_single(EEPROM_TAG_OUTPUT_COLOR);
}
if(tab_temp.item3_page0_language != tabdata.item3_page0_language)
{
tabdata.item3_page0_language = tab_temp.item3_page0_language;
eeprom_datasave_single(EEPROM_TAG_LANGUAGE);
}
}
void eeprom_datasave_single(uint8_t tag)
{
//16bits h --- l
//32bits: h --- mh --- ml --- l
uint8_t temp_h = 0, temp_l = 0;
uint8_t temp_mh = 0, temp_ml = 0;
switch (tag)
{
case EEPROM_TAG_VOLTAGE:
{
//VOL V
temp_h = tabdata.item0_page0_vup[0] >> 8;
temp_l = tabdata.item0_page0_vup[0] & 0xFF;
eeprom_writedata(VOL_V_UP_ADDR, temp_h);
eeprom_writedata(VOL_V_UP_ADDR + 8, temp_l);
temp_h = tabdata.item0_page0_vlow[0] >> 8;
temp_l = tabdata.item0_page0_vlow[0] & 0xFF;
eeprom_writedata(VOL_V_LOW_ADDR, temp_h);
eeprom_writedata(VOL_V_LOW_ADDR + 8, temp_l);
//VOL mV
temp_h = tabdata.item0_page0_vup[1] >> 8;
temp_l = tabdata.item0_page0_vup[1] & 0xFF;
eeprom_writedata(VOL_MV_UP_ADDR, temp_h);
eeprom_writedata(VOL_MV_UP_ADDR + 8, temp_l);
temp_h = tabdata.item0_page0_vlow[1] >> 8;
temp_l = tabdata.item0_page0_vlow[1] & 0xFF;
eeprom_writedata(VOL_MV_LOW_ADDR, temp_h);
eeprom_writedata(VOL_MV_LOW_ADDR + 8, temp_l);
}
break;
case EEPROM_TAG_CURRENT:
{
//CUR
temp_h = tabdata.item0_page0_cup >> 8;
temp_l = tabdata.item0_page0_cup & 0xFF;
eeprom_writedata(CUR_UP_ADDR, temp_h);
eeprom_writedata(CUR_UP_ADDR + 8, temp_l);
temp_h = tabdata.item0_page0_clow >> 8;
temp_l = tabdata.item0_page0_clow & 0xFF;
eeprom_writedata(CUR_LOW_ADDR, temp_h);
eeprom_writedata(CUR_LOW_ADDR + 8, temp_l);
}
break;
case EEPROM_TAG_RESISTANCE:
{
//RES
temp_h = tabdata.item0_page0_rup >> 8;
temp_l = tabdata.item0_page0_rup & 0xFF;
eeprom_writedata(RES_UP_ADDR, temp_h);
eeprom_writedata(RES_UP_ADDR + 8, temp_l);
temp_h = tabdata.item0_page1_rlow >> 8;
temp_l = tabdata.item0_page1_rlow & 0xFF;
eeprom_writedata(RES_LOW_ADDR, temp_h);
eeprom_writedata(RES_LOW_ADDR + 8, temp_l);
}
break;
case EEPROM_TAG_FREQUENCE:
{
//FRE
temp_h = tabdata.item0_page1_fup >> 8;
temp_l = tabdata.item0_page1_fup & 0xFF;
eeprom_writedata(FRE_UP_ADDR, temp_h);
eeprom_writedata(FRE_UP_ADDR + 8, temp_l);
temp_h = tabdata.item0_page1_flow >> 8;
temp_l = tabdata.item0_page1_flow & 0xFF;
eeprom_writedata(FRE_LOW_ADDR, temp_h);
eeprom_writedata(FRE_LOW_ADDR + 8, temp_l);
}
break;
case EEPROM_TAG_TC_K:
{
//TC K
temp_h = tabdata.item0_page1_TCup[0] >> 8;
temp_l = tabdata.item0_page1_TCup[0] & 0xFF;
eeprom_writedata(TC_K_UP_ADDR, temp_h);
eeprom_writedata(TC_K_UP_ADDR + 8, temp_l);
temp_h = tabdata.item0_page1_TClow[0] >> 8;
temp_l = tabdata.item0_page1_TClow[0] & 0xFF;
eeprom_writedata(TC_K_LOW_ADDR, temp_h);
eeprom_writedata(TC_K_LOW_ADDR + 8, temp_l);
}
break;
case EEPROM_TAG_TC_S:
{
//TC S
temp_h = tabdata.item0_page1_TCup[1] >> 8;
temp_l = tabdata.item0_page1_TCup[1] & 0xFF;
eeprom_writedata(TC_S_UP_ADDR, temp_h);
eeprom_writedata(TC_S_UP_ADDR + 8, temp_l);
temp_h = tabdata.item0_page1_TClow[1] >> 8;
temp_l = tabdata.item0_page1_TClow[1] & 0xFF;
eeprom_writedata(TC_S_LOW_ADDR, temp_h);
eeprom_writedata(TC_S_LOW_ADDR + 8, temp_l);
}
break;
case EEPROM_TAG_TC_N:
{
//TC N
temp_h = tabdata.item0_page1_TCup[2] >> 8;
temp_l = tabdata.item0_page1_TCup[2] & 0xFF;
eeprom_writedata(TC_N_UP_ADDR, temp_h);
eeprom_writedata(TC_N_UP_ADDR + 8, temp_l);
temp_h = tabdata.item0_page1_TClow[2] >> 8;
temp_l = tabdata.item0_page1_TClow[2] & 0xFF;
eeprom_writedata(TC_N_LOW_ADDR, temp_h);
eeprom_writedata(TC_N_LOW_ADDR + 8, temp_l);
}
break;
case EEPROM_TAG_TC_B:
{
//TC B
temp_h = tabdata.item0_page1_TCup[3] >> 8;
temp_l = tabdata.item0_page1_TCup[3] & 0xFF;
eeprom_writedata(TC_B_UP_ADDR, temp_h);
eeprom_writedata(TC_B_UP_ADDR + 8, temp_l);
temp_h = tabdata.item0_page1_TClow[3] >> 8;
temp_l = tabdata.item0_page1_TClow[3] & 0xFF;
eeprom_writedata(TC_B_LOW_ADDR, temp_h);
eeprom_writedata(TC_B_LOW_ADDR + 8, temp_l);
}
break;
case EEPROM_TAG_TC_E:
{
//TC E
temp_h = tabdata.item0_page1_TCup[4] >> 8;
temp_l = tabdata.item0_page1_TCup[4] & 0xFF;
eeprom_writedata(TC_E_UP_ADDR, temp_h);
eeprom_writedata(TC_E_UP_ADDR + 8, temp_l);
temp_h = tabdata.item0_page1_TClow[4] >> 8;
temp_l = tabdata.item0_page1_TClow[4] & 0xFF;
eeprom_writedata(TC_E_LOW_ADDR, temp_h);
eeprom_writedata(TC_E_LOW_ADDR + 8, temp_l);
}
break;
case EEPROM_TAG_TC_J:
{
//TC J
temp_h = tabdata.item0_page1_TCup[5] >> 8;
temp_l = tabdata.item0_page1_TCup[5] & 0xFF;
eeprom_writedata(TC_J_UP_ADDR, temp_h);
eeprom_writedata(TC_J_UP_ADDR + 8, temp_l);
temp_h = tabdata.item0_page1_TClow[5] >> 8;
temp_l = tabdata.item0_page1_TClow[5] & 0xFF;
eeprom_writedata(TC_J_LOW_ADDR, temp_h);
eeprom_writedata(TC_J_LOW_ADDR + 8, temp_l);
}
break;
case EEPROM_TAG_TC_R:
{
//TC R
temp_h = tabdata.item0_page1_TCup[6] >> 8;
temp_l = tabdata.item0_page1_TCup[6] & 0xFF;
eeprom_writedata(TC_R_UP_ADDR, temp_h);
eeprom_writedata(TC_R_UP_ADDR + 8, temp_l);
temp_h = tabdata.item0_page1_TClow[6] >> 8;
temp_l = tabdata.item0_page1_TClow[6] & 0xFF;
eeprom_writedata(TC_R_LOW_ADDR, temp_h);
eeprom_writedata(TC_R_LOW_ADDR + 8, temp_l);
}
break;
case EEPROM_TAG_TC_T:
{
//TC T
temp_h = tabdata.item0_page1_TCup[7] >> 8;
temp_l = tabdata.item0_page1_TCup[7] & 0xFF;
eeprom_writedata(TC_T_UP_ADDR, temp_h);
eeprom_writedata(TC_T_UP_ADDR + 8, temp_l);
temp_h = tabdata.item0_page1_TClow[7] >> 8;
temp_l = tabdata.item0_page1_TClow[7] & 0xFF;
eeprom_writedata(TC_T_LOW_ADDR, temp_h);
eeprom_writedata(TC_T_LOW_ADDR + 8, temp_l);
}
break;
case EEPROM_TAG_RTD:
{
//RTD
temp_h = tabdata.item0_page2_RTDup >> 8;
temp_l = tabdata.item0_page2_RTDup & 0xFF;
eeprom_writedata(RTD_UP_ADDR, temp_h);
eeprom_writedata(RTD_UP_ADDR + 8, temp_l);
temp_h = tabdata.item0_page2_RTDlow >> 8;
temp_l = tabdata.item0_page2_RTDlow & 0xFF;
eeprom_writedata(RTD_LOW_ADDR, temp_h);
eeprom_writedata(RTD_LOW_ADDR + 8, temp_l);
}
break;
case EEPROM_TAG_SAMPLE_INTERVAL:
{
//采样间隔
temp_h = tabdata.item1_page0_sample_interval >> 8;
temp_l = tabdata.item1_page0_sample_interval & 0xFF;
eeprom_writedata(SAMPLE_INTERVAL_ADDR, temp_h);
eeprom_writedata(SAMPLE_INTERVAL_ADDR + 8, temp_l);
}
break;
case EEPROM_TAG_PLOT_COUNT:
{
//描点数量
temp_h = tabdata.item1_page0_plot_num >> 8;
temp_l = tabdata.item1_page0_plot_num & 0xFF;
eeprom_writedata(PLOT_COUNT_ADDR, temp_h);
eeprom_writedata(PLOT_COUNT_ADDR + 8, temp_l);
}
break;
case EEPROM_TAG_INPUT_COLOR:
{
//输入曲线颜色
temp_h = ((uint8_t)tabdata.item1_page0_color_input) >> 8;
temp_l = ((uint8_t)tabdata.item1_page0_color_input) & 0xFF;
eeprom_writedata(INPUT_COLOR_ADDR, temp_h);
eeprom_writedata(INPUT_COLOR_ADDR + 8, temp_l);
}
break;
case EEPROM_TAG_OUTPUT_COLOR:
{
//输出曲线颜色
temp_h = ((uint8_t)tabdata.item1_page0_color_output) >> 8;
temp_l = ((uint8_t)tabdata.item1_page0_color_output) & 0xFF;
eeprom_writedata(OUTPUT_COLOR_ADDR, temp_h);
eeprom_writedata(OUTPUT_COLOR_ADDR + 8, temp_l);
}
break;
case EEPROM_TAG_LANGUAGE:
{
//语言选择
temp_h = ((uint8_t)tabdata.item3_page0_language) >> 8;
temp_l = ((uint8_t)tabdata.item3_page0_language) & 0xFF;
eeprom_writedata(LANGUAGE_SELECT_ADDR, temp_h);
eeprom_writedata(LANGUAGE_SELECT_ADDR + 8, temp_l);
}
break;
case EEPROM_TAG_CAL_CUR_MA_OUT:
{
uint32_t flt[CALIBRATE_CUR_MA_OUT_POINTS] = {0};
memcpy(flt, cur_ma_out_calibrate_table, sizeof(flt));
for(uint8_t i = 0; i < CALIBRATE_CUR_MA_OUT_POINTS; i++)
{
temp_h = flt[i] >> 24;
temp_mh = flt[i] >> 16;
temp_ml = flt[i] >> 8;
temp_l = flt[i] & 0xFF;
eeprom_writedata(CAL_CUR_MA_OUT_ADDR_START + 32*i, temp_h);
eeprom_writedata(CAL_CUR_MA_OUT_ADDR_START + 32*i + 8, temp_mh);
eeprom_writedata(CAL_CUR_MA_OUT_ADDR_START + 32*i + 16, temp_ml);
eeprom_writedata(CAL_CUR_MA_OUT_ADDR_START + 32*i + 24, temp_l);
}
}
break;
case EEPROM_TAG_CAL_VOL_V_OUT:
{
uint32_t flt[CALIBRATE_VOL_V_OUT_POINTS] = {0};
memcpy(flt, vol_v_out_calibrate_table, sizeof(flt));
for(uint8_t i = 0; i < CALIBRATE_VOL_V_OUT_POINTS; i++)
{
temp_h = flt[i] >> 24;
temp_mh = flt[i] >> 16;
temp_ml = flt[i] >> 8;
temp_l = flt[i] & 0xFF;
eeprom_writedata(CAL_VOL_V_OUT_ADDR_START + 32*i, temp_h);
eeprom_writedata(CAL_VOL_V_OUT_ADDR_START + 32*i + 8, temp_mh);
eeprom_writedata(CAL_VOL_V_OUT_ADDR_START + 32*i + 16, temp_ml);
eeprom_writedata(CAL_VOL_V_OUT_ADDR_START + 32*i + 24, temp_l);
}
}
break;
case EEPROM_TAG_CAL_VOL_MV_OUT:
{}
break;
case EEPROM_TAG_CAL_RES_OHM_OUT:
{}
break;
default:
break;
}
}
//开机上电后读取参数
void eeprom_dataread(void)
{
uint8_t temp_h = 0, temp_l = 0;
uint16_t temp_w = 0;
//VOL V
temp_h = eeprom_readdata(VOL_V_UP_ADDR);
temp_l = eeprom_readdata(VOL_V_UP_ADDR + 8);
tabdata.item0_page0_vup[0] = ( temp_h << 8 ) + temp_l;
//数据异常时使用默认值
if( (tabdata.item0_page0_vup[0] > VOL[0].up)||(tabdata.item0_page0_vup[0] < VOL[0].low) ) tabdata.item0_page0_vup[0] = VOL[0].up;
temp_h = eeprom_readdata(VOL_V_LOW_ADDR);
temp_l = eeprom_readdata(VOL_V_LOW_ADDR + 8);
tabdata.item0_page0_vlow[0] = ( temp_h << 8 ) + temp_l;
//数据异常时使用默认值
if( (tabdata.item0_page0_vlow[0] > VOL[0].up)||(tabdata.item0_page0_vlow[0] < VOL[0].low) ) tabdata.item0_page0_vlow[0] = VOL[0].low;
//出现错误后,提前返回(连续四个字节不出错,直接读到最后)
//该错误仅能表示超时,无法表示数据异常
if(system_sts.eeprom_read_error) return;
//VOL mV
temp_h = eeprom_readdata(VOL_MV_UP_ADDR);
temp_l = eeprom_readdata(VOL_MV_UP_ADDR + 8);
tabdata.item0_page0_vup[1] = ( temp_h << 8 ) + temp_l;
if( (tabdata.item0_page0_vup[1] > VOL[1].up)||(tabdata.item0_page0_vup[1] < VOL[1].low) ) tabdata.item0_page0_vup[0] = VOL[1].up;
temp_h = eeprom_readdata(VOL_MV_LOW_ADDR);
temp_l = eeprom_readdata(VOL_MV_LOW_ADDR + 8);
tabdata.item0_page0_vlow[1] = ( temp_h << 8 ) + temp_l;
if( (tabdata.item0_page0_vlow[1] > VOL[1].up)||(tabdata.item0_page0_vlow[1] < VOL[1].low) ) tabdata.item0_page0_vlow[0] = VOL[1].low;
//CUR
//temp_h = eeprom_readdata(CUR_UP_ADDR);
temp_l = eeprom_readdata(CUR_UP_ADDR + 8);
tabdata.item0_page0_cup = temp_l;
if( (tabdata.item0_page0_cup > CUR.up)||(tabdata.item0_page0_cup < CUR.low) ) tabdata.item0_page0_cup = CUR.up;
//temp_h = eeprom_readdata(CUR_LOW_ADDR);
temp_l = eeprom_readdata(CUR_LOW_ADDR + 8);
tabdata.item0_page0_clow = temp_l;
if( (tabdata.item0_page0_clow > CUR.up)||(tabdata.item0_page0_clow < CUR.low) ) tabdata.item0_page0_clow = CUR.low;
//RES
temp_h = eeprom_readdata(RES_UP_ADDR);
temp_l = eeprom_readdata(RES_UP_ADDR + 8);
tabdata.item0_page0_rup = ( temp_h << 8 ) + temp_l;
if( (tabdata.item0_page0_rup > RES.up)||(tabdata.item0_page0_rup < RES.low) ) tabdata.item0_page0_rup = RES.up;
temp_h = eeprom_readdata(RES_LOW_ADDR);
temp_l = eeprom_readdata(RES_LOW_ADDR + 8);
tabdata.item0_page1_rlow = ( temp_h << 8 ) + temp_l;
if( (tabdata.item0_page1_rlow > RES.up)||(tabdata.item0_page1_rlow < RES.low) ) tabdata.item0_page1_rlow = RES.low;
//FRE
//temp_h = eeprom_readdata(FRE_UP_ADDR);
temp_l = eeprom_readdata(FRE_UP_ADDR + 8);
tabdata.item0_page1_fup = temp_l;
if( (tabdata.item0_page1_fup > FRE.up)||(tabdata.item0_page1_fup < FRE.low) ) tabdata.item0_page1_fup = FRE.up;
//temp_h = eeprom_readdata(FRE_LOW_ADDR);
temp_l = eeprom_readdata(FRE_LOW_ADDR + 8);
tabdata.item0_page1_flow = temp_l;
if( (tabdata.item0_page1_flow > FRE.up)||(tabdata.item0_page1_flow < FRE.low) ) tabdata.item0_page1_flow = FRE.low;
//TC K
temp_h = eeprom_readdata(TC_K_UP_ADDR);
temp_l = eeprom_readdata(TC_K_UP_ADDR + 8);
tabdata.item0_page1_TCup[0] = ( temp_h << 8 ) + temp_l;
temp_h = eeprom_readdata(TC_K_LOW_ADDR);
temp_l = eeprom_readdata(TC_K_LOW_ADDR + 8);
tabdata.item0_page1_TClow[0] = ( temp_h << 8 ) + temp_l;
//TC S
temp_h = eeprom_readdata(TC_S_UP_ADDR);
temp_l = eeprom_readdata(TC_S_UP_ADDR + 8);
tabdata.item0_page1_TCup[1] = ( temp_h << 8 ) + temp_l;
temp_h = eeprom_readdata(TC_S_LOW_ADDR);
temp_l = eeprom_readdata(TC_S_LOW_ADDR + 8);
tabdata.item0_page1_TClow[1] = ( temp_h << 8 ) + temp_l;
//TC N
temp_h = eeprom_readdata(TC_N_UP_ADDR);
temp_l = eeprom_readdata(TC_N_UP_ADDR + 8);
tabdata.item0_page1_TCup[2] = ( temp_h << 8 ) + temp_l;
temp_h = eeprom_readdata(TC_N_LOW_ADDR);
temp_l = eeprom_readdata(TC_N_LOW_ADDR + 8);
tabdata.item0_page1_TClow[2] = ( temp_h << 8 ) + temp_l;
//TC B
temp_h = eeprom_readdata(TC_B_UP_ADDR);
temp_l = eeprom_readdata(TC_B_UP_ADDR + 8);
tabdata.item0_page1_TCup[3] = ( temp_h << 8 ) + temp_l;
temp_h = eeprom_readdata(TC_B_LOW_ADDR);
temp_l = eeprom_readdata(TC_B_LOW_ADDR + 8);
tabdata.item0_page1_TClow[3] = ( temp_h << 8 ) + temp_l;
//TC E
temp_h = eeprom_readdata(TC_E_UP_ADDR);
temp_l = eeprom_readdata(TC_E_UP_ADDR + 8);
tabdata.item0_page1_TCup[4] = ( temp_h << 8 ) + temp_l;
temp_h = eeprom_readdata(TC_E_LOW_ADDR);
temp_l = eeprom_readdata(TC_E_LOW_ADDR + 8);
tabdata.item0_page1_TClow[4] = ( temp_h << 8 ) + temp_l;
//TC J
temp_h = eeprom_readdata(TC_J_UP_ADDR);
temp_l = eeprom_readdata(TC_J_UP_ADDR + 8);
tabdata.item0_page1_TCup[5] = ( temp_h << 8 ) + temp_l;
temp_h = eeprom_readdata(TC_J_LOW_ADDR);
temp_l = eeprom_readdata(TC_J_LOW_ADDR + 8);
tabdata.item0_page1_TClow[5] = ( temp_h << 8 ) + temp_l;
//TC R
temp_h = eeprom_readdata(TC_R_UP_ADDR);
temp_l = eeprom_readdata(TC_R_UP_ADDR + 8);
tabdata.item0_page1_TCup[6] = ( temp_h << 8 ) + temp_l;
temp_h = eeprom_readdata(TC_R_LOW_ADDR);
temp_l = eeprom_readdata(TC_R_LOW_ADDR + 8);
tabdata.item0_page1_TClow[6] = ( temp_h << 8 ) + temp_l;
//TC T
temp_h = eeprom_readdata(TC_T_UP_ADDR);
temp_l = eeprom_readdata(TC_T_UP_ADDR + 8);
tabdata.item0_page1_TCup[7] = ( temp_h << 8 ) + temp_l;
temp_h = eeprom_readdata(TC_T_LOW_ADDR);
temp_l = eeprom_readdata(TC_T_LOW_ADDR + 8);
tabdata.item0_page1_TClow[7] = ( temp_h << 8 ) + temp_l;
for(uint8_t i = 0; i < 8; i++)
{
if( (tabdata.item0_page1_TCup[i] > TC[i].up)||(tabdata.item0_page1_TCup[i] < TC[i].low) ) tabdata.item0_page1_TCup[i] = TC[i].up;
if( (tabdata.item0_page1_TClow[i] > TC[i].up)||(tabdata.item0_page1_TClow[i] < TC[i].low) ) tabdata.item0_page1_TClow[i] = TC[i].low;
}
//RTD
temp_h = eeprom_readdata(RTD_UP_ADDR);
temp_l = eeprom_readdata(RTD_UP_ADDR + 8);
tabdata.item0_page2_RTDup = ( temp_h << 8 ) + temp_l;
if( (tabdata.item0_page2_RTDup > RTD.up)||(tabdata.item0_page2_RTDup < RTD.low) ) tabdata.item0_page2_RTDup = RTD.up;
temp_h = eeprom_readdata(RTD_LOW_ADDR);
temp_l = eeprom_readdata(RTD_LOW_ADDR + 8);
tabdata.item0_page2_RTDlow = ( temp_h << 8 ) + temp_l;
if( (tabdata.item0_page2_RTDlow > RTD.up)||(tabdata.item0_page2_RTDlow < RTD.low) ) tabdata.item0_page2_RTDlow = RTD.low;
//采样间隔
temp_h = eeprom_readdata(SAMPLE_INTERVAL_ADDR);
temp_l = eeprom_readdata(SAMPLE_INTERVAL_ADDR + 8);
tabdata.item1_page0_sample_interval = ( temp_h << 8 ) + temp_l;
if( (tabdata.item1_page0_sample_interval > SAMPLE_INTERVAL_MAX)||(tabdata.item1_page0_sample_interval < MENU_TASK_PERIOD) ) tabdata.item1_page0_sample_interval = 1000;
//描点数量
temp_h = eeprom_readdata(PLOT_COUNT_ADDR);
temp_l = eeprom_readdata(PLOT_COUNT_ADDR + 8);
tabdata.item1_page0_plot_num = ( temp_h << 8 ) + temp_l;
if( (tabdata.item1_page0_plot_num > PLOT_NUM_MAX)||(tabdata.item1_page0_plot_num < PLOT_NUM_MIN) ) tabdata.item1_page0_plot_num = 10;
//输入曲线颜色
temp_h = eeprom_readdata(INPUT_COLOR_ADDR);
temp_l = eeprom_readdata(INPUT_COLOR_ADDR + 8);
temp_w = ( temp_h << 8 ) + temp_l;
if(temp_w > 5) temp_w = 0;
tabdata.item1_page0_color_input = (COLORS)temp_w;
//输出曲线颜色
temp_h = eeprom_readdata(OUTPUT_COLOR_ADDR);
temp_l = eeprom_readdata(OUTPUT_COLOR_ADDR + 8);
temp_w = ( temp_h << 8 ) + temp_l;
if(temp_w > 5) temp_w = 1;
tabdata.item1_page0_color_output = (COLORS)temp_w;
//语言选择
temp_h = eeprom_readdata(LANGUAGE_SELECT_ADDR);
temp_l = eeprom_readdata(LANGUAGE_SELECT_ADDR + 8);
temp_w = ( temp_h << 8 ) + temp_l;
if(temp_w > 1) temp_w = 0;
tabdata.item3_page0_language = (LANGUAGES)temp_w;
}
//读取指定数据
void eeprom_dataread_single(uint8_t tag)
{
//16bits h --- l
//32bits: h --- mh --- ml --- l
uint8_t temp_h = 0, temp_l = 0;
uint8_t temp_mh = 0, temp_ml = 0;
float error_check = 0;
switch (tag)
{
case EEPROM_TAG_CAL_CUR_MA_OUT:
{
uint32_t flt[CALIBRATE_CUR_MA_OUT_POINTS] = {0};
for(uint8_t i = 0; i < CALIBRATE_CUR_MA_OUT_POINTS; i++)
{
temp_h = eeprom_readdata(CAL_CUR_MA_OUT_ADDR_START + 32*i);
temp_mh = eeprom_readdata(CAL_CUR_MA_OUT_ADDR_START + 32*i + 8);
temp_ml = eeprom_readdata(CAL_CUR_MA_OUT_ADDR_START + 32*i + 16);
temp_l = eeprom_readdata(CAL_CUR_MA_OUT_ADDR_START + 32*i + 24);
flt[i] = (temp_h << 24)|(temp_mh << 16)|(temp_ml << 8)|(temp_l);
memcpy(&error_check, flt + i, 4);
if( ((int16_t)error_check > CUR.up)||((int16_t)error_check < CUR.low) )
{
//任意一个点异常,随即退出,不启用校准
curma_out_cal_enable = 2;
return;
}
}
memcpy(cur_ma_out_calibrate_table, flt, sizeof(cur_ma_out_calibrate_table));
}
break;
case EEPROM_TAG_CAL_VOL_V_OUT:
{
uint32_t flt[CALIBRATE_VOL_V_OUT_POINTS] = {0};
for(uint8_t i = 0; i < CALIBRATE_VOL_V_OUT_POINTS; i++)
{
temp_h = eeprom_readdata(CAL_VOL_V_OUT_ADDR_START + 32*i);
temp_mh = eeprom_readdata(CAL_VOL_V_OUT_ADDR_START + 32*i + 8);
temp_ml = eeprom_readdata(CAL_VOL_V_OUT_ADDR_START + 32*i + 16);
temp_l = eeprom_readdata(CAL_VOL_V_OUT_ADDR_START + 32*i + 24);
flt[i] = (temp_h << 24)|(temp_mh << 16)|(temp_ml << 8)|(temp_l);
memcpy(&error_check, flt + i, 4);
if( ((int16_t)error_check > VOL[0].up)||((int16_t)error_check < VOL[0].low) )
{
//任意一个点异常,随即退出,不启用校准
volv_out_cal_enable = 2;
return;
}
}
memcpy(vol_v_out_calibrate_table, flt, sizeof(vol_v_out_calibrate_table));
}
break;
case EEPROM_TAG_CAL_VOL_MV_OUT:
{}
break;
case EEPROM_TAG_CAL_RES_OHM_OUT:
{}
break;
}
}
//判断EEPROM内是否已存在数据
uint8_t eeprom_device_check(void)
{
uint8_t device_status_h = 0, device_status_l = 0;
int dev_sts = 0;
device_status_h = eeprom_readdata(DEVICE_CHECK);
device_status_l = eeprom_readdata(DEVICE_CHECK + 8);
dev_sts = (device_status_h << 8) + device_status_l;
if(dev_sts != 0xAAAA)
{
tabdata.item0_page0_vup[0] = VOL[0].up; //电压V上限
tabdata.item0_page0_vlow[0] = VOL[0].low; //电压V下限
tabdata.item0_page0_vup[1] = VOL[1].up; //电压mV上限
tabdata.item0_page0_vlow[1] = VOL[1].low; //电压mV下限
tabdata.item0_page0_cup = CUR.up; //电流上限
tabdata.item0_page0_clow = CUR.low; //电流下限
tabdata.item0_page0_rup = RES.up; //电阻上限
tabdata.item0_page1_rlow = RES.low; //电阻下限
tabdata.item0_page1_fup = FRE.up; //频率上限
tabdata.item0_page1_flow = FRE.low; //频率下限
tabdata.item0_page1_TCup[0] = TC[0].up; //TCK上限
tabdata.item0_page1_TClow[0] = TC[0].low; //TCK下限
tabdata.item0_page1_TCup[1] = TC[1].up; //TCS上限
tabdata.item0_page1_TClow[1] = TC[1].low; //TCS下限
tabdata.item0_page1_TCup[2] = TC[2].up; //TCN上限
tabdata.item0_page1_TClow[2] = TC[2].low; //TCN下限
tabdata.item0_page1_TCup[3] = TC[3].up; //TCB上限
tabdata.item0_page1_TClow[3] = TC[3].low; //TCB下限
tabdata.item0_page1_TCup[4] = TC[4].up; //TCE上限
tabdata.item0_page1_TClow[4] = TC[4].low; //TCE下限
tabdata.item0_page1_TCup[5] = TC[5].up; //TCJ上限
tabdata.item0_page1_TClow[5] = TC[5].low; //TCJ下限
tabdata.item0_page1_TCup[6] = TC[6].up; //TCR上限
tabdata.item0_page1_TClow[6] = TC[6].low; //TCR下限
tabdata.item0_page1_TCup[7] = TC[7].up; //TCT上限
tabdata.item0_page1_TClow[7] = TC[7].low; //TCT下限
tabdata.item0_page2_RTDup = RTD.up; //RTD上限
tabdata.item0_page2_RTDlow = RTD.low; //RTD下限
tabdata.item1_page0_sample_interval = 1500;
tabdata.item1_page0_plot_num = 5;
tabdata.item1_page0_color_input = COLOR_YELLOW;
tabdata.item1_page0_color_output = COLOR_BLUE;
tabdata.item3_page0_language = MENU_SIMPLYFY_CHINESE;
//eeprom_datasave();
eeprom_datasave_changed();
eeprom_writedata(DEVICE_CHECK, 0xAA);
eeprom_writedata(DEVICE_CHECK + 8, 0xAA);
return 0;
}
else
{
return 1;
}
}