This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

针对bq20z95可以正确读取电量和温度在显示屏上显示,但长时间读 ,读几分钟后就会出现读错,也就无应答,后面时间可正确读取,但显示屏上一直是错误的数据,,如果把数据通过串口发送也是错误的,是什么原因求解

Other Parts Discussed in Thread: BQSTUDIO

#include "myiic.h"
#include "delay.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include <string.h>
#include "lcd.h"


void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE ); //ʹÄÜGPIOBʱÖÓ

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); 
}


void IIC_Start(void)
{
SDA_OUT(); //sdaÏßÊä³ö
IIC_SDA=1;
IIC_SCL=1;
delay_us(4);
IIC_SDA=0;
delay_us(4);
IIC_SCL=0;

}


void IIC_Stop(void)
{
SDA_OUT();
IIC_SCL=0;
IIC_SDA=0;
delay_us(4);
IIC_SCL=1;
IIC_SDA=1;
delay_us(4);

}


u8 IIC_Wait_Ack(void)
{
u16 ucErrTime=0;
SDA_IN(); 
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;
return 0;
}


void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}


void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}


void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL=0;

for(t=0;t<8;t++)
{
if(((txd&0x80)>>7)==0x01)
{
IIC_SDA=1;
}
else
{
IIC_SDA=0;
}
txd<<=1;
delay_us(15);
IIC_SCL=1;
delay_us(16);
IIC_SCL=0;
delay_us(1);
}
}

u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();
for(i=0;i<8;i++ )
{
IIC_SCL=0;
delay_us(15);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)receive++;
delay_us(16);
}
if (!ack)
IIC_NAck();//·¢ËÍnACK
else
IIC_Ack(); //·¢ËÍACK
return receive;
}



int IIC_read_data()
{

uint8_t buf1[2]={0};
static int temperature=0;
int date=0;

IIC_Start();
IIC_Send_Byte(0x16);
IIC_Wait_Ack();

IIC_Send_Byte(0x08);
delay_us(50);
IIC_Wait_Ack();

delay_ms(1);
IIC_Start();
IIC_Send_Byte(0x17);
IIC_Wait_Ack();

delay_us(50);//50
buf1[0]=IIC_Read_Byte(1);
delay_us(50);//50

buf1[1]=IIC_Read_Byte(0);
delay_us(30);
IIC_Stop();

date=((buf1[1]<<8)|buf1[0]);
temperature=(int)(date*0.1-274.15+0.5);
return temperature;

}


u8 IIC_read_data1(void)
{
uint8_t recvdate;
static int date;
IIC_Start();
IIC_Send_Byte(0x16);
IIC_Wait_Ack();//µÈ´ýÓ¦´ð

IIC_Send_Byte(0x0d);
delay_us(50);//50
IIC_Wait_Ack();

delay_ms(1);
IIC_Start();
IIC_Send_Byte(0x17);
IIC_Wait_Ack();

delay_us(80);//50
recvdate=IIC_Read_Byte(0);
delay_us(30);//30
IIC_Stop();

date=recvdate;
return date;
}

主函数while(1)中的

temp2=IIC_read_data();//¶Áµ½Î¶È
delay_ms(50);//50
elec=IIC_read_data1();//¶ÁµçÁ¿

sprintf((char*)lcd_id,"LCD ID:%d",temp2);
Convert_int_to_char(temp2, temp_char);
sprintf((char*)lcd_id1,"LCD ID1:%c",temp_char[0]);
sprintf((char*)lcd_id2,"LCD ID2:%c",temp_char[1]);

sprintf((char*)lcd_id3,"LCD ID3:%d",elec);
Convert_int_to_char(elec, temp_char1);
sprintf((char*)lcd_id4,"LCD ID4:%c",temp_char1[0]);
sprintf((char*)lcd_id5,"LCD ID5:%c",temp_char1[1]);

LCD_ShowString(30,110,200,16,16,lcd_id); //ÏÔʾLCD ID
LCD_ShowString(30,150,200,16,16,lcd_id1);
LCD_ShowString(30,180,200,16,16,lcd_id2);
LCD_ShowString(30,210,200,16,16,lcd_id3);
LCD_ShowString(30,240,200,16,16,lcd_id4);
LCD_ShowString(30,270,200,16,16,lcd_id5);

app.yinxiang.com/.../a662ff21-85b1-4fee-9c2d-c792b7d1d456