请选择 进入手机版 | 继续访问电脑版

 找回密码
 立即注册
查看: 2791|回复: 11

通过I2C,读取存储在AT24C02的数据,"TotalArea "部分数据异常问题

[复制链接]

该用户从未签到

1

主题

4

回帖

15

积分

新手上路

积分
15
发表于 2023-1-2 19:56:38 | 显示全部楼层 |阅读模式


问题描述:
1,每次上电,读取到的TotalArea的值,都是异常 ,很多都是65536,但是,其他值都是对的。
2,读取其他值都是正常的。


源代码如下:


void ReadParament_FromAT24C02(void)
{
        volatile uint8 Parament_Data0 = 0;
        volatile uint8 Parament_Data1 = 0;
        volatile uint8 Parament_Data2 = 0;
        volatile uint8 Parament_Data3 = 0;
        volatile uint8 TmpBuffer[6] = {0};

        volatile uint32 Parament_Data0_uint32 = 0;
        volatile uint32 Parament_Data1_uint32 = 0;       
        volatile uint32 Parament_Data2_uint32 = 0;       
        volatile uint32 Parament_Data3_uint32 = 0;       
               
       
        I2c_AT24C02ReadNbyte(0x01,TmpBuffer,6);
        /* Step1, read L Parament   */
        Parament_Data0 = TmpBuffer[0]; /* 上电读取AT24C02的存储数据 */
        Parament_Data1 = TmpBuffer[1];/* 上电读取AT24C02的存储数据 */
        WorkWidthL = (((uint16)Parament_Data0) |((uint16)(Parament_Data1<<8)));       
       
        /* Step2, read C Parament   */
        Parament_Data0 = TmpBuffer[2]; /* 上电读取AT24C02的存储数据 */
        Parament_Data1 = TmpBuffer[3]; /* 上电读取AT24C02的存储数据 */
        PulC = (((uint16)Parament_Data0) |((uint16)(Parament_Data1<<8)));       
       
        /* Step3, read R Parament   */
        VHalamIntvlR  = TmpBuffer[4]; /* 上电读取AT24C02的存储数据 */       
       
        /* Step4, read S Parament   */
        Sensity  = TmpBuffer[5]; /* 上电读取AT24C02的存储数据 */
       
        /* Step5, read PartArea Parament   */       
        I2c_AT24C02ReadNbyte(Addres_PartAreaParament,TmpBuffer,4);
        Parament_Data0 = TmpBuffer[0]; /* 上电读取AT24C02的存储数据 */
        Parament_Data1 = TmpBuffer[1];/* 上电读取AT24C02的存储数据 */
         Parament_Data2 = TmpBuffer[2];/* 上电读取AT24C02的存储数据 */
        Parament_Data3 = TmpBuffer[3]; /* 上电读取AT24C02的存储数据 */
        PartArea = (((uint32)Parament_Data0) \
                                |((uint32)(Parament_Data1<<8))\
                                |((uint32)(Parament_Data2<<16))\
                                |((uint32)(Parament_Data3<<24)));
       
        /* Step6, read TotalArea Parament   */
        I2c_AT24C02ReadNbyte(Addres_TotalAreaParament,TmpBuffer,4);
        Parament_Data0 = TmpBuffer[0];/* 上电读取AT24C02的存储数据 */       
        Parament_Data1 = TmpBuffer[1];/* 上电读取AT24C02的存储数据 */
        Parament_Data2 = TmpBuffer[2];/* 上电读取AT24C02的存储数据 */
        Parament_Data3 = TmpBuffer[3]; /* 上电读取AT24C02的存储数据 */
        TotalArea = (((uint32)Parament_Data0) \
                                |((uint32)(Parament_Data1<<8))\
                                |((uint32)(Parament_Data2<<16))\
                                |((uint32)(Parament_Data3<<24)));               

                               
        /* Step7, read WorkTime Parament   */
        I2c_AT24C02ReadNbyte(Addres_WorkTimeParament,TmpBuffer,2);
       Parament_Data0 = TmpBuffer[0]; /* 上电读取AT24C02的存储数据 */
        Parament_Data1 = TmpBuffer[1]; /* 上电读取AT24C02的存储数据 */
        WorkTime = (((uint16)Parament_Data0) \
                                |((uint16)(Parament_Data1<<8)));
}


下面是I2C的驱动:

void I2c_AT24C02ReadNbyte(uint8 i2c_addr, uint8 *i2c_p, uint8 i2c_number)   /*  WordAddress,First Data Address,Byte lenth   */
{
       
    Start();                                //发送起始命令
    SendData(SLAW);                         //发送设备地址+写命令
    RecvACK();
    SendData(i2c_addr);                     //发送存储地址
    RecvACK();
    Start();                                //发送起始命令
    SendData(SLAR);                         //发送设备地址+读命令
    RecvACK();
    do
    {
        *i2c_p = RecvData();
        i2c_p++;
        if(i2c_number != 1) SendACK();      //send ACK
    }
    while(--i2c_number);
    SendNAK();                              //send no ACK       
    Stop();                                 //发送停止命令

}


回复 送花

使用道具 举报

该用户从未签到

1

主题

4

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2023-1-2 19:57:45 | 显示全部楼层
下面是资源使用情况:

Program Size: data=10.2 edata+hdata=529 xdata=0 const=651 code=8930
creating hex file from ".\Objects\Project_V1200_STC32G"...
".\Objects\Project_V1200_STC32G" - 0 Error(s), 14 Warning(s).
Build Time Elapsed:  00:00:02

该用户从未签到

1

主题

4

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2023-1-2 20:01:11 | 显示全部楼层
下述是全局变量的定义:

volatile uint32 edata PartArea = 0;     /*  PartArea, need to store  */
volatile uint32 edata TotalArea = 0;    /*  TotalArea, need to store  */

该用户从未签到

1

主题

4

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2023-1-2 20:02:46 | 显示全部楼层
/* AT24C024  */
//存储地址的分配:

#define Addres_PartAreaParament   0x10
#define Addres_TotalAreaParament  0x20
#define Addres_WorkTimeParament   0x30

该用户从未签到

538

主题

8734

回帖

1万

积分

管理员

积分
14193
发表于 2023-1-2 20:26:05 | 显示全部楼层
1.png

第28个演示程序
2.png
从这下载 STC8H实验箱的演示程序

该用户从未签到

1

主题

4

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2023-1-2 20:28:41 | 显示全部楼层
神农鼎 发表于 2023-1-2 20:26
第28个演示程序

从这下载 STC8H实验箱的演示程序

谢谢支持。
我用的芯片是:STC32G12K128。也是借鉴演示的程序。
实际上电,读取的那个32位的数据就是异常,没有排除出哪里导致的。

该用户从未签到

538

主题

8734

回帖

1万

积分

管理员

积分
14193
发表于 2023-1-2 20:37:05 | 显示全部楼层
原理图,程序,先全部照搬

该用户从未签到

0

主题

2

回帖

14

积分

新手上路

积分
14
发表于 2023-3-10 17:03:30 | 显示全部楼层
神农鼎 发表于 2023-1-2 20:37
原理图,程序,先全部照搬

我用同样的芯片用软件I2C读取AT24C256也会有同样的问题,只能读取不能写入,WP脚位和原理图都对应的,用同样的程序放到stc15里面就可以正常读写。

该用户从未签到

538

主题

8734

回帖

1万

积分

管理员

积分
14193
发表于 2023-3-10 17:45:16 | 显示全部楼层
用同样的程序放到stc15里面就可以正常读写。
===STC15比STC8/STC32要慢,可能你加的延时不够,另外一定要加上拉电阻, 或打开内部的4K 上拉电阻
1.png

该用户从未签到

45

主题

2748

回帖

6142

积分

超级版主

积分
6142
发表于 2023-3-10 23:21:42 | 显示全部楼层
TotalArea是什么值?放在哪里的?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-3-29 23:00 , Processed in 0.077848 second(s), 67 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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