TI中文支持网
TI专业的中文技术问题搜集分享网站

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

#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

Star Xu:

您好,建议在出现错误以后用BQstudio看一下参数是否正常,如果正常就说明是代码的问题。

fei Li:

回复 Star Xu:

没有那个软件设备, 我使用预判和多次读取数据取出现次数最多的方式解决的,出现错误是偶尔, 我用逻辑分析仪器分析,就是偶尔出现那种情况

Star Xu:

回复 fei Li:

非常抱歉没有遇到类似问题,您可以参考下面的帖子,希望对您有所帮助。 e2e.ti.com/…/2441262

赞(0)
未经允许不得转载:TI中文支持网 » 针对bq20z95可以正确读取电量和温度在显示屏上显示,但长时间读 ,读几分钟后就会出现读错,也就无应答,后面时间可正确读取,但显示屏上一直是错误的数据,,如果把数据通过串口发送也是错误的,是什么原因求解
分享到: 更多 (0)