sggt/App/APP_WU/Src/eeprom_spi.c

568 lines
15 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.

/*
* @Author: wujunchao wujunchao@wuxismart.com
* @Date: 2025-03-17 14:38:34
* @LastEditors: wujunchao wujunchao@wuxismart.com
* @LastEditTime: 2025-04-01 15:45:37
* @FilePath: \signal_generator\App\APP_WU\Src\eeprom_spi.c
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
#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;
}
wu_delay_us(5); // 空等待
EEPROM_SCLK_H; //CPHA=0
wu_delay_us(5); // 空等待
}
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;
wu_delay_us(5); // 空等待
EEPROM_SCLK_H;
wu_delay_us(5); // 空等待
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;
wu_delay_us(5); // 空等待
if(EEPROM_MISO)
{
data |= 0x01;
}
EEPROM_SCLK_L;
wu_delay_us(5); // 空等待
}
return(data);
}
uint8_t eeprom_wrt_error_flag = 0;
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)
{
eeprom_wrt_error_flag = 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_rd_error_flag = 0;
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)
{
eeprom_rd_error_flag = 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(void)
{
uint8_t temp_h = 0, temp_l = 0;
//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);
//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);
//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);
//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);
//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);
//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);
//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);
//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);
//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);
//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);
//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);
//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);
//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);
}
//开机上电后读取参数
void eeprom_dataread(void)
{
uint8_t temp_h = 0, temp_l = 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;
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;
//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;
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;
//CUR
//temp_h = eeprom_readdata(CUR_UP_ADDR);
temp_l = eeprom_readdata(CUR_UP_ADDR + 8);
tabdata.item0_page0_cup = temp_l;
//temp_h = eeprom_readdata(CUR_LOW_ADDR);
temp_l = eeprom_readdata(CUR_LOW_ADDR + 8);
tabdata.item0_page0_clow = temp_l;
//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;
temp_h = eeprom_readdata(RES_LOW_ADDR);
temp_l = eeprom_readdata(RES_LOW_ADDR + 8);
tabdata.item0_page1_rlow = ( temp_h << 8 ) + temp_l;
//FRE
//temp_h = eeprom_readdata(FRE_UP_ADDR);
temp_l = eeprom_readdata(FRE_UP_ADDR + 8);
tabdata.item0_page1_fup = temp_l;
//temp_h = eeprom_readdata(FRE_LOW_ADDR);
temp_l = eeprom_readdata(FRE_LOW_ADDR + 8);
tabdata.item0_page1_flow = temp_l;
//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;
//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;
temp_h = eeprom_readdata(RTD_LOW_ADDR);
temp_l = eeprom_readdata(RTD_LOW_ADDR + 8);
tabdata.item0_page2_RTDlow = ( temp_h << 8 ) + temp_l;
}
//判断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下限
eeprom_datasave();
eeprom_writedata(DEVICE_CHECK, 0xAA);
eeprom_writedata(DEVICE_CHECK + 8, 0xAA);
return 0;
}
else
{
return 1;
}
}