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

【求助】基于C51的INA226 IIC数据通信中遇到的问题

最近想用INA226做个电流电压测量的工具监视铅酸电池充放电状态,遇到点问题,情况是这样的
在主函数体中只是先运行

INA226_WriteReg(INA226_CONFIG,0x4127);

然后

tmp=INA226_ReadReg(INA226_BUS);

使用串口输出tmp变量时候一直显示输出为零,搞不清是什么情况,恳请各位老师帮帮忙指导一下,不胜感激

以下是INA226.c 文件代码:

#define INA226_W	0x80
#define INA226_R	0x81

#define INA226_CONFIG	0x00
#define INA226_SHUNT	0x01
#define INA226_BUS		0x02
#define INA226_POWEER	0x03
#define INA226_CURRENT	0x04
#define INA226_CAL		0x05
#define INA226_MAEN		0x06
#define INA226_AIERT	0x07
#define INA226_DIEID	0xFF

sbit SCL=P0^0;
sbit SDA=P0^1;
void Delay1us();
void INA226_Start();
void INA226_Stop();
void INA226_GetACK();
void INA226_WriteByte(unsigned char tmp);
void INA226_SendACK();
unsigned char INA226_ReadByte();
void INA226_SetPoint(unsigned char addr);
void INA226_WriteReg(unsigned char addr,unsigned int dat);
unsigned int INA226_ReadReg(unsigned char addr);



void Delay1us()		//@33.1776MHz
{
	unsigned char i;

	_nop_();
	_nop_();
	_nop_();
	i = 5;
	while (--i);
}

void INA226_Start(){
	SDA=1;
	Delay1us();
	SCL=1;
	Delay1us();
	SDA=0;
	Delay1us();
}
void INA226_Stop(){
	Delay1us();Delay1us();
	SCL=1;
	Delay1us();
	SDA=0;
	Delay1us();
	SDA=1;
	Delay1us();
} 
void INA226_GetACK(){
	Delay1us();
	SCL=0;
	SDA=1;
	Delay1us();Delay1us();
	SCL=1;
	while(SDA==1);
	Delay1us();
	SCL=0;
}
void INA226_WriteByte(unsigned char tmp){
	unsigned char i;
	for(i=0;i<8;i++){
		Delay1us();
		SCL=0;
		SDA=(tmp<<i)&0x80;
		Delay1us();Delay1us();
		SCL=1;	
	}
	INA226_GetACK();	
}
void INA226_SendACK(){
	Delay1us();
	SCL=0;
	SDA=0;
	Delay1us();Delay1us();
	SCL=1;
	Delay1us();
	SCL=0;
}
unsigned char INA226_ReadByte(){
	unsigned char i,tmp; 
	SDA=1;
	for(i=0;i<8;i++){
		Delay1us();
		SCL=0;
		tmp<<=1;
		Delay1us();Delay1us();
		SCL=1;
		if(SDA)tmp|=0x01;
	}
	INA226_SendACK();	
}

void INA226_SetPoint(unsigned char addr){
	INA226_Start();
	INA226_WriteByte(INA226_W);	
	INA226_WriteByte(addr);		
}
void INA226_WriteReg(unsigned char addr,unsigned int dat){
	INA226_SetPoint(addr);
	INA226_WriteByte(dat>>8);
	INA226_WriteByte(dat&0x00ff);
	INA226_Stop();		
}
unsigned int INA226_ReadReg(unsigned char addr){
	unsigned int tmp;
	INA226_SetPoint(addr);
	INA226_Stop();
	INA226_Start();
	INA226_WriteByte(INA226_R);
	tmp=INA226_ReadByte();
	tmp<<=8;
	tmp|=INA226_ReadByte();
	INA226_Stop();
	return tmp;
}


user151383853:

好好地看了一下你的程序, 从时序上看, 看不出问题来.

能否检查一下硬件, 或者用示波器看看通信波形有没有问题

Anson zhang:

回复 user151383853:

可是我在发送字节后都会等待器件的ACK返回,在函数里

void INA226_GetACK(){Delay1us();SCL=0;SDA=1;Delay1us();Delay1us();SCL=1;while(SDA==1);Delay1us();SCL=0;
}

如果没有ACK返回会进入死循环的啊,之前也有因为时序问题进入死循环是没有输出的,但是问题来了,器件有返回,而且输出全零,说明通信应该没问题,读配置寄存器的值输出也是全零,就不知道为什么了

Carter Liu:

回复 Anson zhang:

你得先看一下从器件是否有返回数据,使用示波器看一下,看看有没有信号传到单片机SDA线上,这个确定了再走下一步。

根据你的GetACK看是有 ACK信号的,你再示波器看一下ACK后是否真的全是0

赞(0)
未经允许不得转载:TI中文支持网 » 【求助】基于C51的INA226 IIC数据通信中遇到的问题
分享到: 更多 (0)