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

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
//////////////////////////////////////////////////////////////////////////////
///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
fixmeflash
*/
#include "msp_eeprom.h"
#include "debug_drv.h"
4 years ago
#if(TYPE_MCU == TYPE_MCU_STC_8A || TYPE_MCU == TYPE_MCU_STC_8F)
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
//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;
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;
for(i = 0;i < len;i ++)
4 years ago
{
buf[i] = L0_Iap_Read(addr + i);
}
/// L1_uartD_uchexArray(buf,len);
4 years ago
}
/****************************************************
4 years ago
U_F16 uf_ee_add;
4 years 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
{
int i;char m;
L0_Iap_Erase(0);
for(i = 0;i <100; i++)
4 years ago
{
L0_Iap_Program(i,i);
4 years ago
}
for(i = 0;i <200; i++)
4 years ago
{
m = L0_Iap_Read(i);
L0_uart0_uc(m);
}
/// while(1);
4 years ago
}
///
void L3_eeprom_fun(U8 *pPara)
4 years 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
}
****************************************************/