找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2326|回复: 6
收起左侧

求助:STC12C5A60S2单片机的片内EEPROM为何写不进去?

[复制链接]
ID:356610 发表于 2020-8-4 16:22 | 显示全部楼层 |阅读模式
STC12C5A60S2的片内EEPROM卡了一周了,请高手帮忙看下,感激不尽!
为了方便阅读,我只把关于EEPROM的代码贴出来。

#define CMD_READ                                1
#define CMD_PROGRAM                        2
#define CMD_ERASE                                3
#define ENABLE_IAP                                0x83

#define IAP_ADDRESS_1                         0x0000

void Initialization()
{
        DehumiTimeSet = IAP_Read_Byte(IAP_ADDRESS_1);
        if(DehumiTimeSet > 99 || DehumiTimeSet < 1)
        {
                DehumiTimeSet = 48;
        }

        DehumiTimeSetBak = DehumiTimeSet;
}


void main()
{
        Initialization();
        while(1)

       {
                if(bit_Timer100ms)                //中断2ms,计数器累加50次就是100ms
                {
                        bit_Timer100ms = 0;
                        Display();
                        KeyDispose();

                }
        }
}


void KeyDispose()
{
        if(Key_Value == 0)                        //60秒内无按键按下则显示DHT11温湿度
        {
                if(bit_NoKeyPress)
                {
                        NoKeyPressDelayCnt++;
                        if(NoKeyPressDelayCnt >= 600)
                        {
                                NoKeyPressDelayCnt = 0;
                                
                                if(DehumiTimeSetBak != DehumiTimeSet)
                                {
                                        EEPROM_WriteDehumiTimeSet();
                                        DehumiTimeSetBak = DehumiTimeSet;
                                }

                        }
                 }
        }
}

void EEPROM_WriteDehumiTimeSet()                    //先擦除扇区,再写入数据
{
        IAP_Erase_Sector(IAP_ADDRESS_1);
        IAP_Write_Byte(IAP_ADDRESS_1,DehumiTimeSet);        
}


void IAP_Idle()
{
        IAP_CONTR = 0;
        IAP_CMD = 0;
        IAP_TRIG = 0;
        IAP_ADDRH = 0x80;
        IAP_ADDRL = 0;
}

unsigned char IAP_Read_Byte(unsigned int addr)
{
        unsigned char dat;
        
        IAP_CONTR = ENABLE_IAP;                                //允许IAP功能,Clock<12MHz
        IAP_CONTR = CMD_READ;                                        //读
        IAP_ADDRL = addr;
        IAP_ADDRH = addr >> 8;
        IAP_TRIG = 0x5a;
        IAP_TRIG = 0xa5;
        _nop_();_nop_();_nop_();
        dat = IAP_DATA;
        IAP_Idle();
        
        return dat;
}

void IAP_Write_Byte(unsigned int addr,unsigned char dat)
{
        IAP_CONTR = ENABLE_IAP;                                //允许IAP功能
        IAP_CMD = CMD_PROGRAM;                                //写
        IAP_ADDRL = addr;
        IAP_ADDRH = addr >> 8;
        IAP_DATA = dat;
        IAP_TRIG = 0x5a;
        IAP_TRIG = 0xa5;
        _nop_();_nop_();_nop_();
        IAP_Idle();
}

void IAP_Erase_Sector(unsigned int addr)
{
        IAP_CONTR = ENABLE_IAP;                                //允许IAP功能
        IAP_CMD = CMD_ERASE;                                        //擦除
        IAP_ADDRL = addr;
        IAP_ADDRH = addr >> 8;
        IAP_TRIG = 0x5a;
        IAP_TRIG = 0xa5;
        _nop_();_nop_();_nop_();
        IAP_Idle();
}

回复

使用道具 举报

ID:636538 发表于 2020-8-4 16:31 | 显示全部楼层
首先你想写入进入参数,那这个函数EEPROM_WriteDehumiTimeSet(形参)要有个形参吧,要不然你想写入的东西,怎么放入这个EEPROM
回复

使用道具 举报

ID:356610 发表于 2020-8-4 16:39 | 显示全部楼层
SKYLAR123 发表于 2020-8-4 16:31
首先你想写入进入参数,那这个函数EEPROM_WriteDehumiTimeSet(形参)要有个形参吧,要不然你想写入的东西, ...

void EEPROM_WriteDehumiTimeSet()                    //先擦除扇区,再写入数据
{
        IAP_Erase_Sector(IAP_ADDRESS_1);
        IAP_Write_Byte(IAP_ADDRESS_1,DehumiTimeSet);        
}

DehumiTimeSet就是要写入的数据(1个字节)。
回复

使用道具 举报

ID:636538 发表于 2020-8-4 17:34 | 显示全部楼层
zsj1984 发表于 2020-8-4 16:39
void EEPROM_WriteDehumiTimeSet()                    //先擦除扇区,再写入数据
{
        IAP_Erase ...

哦,那你这个DehumiTimeSet是全局变量是吗,
回复

使用道具 举报

ID:636538 发表于 2020-8-4 17:47 | 显示全部楼层
zsj1984 发表于 2020-8-4 16:39
void EEPROM_WriteDehumiTimeSet()                    //先擦除扇区,再写入数据
{
        IAP_Erase ...

我意识到你是STC12C5A60S2,你有没有看官方的数据手册,建议你参考官方测试用例,有写这个EEPROM至少我看到的延时是一个_nop_();
回复

使用道具 举报

ID:804115 发表于 2020-8-4 17:51 | 显示全部楼层
建议在EEPROM_WriteDehumiTimeSet();处加入调试信息,看看到底有么有走到这里,可以用uart打印log也可以通过屏disp一些信息。
回复

使用道具 举报

ID:213173 发表于 2020-8-4 20:18 | 显示全部楼层
STC单片机EEPROM读写其实还是很简单的。单以这段程序片段无法判断问题所在,怀疑KeyDispose()里4个if条件不能全部满足。比如NoKeyPressDelayCnt的数据类型等等。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表