You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
239 lines
7.7 KiB
239 lines
7.7 KiB
4 years ago
|
////////////////////////////////////////////////////////////////////////////
|
||
|
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
|
||
|
///-------------------------------------------------------------------------
|
||
|
/// @file msp_eeprom.c
|
||
|
/// @brief msp @ driver config
|
||
|
///-------------------------------------------------------------------------
|
||
|
/// @version 1.0
|
||
|
/// @author CC
|
||
|
/// @date 20190106
|
||
|
/// @note cc_AS_stc02 由stc-isp v6.0860
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
4 months ago
|
///cc 2023/04/07--8:44:38
|
||
|
/*
|
||
|
EEPROM 的写操作只能将字节中的 1 写为 0,当需要将字节中的 0 写为 1,则必须执行扇区 擦除操作。
|
||
|
EEPROM 的读/写操作是以 1 字节为单位进行,而 EEPROM 擦除操作是以 1 扇区(512 字节) 为单位进行,
|
||
|
在执行擦除操作时,如果目标扇区中有需要保留的数据,则必须预先将这些数据读取到 RAM 中暂存,
|
||
|
待擦除完成后再将保存的数据和需要更新的数据一起再写回
|
||
|
EEPROM Write operation can only write 1 in the byte as 0, when you need to write 0 in the byte as 1,
|
||
|
you must be sector erased. EEPROM Read / write operation is conducted in 1 byte,
|
||
|
while EEPROM, erasure operation is conducted in 1 sector (512 bytes). During the wipe operation,
|
||
|
if the data in the target sector, the data must be read in the RAM in advance,
|
||
|
and the saved data will be written back together with the data to be updated
|
||
|
|
||
|
fixme:注意时钟和flash 相关 同时关注掉电和容错
|
||
|
|
||
|
*/
|
||
|
|
||
|
#include "msp_eeprom.h"
|
||
|
|
||
|
#include "debug_drv.h"
|
||
4 years ago
|
|
||
|
#if(TYPE_MCU == TYPE_MCU_STC_8A || TYPE_MCU == TYPE_MCU_STC_8F)
|
||
4 months ago
|
xxx
|
||
4 years ago
|
#define WT_30M 0x80
|
||
|
#define WT_24M 0x81
|
||
|
#define WT_20M 0x82
|
||
|
#define WT_12M 0x83
|
||
|
#define WT_6M 0x84
|
||
|
#define WT_3M 0x85
|
||
|
#define WT_2M 0x86
|
||
|
#define WT_1M 0x87
|
||
|
|
||
4 months ago
|
//sdfasdfasdf
|
||
4 years ago
|
void L0_Iap_Idle()
|
||
|
{
|
||
|
IAP_CONTR = 0; //关闭IAP功能
|
||
|
IAP_CMD = 0; //清除命令寄存器
|
||
|
IAP_TRIG = 0; //清除触发寄存器
|
||
|
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
|
||
|
IAP_ADDRL = 0;
|
||
|
}
|
||
|
|
||
|
char L0_Iap_Read(vU16 addr)
|
||
|
{
|
||
|
char dat;
|
||
|
|
||
|
IAP_CONTR = WT_12M; //使能IAP
|
||
|
IAP_CMD = 1; //设置IAP读命令
|
||
|
IAP_ADDRL = addr; //设置IAP低地址
|
||
|
IAP_ADDRH = addr >> 8; //设置IAP高地址
|
||
|
IAP_TRIG = 0x5a; //写触发命令(0x5a)
|
||
|
IAP_TRIG = 0xa5; //写触发命令(0xa5)
|
||
|
_nop_();
|
||
|
dat = IAP_DATA; //读IAP数据
|
||
|
L0_Iap_Idle(); //关闭IAP功能
|
||
|
|
||
|
return dat;
|
||
|
}
|
||
|
|
||
|
void L0_Iap_Program(vU16 addr, char dat)
|
||
|
{
|
||
|
IAP_CONTR = WT_12M; //使能IAP
|
||
|
IAP_CMD = 2; //设置IAP写命令
|
||
|
IAP_ADDRL = addr; //设置IAP低地址
|
||
|
IAP_ADDRH = addr >> 8; //设置IAP高地址
|
||
|
IAP_DATA = dat; //写IAP数据
|
||
|
IAP_TRIG = 0x5a; //写触发命令(0x5a)
|
||
|
IAP_TRIG = 0xa5; //写触发命令(0xa5)
|
||
|
_nop_();
|
||
|
L0_Iap_Idle(); //关闭IAP功能
|
||
|
}
|
||
|
|
||
|
///每个扇区512字节
|
||
|
///指定地址可以为当前扇区内的任意地址,都会完整擦除当前扇区
|
||
|
void L0_Iap_Erase(vU16 addr)
|
||
|
{
|
||
|
IAP_CONTR = WT_12M; //使能IAP
|
||
|
IAP_CMD = 3; //设置IAP擦除命令
|
||
|
IAP_ADDRL = addr; //设置IAP低地址
|
||
|
IAP_ADDRH = addr >> 8; //设置IAP高地址
|
||
|
IAP_TRIG = 0x5a; //写触发命令(0x5a)
|
||
|
IAP_TRIG = 0xa5; //写触发命令(0xa5)
|
||
|
_nop_(); //
|
||
|
L0_Iap_Idle(); //关闭IAP功能
|
||
|
}
|
||
|
|
||
|
#elif (TYPE_MCU == TYPE_MCU_STC_8G || TYPE_MCU == TYPE_MCU_STC_8H)
|
||
|
void L0_Iap_Idle()
|
||
|
{
|
||
|
IAP_CONTR = 0; //关闭IAP功能
|
||
|
IAP_CMD = 0; //清除命令寄存器
|
||
|
IAP_TRIG = 0; //清除触发寄存器
|
||
|
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
|
||
|
IAP_ADDRL = 0;
|
||
|
}
|
||
|
|
||
|
char L0_Iap_Read(vU16 addr)
|
||
|
{
|
||
|
char dat;
|
||
|
|
||
|
IAP_CONTR = 0x80; //使能IAP
|
||
|
IAP_TPS = 12;
|
||
|
IAP_CMD = 1; //设置IAP读命令
|
||
|
IAP_ADDRL = addr; //设置IAP低地址
|
||
|
IAP_ADDRH = addr >> 8; //设置IAP高地址
|
||
|
IAP_TRIG = 0x5a; //写触发命令(0x5a)
|
||
|
IAP_TRIG = 0xa5; //写触发命令(0xa5)
|
||
|
_nop_();
|
||
|
dat = IAP_DATA; //读IAP数据
|
||
|
L0_Iap_Idle(); //关闭IAP功能
|
||
|
|
||
|
return dat;
|
||
|
}
|
||
|
|
||
|
void L0_Iap_Program(vU16 addr, char dat)
|
||
|
{
|
||
|
IAP_CONTR = 0x80; //使能IAP
|
||
|
IAP_TPS = 12; //设置擦除等待参数 12MHz
|
||
|
IAP_CMD = 2; //设置IAP写命令
|
||
|
IAP_ADDRL = addr; //设置IAP低地址
|
||
|
IAP_ADDRH = addr >> 8; //设置IAP高地址
|
||
|
IAP_DATA = dat; //写IAP数据
|
||
|
IAP_TRIG = 0x5a; //写触发命令(0x5a)
|
||
|
IAP_TRIG = 0xa5; //写触发命令(0xa5)
|
||
|
_nop_();
|
||
|
L0_Iap_Idle(); //关闭IAP功能
|
||
|
}
|
||
|
|
||
|
///每个扇区512字节
|
||
|
///指定地址可以为当前扇区内的任意地址,都会完整擦除当前扇区
|
||
|
void L0_Iap_Erase(vU16 addr)
|
||
|
{
|
||
|
IAP_CONTR = 0x80; //使能IAP
|
||
|
IAP_TPS = 12; //设置擦除等待参数 12MHz
|
||
|
IAP_CMD = 3; //设置IAP擦除命令
|
||
|
IAP_ADDRL = addr; //设置IAP低地址
|
||
|
IAP_ADDRH = addr >> 8; //设置IAP高地址
|
||
|
IAP_TRIG = 0x5a; //写触发命令(0x5a)
|
||
|
IAP_TRIG = 0xa5; //写触发命令(0xa5)
|
||
|
_nop_(); //
|
||
|
L0_Iap_Idle(); //关闭IAP功能
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
|
||
|
void L0_Iap_Program_array(vU16 addr,U8 *buf,U8 len)
|
||
|
{
|
||
|
U8 i = 0;
|
||
4 months ago
|
L0_Iap_Erase(addr);/////fixme: 需要和addr配合好 一次就擦除512字节
|
||
4 years ago
|
for(i=0;i<len;i++)
|
||
|
{
|
||
|
L0_Iap_Program(addr + i,buf[i]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void L0_Iap_Read_array(vU16 addr,U8 *buf,U8 len)
|
||
|
{
|
||
|
U8 i = 0;
|
||
4 months ago
|
for(i = 0;i < len;i ++)
|
||
4 years ago
|
{
|
||
|
buf[i] = L0_Iap_Read(addr + i);
|
||
|
}
|
||
4 months ago
|
/// L1_uartD_uchexArray(buf,len);
|
||
4 years ago
|
}
|
||
|
|
||
4 months ago
|
/****************************************************
|
||
4 years ago
|
|
||
4 months ago
|
U_F16 uf_ee_add;
|
||
4 years ago
|
|
||
4 months ago
|
//// AX CMD R2 R3 R4
|
||
|
/// Ae 01 01 03 04
|
||
|
///L3_GC032A_fun
|
||
|
// bsp/bsp_debug
|
||
|
void L1_Iap_main(void)
|
||
4 years ago
|
{
|
||
|
|
||
4 months ago
|
int i;char m;
|
||
|
L0_Iap_Erase(0);
|
||
|
|
||
|
|
||
|
for(i = 0;i <100; i++)
|
||
4 years ago
|
{
|
||
4 months ago
|
L0_Iap_Program(i,i);
|
||
4 years ago
|
}
|
||
4 months ago
|
for(i = 0;i <200; i++)
|
||
4 years ago
|
{
|
||
4 months ago
|
m = L0_Iap_Read(i);
|
||
|
L0_uart0_uc(m);
|
||
|
}
|
||
|
|
||
|
/// while(1);
|
||
|
|
||
|
|
||
|
|
||
4 years ago
|
}
|
||
|
|
||
4 months ago
|
///
|
||
|
void L3_eeprom_fun(U8 *pPara)
|
||
4 years ago
|
{
|
||
4 months ago
|
TS_P_debug *p = pPara;
|
||
|
switch(p->cmd)
|
||
|
{
|
||
|
//Ae 03 03 04 00
|
||
|
//xx 03 R2 R3 xx
|
||
|
case 4:
|
||
|
L0_Iap_Erase(uf_ee_add.us);
|
||
|
break;
|
||
|
case 5:
|
||
|
L0_Iap_Program(uf_ee_add.us,p->R2);
|
||
|
break;
|
||
|
case 6:
|
||
|
L0_uart0_uc(L0_Iap_Read(uf_ee_add.us));
|
||
|
break;
|
||
|
case 7:///选择地址
|
||
|
uf_ee_add.BYTE2.H = p->R2; //h
|
||
|
uf_ee_add.BYTE2.L = p->R3; //L
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
};
|
||
4 years ago
|
}
|
||
|
|
||
|
|
||
4 months ago
|
****************************************************/
|
||
|
|
||
|
|
||
|
|