通过I2C,读取存储在AT24C02的数据,"TotalArea "部分数据异常问题
问题描述:
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 = {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; /* 上电读取AT24C02的存储数据 */
Parament_Data1 = TmpBuffer;/* 上电读取AT24C02的存储数据 */
WorkWidthL = (((uint16)Parament_Data0) |((uint16)(Parament_Data1<<8)));
/* Step2, read C Parament */
Parament_Data0 = TmpBuffer; /* 上电读取AT24C02的存储数据 */
Parament_Data1 = TmpBuffer; /* 上电读取AT24C02的存储数据 */
PulC = (((uint16)Parament_Data0) |((uint16)(Parament_Data1<<8)));
/* Step3, read R Parament */
VHalamIntvlR= TmpBuffer; /* 上电读取AT24C02的存储数据 */
/* Step4, read S Parament */
Sensity= TmpBuffer; /* 上电读取AT24C02的存储数据 */
/* Step5, read PartArea Parament */
I2c_AT24C02ReadNbyte(Addres_PartAreaParament,TmpBuffer,4);
Parament_Data0 = TmpBuffer; /* 上电读取AT24C02的存储数据 */
Parament_Data1 = TmpBuffer;/* 上电读取AT24C02的存储数据 */
Parament_Data2 = TmpBuffer;/* 上电读取AT24C02的存储数据 */
Parament_Data3 = TmpBuffer; /* 上电读取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;/* 上电读取AT24C02的存储数据 */
Parament_Data1 = TmpBuffer;/* 上电读取AT24C02的存储数据 */
Parament_Data2 = TmpBuffer;/* 上电读取AT24C02的存储数据 */
Parament_Data3 = TmpBuffer; /* 上电读取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; /* 上电读取AT24C02的存储数据 */
Parament_Data1 = TmpBuffer; /* 上电读取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(); //发送停止命令
}
下面是资源使用情况:
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 下述是全局变量的定义:
volatile uint32 edata PartArea = 0; /*PartArea, need to store*/
volatile uint32 edata TotalArea = 0; /*TotalArea, need to store*/
/* AT24C024*/
//存储地址的分配:
#define Addres_PartAreaParament 0x10
#define Addres_TotalAreaParament0x20
#define Addres_WorkTimeParament 0x30
第28个演示程序
从这下载 STC8H实验箱的演示程序
神农鼎 发表于 2023-1-2 20:26
第28个演示程序
从这下载 STC8H实验箱的演示程序
谢谢支持。
我用的芯片是:STC32G12K128。也是借鉴演示的程序。
实际上电,读取的那个32位的数据就是异常,没有排除出哪里导致的。 原理图,程序,先全部照搬 神农鼎 发表于 2023-1-2 20:37
原理图,程序,先全部照搬
我用同样的芯片用软件I2C读取AT24C256也会有同样的问题,只能读取不能写入,WP脚位和原理图都对应的,用同样的程序放到stc15里面就可以正常读写。 用同样的程序放到stc15里面就可以正常读写。
===STC15比STC8/STC32要慢,可能你加的延时不够,另外一定要加上拉电阻, 或打开内部的4K 上拉电阻
TotalArea是什么值?放在哪里的?
页:
[1]
2