现象
这是一个通过I2C读取LM75A温度的程序,当我在读取完温度,直接printf输出,程序可以正常运行。然而我将读取的温度赋值给全局变量时,却卡死程序。
解决办法
u16 Lm75a_Get(u8 devAddr){
u8 raw_data[2]={0};
u16 v=0;
TempDataStruct my_ir;
my_ir.Sign = ' ';
if(Single_ReadI2C2(devAddr,0x00,raw_data,2))
{
my_ir.TempAll = ((raw_data[0] << 8) | raw_data[1]);
if ((raw_data[0] & 0x80) != 0) //如果D10不等于0,则温度为负
{
my_ir.TempAll = ~(my_ir.TempAll) + 1;
my_ir.Sign = '-';
}
//低5位数据无效移除
my_ir.TempAll >>= 5;
my_ir.TempAll = my_ir.TempAll * 0.125 * 10 + 0.5;
//提取各位部分数据
my_ir.Hun = my_ir.TempAll * 10;//温度乘以100
v=my_ir.TempAll * 10;
my_ir.Tens = (my_ir.TempAll / 100) % 10;
my_ir.Unit = (my_ir.TempAll / 10) % 10;
my_ir.Decimals = my_ir.TempAll % 10;
}else{
my_ir.TempAll =9999;
v=9999;
}
return v;
}
由于代码时拷贝的另一个I2C读取温度的程序,Single_ReadI2C2(devAddr,0x00,raw_data,2)这句代码中,最后一个2表示长度,拷贝过来时,是7。忘了修改了,导致内存紊乱。
改回2就解决了。